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 }

 

最后效果

 

posted @ 2022-06-17 14:57  StarsOverTheSea  阅读(368)  评论(0)    收藏  举报