C#+js 打印在线pdf
提供一个pdf在线浏览链接(如电子发票),点击不同按钮后唤起对应打印页面
思路1:前端使用iframe展示,点击调用windows.print()。
结果:不可行。存在跨域问题,且前端显示的pdf很小,调用print也无法显示;
思路2:前端传递给后端url,url请求下载到服务器后,文件转bitmap回传base64
结果:可行。有点麻烦,但是没有更好的解决办法了。
后端代码:
注意1:pdf文件下载到本地后,Nuget下载FreeSpire.Pdf,此插件免费,但是打印页数有限制,好像是10张。
参考文档 https://www.e-iceblue.cn/conversion/convert-pdf-to-doc-image-and-xps.html
注意2:如果下载的图片不清晰,要在SaveAsImage调整一下dpiX 和dpiY
1 public async Task<string> GetPDFFile(string urlNet,string einvoice) 2 { 3 var base64 = string.Empty; 4 var baseUri = ConfigurationManager.AppSettings["pdfUri"];//基址 5 var path = ConfigurationManager.AppSettings["pdfSavePath"];//保存到本地的图片地址 6 var completePdfFileName = $"{path}{einvoice}.pdf";//保存到本地的pdf的路径和文件名 7 8 var isExist = File.Exists(completePdfFileName); 9 if (!isExist) 10 { 11 var httpClient = new HttpClient{BaseAddress = new Uri(baseUri)}; 12 var request = new HttpRequestMessage{Method = new HttpMethod("GET")};//请求下载 13 request.Headers.Add("context-type", "application/pdf"); 14 request.RequestUri = new Uri($"{urlNet}"); 15 var response = await httpClient.SendAsync(request); 16 var stream = response.Content.ReadAsStreamAsync().Result; 17 using (var fs = new FileStream(completePdfFileName, FileMode.Create)) 18 { 19 var buffer = new byte[stream.Length]; 20 await stream.ReadAsync(buffer, 0, buffer.Length); 21 fs.Write(buffer, 0, buffer.Length); 22 } 23 24 var isExist2 = File.Exists(completePdfFileName); 25 if (isExist2) 26 { 27 logger.Info($"文件下载成功:{completePdfFileName}"); 28 //初始化PdfDocument实例 29 PdfDocument doc = new PdfDocument(); 30 //加载PDF文档 31 doc.LoadFromFile(completePdfFileName); 32 33 //将PDF页转换成bitmap图形 34 Image bmp = doc.SaveAsImage(0, 0, 900, 900);//调整分辨率 35 //将bitmap图形保存为png图片 36 string fileName = string.Format($"{einvoice}.jpg", 1); 37 bmp.Save(path + fileName, ImageFormat.Jpeg); 38 MemoryStream ms = new MemoryStream(); 39 bmp.Save(ms, ImageFormat.Jpeg);//转base64 40 byte[] arr = new byte[ms.Length]; 41 ms.Position = 0; 42 ms.Read(arr, 0, (int)ms.Length); 43 ms.Close(); 44 base64 = Convert.ToBase64String(arr); 45 46 } else 47 { 48 logger.Info($"文件下载失败:{completePdfFileName}"); 49 } 50 } else 51 { 52 //初始化PdfDocument实例 53 PdfDocument doc = new PdfDocument(); 54 //加载PDF文档 55 doc.LoadFromFile(completePdfFileName); 56 Image bmp = doc.SaveAsImage(0, 0, 900, 900); 57 //将bitmap图形保存为png图片 58 string fileName = string.Format($"{einvoice}.jpg", 1); 59 bmp.Save(path + fileName, ImageFormat.Jpeg); 60 MemoryStream ms = new MemoryStream(); 61 bmp.Save(ms, ImageFormat.Jpeg); 62 byte[] arr = new byte[ms.Length]; 63 ms.Position = 0; 64 ms.Read(arr, 0, (int)ms.Length); 65 ms.Close(); 66 base64 = Convert.ToBase64String(arr); 67 } 68 69 return base64; 70 }
前端调用:
获取base64,打开新窗口,显示到img中,同时调用print
1 var response = JSON.parse(result); 2 if (response.Success) { 3 4 var imgdata = "data:image/jpeg;base64," + response.details[0].InvoiceBase64; 5 6 if (imgdata) { 7 var win = window.open(imgdata, "_blank"); 8 win.document.write(` < image id = "img"style = "width:100%;height90%;"src = $ {imgdata} > `); 9 var img = win.document.querySelector("#img") as HTMLElement; 10 img.onload = () = >{//图片加载完成后调用print 11 win.focus(); 12 win.print(); 13 win.close();//点击打印或者取消后会自动关闭新页面 14 }; 15 } 16 }
最后效果

我佛真的不渡哈批

浙公网安备 33010602011771号