.netCore后台将数据生成为PDF文件

Posted 热情不减

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.netCore后台将数据生成为PDF文件相关的知识,希望对你有一定的参考价值。

做项目的时候遇到了一个需要将数据导出为pdf的功能,写了两天,将成果记录下来,方便下次开发作参考。

一、自己先设计一个word文档模板,根据自己的需求设计word文档,在需要填充数据的地方插入标签,后台插入数据的时候是根据获取标签位置将数据插入到标签的位置的。

        将制作好的word文档模板,放在后台项目中,模板就算制作好了

 二、第在项目中先安装需要的Nuget包,

 三、第三步在后台进行操作,先获取自己刚才做的word文档模板, 

注:下边代码段如果不加的话,生成的pdf会有aspose开发者的广告,引用包的版本需要与消除水印代码的版本保持一致,不一致就会报错,(我这里用的是19.12.0)

new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));

 四、操作word文档,这步应该在生成pdf之前,为了方便看,我写在了这里,我这个文档中有将

文本、表格、图片插入内容的操作,如果有其他需要可以在教程上边找,https://www.evget.com/doclib/s/21/10921

  1.  第一种的话是获取标签位置,填充内容。
    bookmarkNavigator.MoveToBookmark("LICNO", true, true);//根据模板中的标签名称,获取位置
    bookmarkNavigator.ReplaceBookmarkContent("填充的内容", true);
  2. 自定义样式,我这里是在表格替换标签的时候定义的样式。

  3. 生成表格插入到word中,成果,

     代码,

     //创建表格
    Table table = new Table(document, true);//在文档中创建表格
    table.ResetCells(20, 2);//这里是表格的行数和列数,我这里是20行,2列
    //设置表格的水平和垂直边框 
    table.TableFormat.Borders.Horizontal.BorderType = BorderStyle.Hairline;
    table.TableFormat.Borders.Horizontal.Color = Color.White;
    table.TableFormat.Borders.Vertical.BorderType = BorderStyle.Hairline;
    table.TableFormat.Borders.Vertical.Color = Color.White;//设置内边框的颜色,(我这里设置成了白色)
    //table[0, 0]这里是获取表格的位置,位置是从0开始的,我这里就是第一行第一列
    table[0, 0].AddParagraph().AppendText("| 经营异常名录");//在第一行第一列单元格填充文本
    table[0, 0].Paragraphs[0].Format.HorizontalAlignment = HorizontalAlignment.Left;//设置文本居左
    //这里是设置单元格的样式,style.Name就是上一步自定义样式的NAME,获取样式
    table[0, 0].Paragraphs[0].ApplyStyle(style.Name);
     //创建TextBodyPart对象
    TextBodyPart bodyPart = new TextBodyPart(document);
    bodyPart.BodyItems.Add(table);
    //定位到指定书签位置
    bookmarkNavigator.MoveToBookmark("模板书签的名字");
    //使用表格替换原书签的内容
    bookmarkNavigator.ReplaceBookmarkContent(bodyPart);
  4. 将图片插入到word文档中(我这里是将生成的二维码插入到了word中)成果:

     代码:

    var wjjurl = _host.WebRootPath + "/XYJG/XYBG/QrCode/";//文件夹路径
    string qrcodepath = _host.WebRootPath + "/XYJG/XYBG/QrCode/" + jgdm + ".jpg";
    if (!Directory.Exists(wjjurl))//判断文件夹路径是否存在
    
        Directory.CreateDirectory(wjjurl);
    
    if (!System.IO.File.Exists(qrcodepath))//判断二维码是否存在
    
    //定义二维码扫出来的内容
    string url = "企业名称:" + enmoeamodel.QYMC + "统一社会信用代码:" + jgdm;
    
    Bitmap ImagePath = QRCodeHelper.GetPTQRCode(url, 2);//生成二维码
    ImagePath.Save(qrcodepath);//将二维码保存
    
    //创建BookmarksNavigator实例
    BookmarksNavigator bn = new BookmarksNavigator(document);
    //模板中要替换图片的书签
    bn.MoveToBookmark("qytpimg", true, true);
    //添加一个secton并命名为section0
    Section section0 = document.AddSection();
    //为section0添加一个段落
    Paragraph paragraph = section0.AddParagraph();
    //加载一张图片
    Image image = Image.FromFile(qrcodepath);//图片的物理路径
    //为段落添加图片
    DocPicture picture = paragraph.AppendPicture(image);
    //把含有图片的段落插入到书签位置
    bn.InsertParagraph(paragraph);
    document.Sections.Remove(section0);
    

总结:这是本人做数据导出为pdf的总结文字,有的地方可能表达的不是很清楚,仅供参考

使用wkhtmltopdf工具生成pdf

背景:将前台页面转换成pdf文档保存到服务器

最开始计划使用canvas2pdf在前端进行生成。但是canva2pdf转换的pdf有严重的失真问题,然后决定使用wkhtmltopdf工具进行生成。

思路:服务器准备好模板(html页面),前台将数据传回后台,将数据把模板中的占位符替换掉,然后生成临时html页面,再使用wkhtmltopdf工具将html页面转换成pdf

这里注意:模板中使用到的图片和引用css的路径需要使用绝对路径(带盘符如:c:a.jpg 或者为localhost:5555/src/a.css)否则wkhtmltopdf工具会找不到引用资源。

将数据填充到html的过程这里就不做展示。只展示转换过程

//导出html
            string outputDir = ConvertPdfHelper.GetAbsolutePath("outputDir", false);
            DateTime now = DateTime.Now;
            string filePath = now.ToString("yyyy/MM/dd") + "/" + salesOrderNo + ".html";
            string temphtmlPath = Path.Combine(outputDir, filePath);
            string pdfPath = temphtmlPath.Replace(".html", ".pdf");
            //保證文件夾存在
            FileInfo fileInfo = new FileInfo(temphtmlPath);
            fileInfo.Directory.Create();
            string wtHtmlToPdfEXEPath = ConvertPdfHelper.GetAbsolutePath("htmltopdfTool", false);
            using (StreamWriter writer = new StreamWriter(temphtmlPath, false, Encoding.UTF8))
            {
                writer.WriteLine(layoutSb);
                writer.Flush();
                writer.Close();
            }
            //轉pdf
            string switches = "";
            switches += "--margin-top 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm ";

            switches += "--page-size A5 ";
            switches += "--orientation Landscape ";

            switches += "--javascript-delay 1000 ";
            switches += "--image-quality 50 --lowquality ";
            switches += "--disable-smart-shrinking ";
            switches += " " + temphtmlPath + " " + pdfPath + "";
            ProcessStartInfo startInfo = new ProcessStartInfo(wtHtmlToPdfEXEPath, switches);
            startInfo.CreateNoWindow = true;
            startInfo.UseShellExecute = false;
            //将输出信息重定向
            startInfo.RedirectStandardOutput = true;
            Process process = Process.Start(startInfo);
            process.WaitForExit();

Done!

wkhtmltopdf的工具参数详解在这里 

HTML 转 PDF 之 wkhtmltopdf 工具精讲

 

以上是关于.netCore后台将数据生成为PDF文件的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 中将 html 导出为 pdf

Asp.Net 将网页响应保存为 PDF

wkhtmltopdf 能直接将登录后(后台页面)的某一网页生成pdf文件吗

C#/.Net 使用QuestPDF操作生成PDF更快更高效!

使用 s-s-rS 和 ASP.NET 合并以 Pdf 格式生成的报告

.net webapi后台返回pdf文件流,前端ajax请求下载,空白pdf排错经历