c# 数据保存为PDF(二) (Aspose pdf篇)

文章目录

    • 前言
    • 关于Aspose PDF
    • 使用Aspose.Pdf
      • 常用的命名空间和类库
      • 1 创建简单的PDF文档
      • 2 美化PDF样式
        • 2.1 创建测试数据
        • 2.2 项目头部样式
        • 2.3 全部代码
    • 小结
    • 附录参考

前言

项目中需要将数据导出存为PDF格式,试了一下Aspose组件,仅以此记录一下使用感受。

关于Aspose PDF

Aspose于2002年3月在澳大利亚悉尼创建,一直致力于成为全球最大的.NET组件提供商。
Aspose.Pdf是一个PDF文档创建组件,可以帮助用户无需使用Adobe Acrobat即可读写和操作PDF文件。Aspose.Pdf功能丰富:有PDF文档压缩选项,表格创建与操作,插入图表、图像功能,丰富的超链接功能,图章和水印任务,扩展的安全性组件以及自定义字体处理。
Aspose.PDF for .NET支持流行的文件格式,例如PDF,XFA,TXT,HTML,PCL,XPS,EPUB,TEX和图像格式,并允许直接通过API或XML模板创建PDF文档,并且可以创建表单或管理文档中嵌入的表单字段。
在这里插入图片描述

使用Aspose.Pdf

Aspose的组件是收费的,但是网上也能收到很多破解版本,且去掉页眉和水印之类的限制。
在这里插入图片描述

常用的命名空间和类库

使用Aspose.Pdf组件时,常用的命名空间和类库如下,可根据自己的实际需求增添:
命名空间:

using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.Pdf.Text;
using Aspose.Cells; 
说明
Aspose.Pdf.Document PDF文档
Aspose.Pdf.Page PDF页面
Aspose.Pdf.HeaderFooter 页眉页脚
Aspose.Pdf.MarginInfo 页边距
Aspose.Pdf.Table 表格
Aspose.Pdf.Row
Aspose.Pdf.TextFragment 文本段落

1 创建简单的PDF文档

创建一个带页眉页脚的PDF文档Document 。首先是创建HeaderFooter 页眉页脚,然后在页眉页脚中插入Table 表格,在表格的行中单元中填充TextFragment 文本段落。Page 页面内容也是一样的套路。

        /// <summary>
        /// 创建简单PDF
        /// </summary>
        public static void CreatePdf1()
        {//Evaluation Only. Created with Aspose.PDF. Copyright 2002-2019 Aspose Pty Ltd.

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

            //创建PDF文档对象
            Aspose.Pdf.Document doc = new Document();
           //添加页面
            Page page = doc.Pages.Add();

            //设置页边距
            MarginInfo marginInfo = new MarginInfo();
            marginInfo.Top = 90;
            marginInfo.Bottom = 50;
            marginInfo.Left = 50;
            marginInfo.Right = 50;
     
           //更新页面的页边距
            page.PageInfo.Margin = marginInfo;

            
            //页眉
            HeaderFooter hfFirst = new HeaderFooter();
            page.Header = hfFirst;
            hfFirst.Margin.Left = 50;
            hfFirst.Margin.Right = 50;

            // 在页眉处写入文本段落
            TextFragment t1 = new TextFragment("report title 页眉");
            t1.TextState.Font = FontRepository.FindFont("Arial");
            t1.TextState.FontSize = 16;
            t1.TextState.ForegroundColor = Aspose.Pdf.Color.Black;
            t1.TextState.FontStyle = FontStyles.Bold;
            t1.TextState.HorizontalAlignment = Aspose.Pdf.HorizontalAlignment.Center;
            t1.TextState.LineSpacing = 5f;
            hfFirst.Paragraphs.Add(t1);

            TextFragment t2 = new TextFragment("Report_Name");
            t2.TextState.Font = FontRepository.FindFont("Arial");
            t2.TextState.ForegroundColor = Aspose.Pdf.Color.Black;
            t2.TextState.HorizontalAlignment = Aspose.Pdf.HorizontalAlignment.Center;
            t2.TextState.LineSpacing = 5f;
            t2.TextState.FontSize = 12;
            hfFirst.Paragraphs.Add(t2);

            // 为每一页创建页脚
            HeaderFooter hfFoot = new HeaderFooter();
            page.Footer = hfFoot;
            hfFoot.Margin.Left = 50;
            hfFoot.Margin.Right = 50;

            // 页脚文字段落设置,包含生成日期 名称 和 页码
            TextFragment t3 = new TextFragment(DateTime.Now.ToString("yyyy/MM/dd HH:mm"));
            TextFragment t4 = new TextFragment("唠嗑一夏 ");
            TextFragment t5 = new TextFragment("Page $p of $P");

            // 实例化表格对象
            Table tab2 = new Table();

            // 在页脚中添加表格
            hfFoot.Paragraphs.Add(tab2);

            // 设置表格宽度 使用空格隔开
            tab2.ColumnWidths = "165 172 165";

            // 创建行,并在行中添加单元格
            Aspose.Pdf.Row row3 = tab2.Rows.Add();

            row3.Cells.Add();
            row3.Cells.Add();
            row3.Cells.Add();

            //设置单元格的对齐方式
            row3.Cells[0].Alignment = Aspose.Pdf.HorizontalAlignment.Left;
            row3.Cells[1].Alignment = Aspose.Pdf.HorizontalAlignment.Center;
            row3.Cells[2].Alignment = Aspose.Pdf.HorizontalAlignment.Right;

            //使用文本段落填充单元格内容
            row3.Cells[0].Paragraphs.Add(t3);
            row3.Cells[1].Paragraphs.Add(t4);
            row3.Cells[2].Paragraphs.Add(t5);

            //再次创建表格对象
            Table table = new Table();

            //设置列宽和边距
            table.ColumnWidths = "33% 33% 34%";
            table.DefaultCellPadding = new MarginInfo();
            table.DefaultCellPadding.Top = 10;
            table.DefaultCellPadding.Bottom = 10;

            // 在页面中插入表格
            page.Paragraphs.Add(table);

            // 设置表格默认的边框
            table.DefaultCellBorder = new BorderInfo(BorderSide.All, 0.1f);

            // 设置表格边框
            table.Border = new BorderInfo(BorderSide.All, 1f);

            table.RepeatingRowsCount = 1;

            // 在表中创建行,在行中添加单元格
            Aspose.Pdf.Row row1 = table.Rows.Add();

            row1.Cells.Add("col1");
            row1.Cells.Add("col2");
            row1.Cells.Add("col3");
            const string CRLF = "\r\n";
            for (int i = 0; i <= 30; i++)
            {
                //创建新行
                Aspose.Pdf.Row row = table.Rows.Add();
                //换行
                row.IsRowBroken = true;
                for (int c = 0; c <= 2; c++)
                {
                    Aspose.Pdf.Cell  c1;
                    if (c == 2)
                        c1 = row.Cells.Add("Aspose.Total for Java is a compilation of every Java component offered by Aspose. It is compiled on a" + CRLF + "daily basis to ensure it contains the most up to date versions of each of our Java components. " + CRLF + "daily basis to ensure it contains the most up to date versions of each of our Java components. " + CRLF + "Using Aspose.Total for Java developers can create a wide range of applications.");
                    else
                        c1 = row.Cells.Add("item1" + c);
                    c1.Margin = new MarginInfo();
                    c1.Margin.Left = 30;
                    c1.Margin.Top = 10;
                    c1.Margin.Bottom = 10;
                }
            }

           string dataDir = @"D:\Demo.pdf";
            //保存
            doc.Save(dataDir);
        }

效果图:
在这里插入图片描述

2 美化PDF样式

根据下面(Spire pdf创建的PDF)图片中的样式,用Aspose.Pdf实现。
原文在:c# 数据保存为PDF (spire pdf篇)https://blog.csdn.net/weixin_40314351/article/details/130406659?spm=1001.2014.3001.5501
在这里插入图片描述

2.1 创建测试数据

使用DataTable存储我们自己随机产生的100 (行)* 5(列)的数据,该数据仅作演示使用哈。

        /// <summary>
        /// 数据表格
        /// </summary>
        /// <returns></returns>
        private static DataTable CreateData()
        {
            DataTable dt = new DataTable();
            DataColumn col1 = new DataColumn("Num", typeof(string));
            DataColumn col2 = new DataColumn("Name", typeof(string));
            DataColumn col3 = new DataColumn("Val", typeof(string));
            DataColumn col4 = new DataColumn("Des", typeof(string));
            DataColumn col5 = new DataColumn("Set", typeof(string));

            dt.Columns.Add(col1);
            dt.Columns.Add(col2);
            dt.Columns.Add(col3);
            dt.Columns.Add(col4);
            dt.Columns.Add(col5);

            Random random = new Random();
            List<string> nameList = new List<string>
            {
                "A", "BB", "CCC", "D",
                "E", "F", "G","H","II",
                "JJ", "LL", "M"
            };

            List<string> tempList = new List<string>
            {
                "dsd", "sdfdgvre", "Hello", "Gilrs",
                "Today", "YYYY", "dfgre","GSD","fdgfer",
                "Wesd", "DLG", "fsdahfi;o"
            };

            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    DataRow dr = dt.NewRow();
                    dr[0] = "KK" + i.ToString("d2") + "." + j.ToString("d2");
                    dr[1] = nameList[j];
                    if (j % 3 == 0)
                    {
                        dr[2] = random.NextDouble().ToString("f3");
                    }
                    else
                    {
                        dr[2] = i * j - random.Next(0, 30);
                    }
                    dr[3] = tempList[j];

                    dr[4] = random.NextDouble().ToString("f2");

                    //添加新行
                    dt.Rows.Add(dr);
                }
            }

            return dt;
        }

2.2 项目头部样式

设计一下项目头部样式,这里是使用单独函数实现的,后面调用就可以了。
实际上是一个表格,表格中有5行,设置行高、单元格内容以及单元格样式,就可以实现了。最后将表格添加到Page的段落中即可。
在这里插入图片描述

        /// <summary>
        /// 项目的头
        /// </summary>
        /// <param name="page"></param>
        private static void AddPDFProgramTitle(Page page)
        {
            Table tab1 = new Table();
            tab1.ColumnWidths = "80% 20%";

            Aspose.Pdf.Row row1 = tab1.Rows.Add();
            row1.Cells.Add("Parameter Settings Report(Program)");
            row1.Cells[0].DefaultCellTextState.FontSize = 14;

            row1.Cells.Add(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
            row1.Cells[1].DefaultCellTextState.FontSize = 11;
            
            row1.MinRowHeight = 35;
            row1.DefaultCellTextState.FontStyle = FontStyles.Bold;

            Aspose.Pdf.Row emptyRow1 = tab1.Rows.Add();
             emptyRow1.Cells.Add(" ");
             emptyRow1.Cells.Add(" ");
             emptyRow1.MinRowHeight = 1;
             emptyRow1.DefaultCellTextState.FontSize = 7;
             emptyRow1.DefaultCellBorder = new BorderInfo(BorderSide.Top, 0.1f);

            Aspose.Pdf.Row row2 = tab1.Rows.Add();
            row2.Cells.Add("Program (Drive Selected / Connected):");
            row2.Cells.Add("");
            row2.BackgroundColor = Color.LightCyan;
            row2.MinRowHeight = 20;
            row2.Cells[0].DefaultCellTextState.FontSize = 12;
            row2.DefaultCellTextState.FontStyle = FontStyles.Bold;

            Aspose.Pdf.Row row3 = tab1.Rows.Add();
            row3.Cells.Add("Drive Type / Model:");
            row3.Cells.Add("");
          //  row3.DefaultCellBorder = new BorderInfo(BorderSide.Bottom, 0.1f);
            row3.BackgroundColor = Color.LightCyan;
            row3.MinRowHeight = 20;
            row3.Cells[0].DefaultCellTextState.FontSize = 13;

            Aspose.Pdf.Row emptyRow2 = tab1.Rows.Add();
            emptyRow2.Cells.Add("");
            emptyRow2.Cells.Add("");
            emptyRow2.MinRowHeight = 2;
            emptyRow2.DefaultCellBorder = new BorderInfo(BorderSide.Bottom, 0.1f);


            Aspose.Pdf.Row row4 = tab1.Rows.Add();
            row4.Cells.Add("Project:");
            row4.Cells.Add("");
         //   row4.DefaultCellBorder = new BorderInfo(BorderSide.Bottom, 0.1f);
            row4.MinRowHeight = 30;
            row4.Cells[0].DefaultCellTextState.FontSize = 12;
            row4.Cells[0].DefaultCellTextState.FontStyle = FontStyles.Bold;

            Aspose.Pdf.Row emptyRow3 = tab1.Rows.Add();
            emptyRow3.Cells.Add("");
            emptyRow3.Cells.Add("");
            emptyRow3.MinRowHeight = 1;
            emptyRow3.DefaultCellBorder = new BorderInfo(BorderSide.Bottom, 0.1f);

            Aspose.Pdf.Row row5 = tab1.Rows.Add();
            row5.Cells.Add("Information");
            row5.Cells.Add("");
            row5.MinRowHeight = 80;
            row5.Cells[0].DefaultCellTextState.FontSize = 11;
            row5.DefaultCellTextState.FontStyle = FontStyles.Bold;
            row5.VerticalAlignment = VerticalAlignment.Top;
            row5.DefaultCellPadding = new MarginInfo(0,0,0,10);
            page.Paragraphs.Add(tab1);
           
        }

2.3 全部代码

将测试数据,项目头部信息,以及数据内容全部整合在一起,生成PDF。

        /// <summary>
        /// 制作Aspose PDF
        /// </summary>
        /// <param name="binary"></param>
        /// <returns></returns>
        public static void MakeAsposePDF()
        {
            //获取测试数据
            DataTable dataTable = CreateData();

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

            Aspose.Pdf.Text.Font font = FontRepository.FindFont("Arial");

            //创建文档对象
            Aspose.Pdf.Document doc = new Document();
            Page page = doc.Pages.Add();

            MarginInfo marginInfo = new MarginInfo();
            marginInfo.Top = 30;
            marginInfo.Bottom = 30;
            marginInfo.Left = 20;
            marginInfo.Right = 20;
            // 设置页面边距
            page.PageInfo.Margin = marginInfo;


            // 创建页脚
            HeaderFooter hfFoot = new HeaderFooter();
            // 设置页脚边距
            page.Footer = hfFoot;
            hfFoot.Margin.Left = 20;
            hfFoot.Margin.Right = 20;

            // 设置页脚的文本内容
            string footerText = "Test for Windows(C) by 唠嗑一夏 Electric Corporation";
            TextFragment t3 = new TextFragment(footerText);
            TextFragment t5 = new TextFragment("$p/$P");

            // 创建表格实例
            Table hftable = new Table();

            // 在页脚的段落中添加表格
            hfFoot.Paragraphs.Add(hftable);

            // 设置表格列宽
            hftable.ColumnWidths = "90% 10%";

            // 创建行
            Aspose.Pdf.Row row3 = hftable.Rows.Add();
            //行中添加单元格
            row3.Cells.Add();
            row3.Cells.Add();

            // 设置单元格对齐方式
            row3.Cells[0].Alignment = Aspose.Pdf.HorizontalAlignment.Left;
            row3.Cells[1].Alignment = Aspose.Pdf.HorizontalAlignment.Right;

            //单元格段落中填充文本段落
            row3.Cells[0].Paragraphs.Add(t3);
            row3.Cells[1].Paragraphs.Add(t5);
            row3.DefaultCellPadding = new MarginInfo(0, 0, 0, 5);
            row3.Border = new BorderInfo(BorderSide.Top, 0.6f, Color.Black);

            //添加大标题
            AddPDFProgramTitle(page);

            //创建内容表格
            Table contentTable = new Table();
            //设置表的列宽 以百分比
            contentTable.ColumnWidths = "30% 15% 40% 15%";
          

            // 页面段落中添加表格
            page.Paragraphs.Add(contentTable);
            contentTable.RepeatingRowsCount = 1;

            // 表格中创建行
            Aspose.Pdf.Row row1 = contentTable.Rows.Add();

            //设置文本样式
            TextState tsTitle = new TextState();
            tsTitle.FontSize = 10;
            tsTitle.FontStyle = FontStyles.Bold;

            tsTitle.Font = font;

            row1.Cells.Add(" Parameter");
            row1.Cells.Add("Value");
            row1.Cells.Add("Information");
            row1.Cells.Add("Default Setting");
            row1.DefaultCellTextState = tsTitle;
            row1.Border = new BorderInfo(BorderSide.All, 0.1f, Color.LightGray);
            row1.BackgroundColor = Color.LightCyan;
            row1.MinRowHeight = 30;

            int count = dataTable.Rows.Count;
            string str = "";
            string strBak = "";
            int j = 0;


            //加粗样式
            TextState tsBold = new TextState();
            tsBold.FontSize = 8;
            tsBold.FontStyle = FontStyles.Bold;
            tsBold.Font = font;

            //正常样式
            TextState tsRegular = new TextState();
            tsRegular.FontSize = 8;
            tsRegular.Font = font;

            for (int i = 0; i < count; i++)
            {//遍历行
                DataRow dataRow = dataTable.Rows[i];

                //添加新行
                Aspose.Pdf.Row row = contentTable.Rows.Add();
                //设置换行
                row.IsRowBroken = true;
                //设置单元格内边距
                row.DefaultCellPadding = new MarginInfo(0, 0, 0, 5);

                //截取字符串
                strBak = dataRow[0].ToString().Substring(0, 4);
                if (strBak != str)
                {//绘制组别,添加下划线
                    str = strBak;
                    string converStr = strBak;
                    row.Cells.Add(converStr);
                    row.Cells[0].DefaultCellTextState = tsBold;
                    row.Cells[0].VerticalAlignment = VerticalAlignment.Bottom;
                    row.Cells[0].Border = new BorderInfo(BorderSide.Bottom, 0.1f, Color.Black);
                    j++;
                }

                {//绘制组中内容
                    string tempStr = dataRow[0].ToString() + " " + dataRow[1].ToString();
                    row.DefaultCellTextState = tsRegular;
                    row.Cells.Add(tempStr);
                    row.Cells.Add(dataRow[2].ToString());
                    row.Cells.Add(dataRow[3].ToString());
                    row.Cells.Add(dataRow[4].ToString());
                }
            }

            //保存文档
            doc.Save(@"D:\Aspose.pdf");
        }

效果:
在这里插入图片描述

小结

Aspose.Pdf很容易上手,都是面向对象编程,想要什么就创建相应的实体类即可。不过需要自己找破解版的资源,破解版可能也不是当前最新版本。

相比c# 数据保存为PDF (spire pdf篇) Spire.PDF 还是Aspose.Pdf更简单容易上手。

附录参考

1、c# 数据保存为PDF (spire pdf篇)https://blog.csdn.net/weixin_40314351/article/details/130406659?spm=1001.2014.3001.5501
2、Aspose.PDF for .NET相关案例使用Demo https://www.evget.com/product/565/resource
3、Aspose.Pdf官网 https://releases.aspose.com/pdf/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17978.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么半导体FAB生产线需要EAP系统?

在半导体制造中&#xff0c;设备自动化系统EAP&#xff08;Equipment Automation Program&#xff09;是不可或缺的重要软件&#xff0c;它是连接MES、RMS、APC、FDC等上层系统和设备层的桥梁&#xff0c;用于管控生产线上的所有机台&#xff0c;并实现设备运行的自动化。 作为…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

Redux 学习系列(一) —— 基础概念入门篇

简介 Redux 是一个可预测的 JavaScript 应用状态管理容器&#xff0c;也可以说是一个应用数据流框架。 作用 Redux 主要是用作应用状态的管理。它抽离所有组件的状态&#xff0c;构造一个中心化的单独常量状态树&#xff08;对象&#xff09;来保存这一整个应用的状态。这棵…

java 学习日记

今天先搞题目 给你一个points 数组&#xff0c;表示 2D 平面上的一些点&#xff0c;其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 &#xff1a;|xi - xj| |yi - yj| &#xff0c;其中 |val| 表示 val 的绝对值。 请你返回将所…

TikTok选品要怎样才能选到爆品?!

对于做TikTok的商家而言&#xff0c;选品是非常重要的&#xff0c;因为一个产品爆了之后能带动其他产品的销量&#xff0c;那我们要如何有效的选品呢&#xff1f; 一、多平台选品逻辑 首先要知道一个点&#xff0c;在独立站爆的品也会在亚马逊爆&#xff0c;而TikTok已经成为一…

4D成像雷达风口,谁在快速崛起?

4D成像雷达正进入规模量产落地的关键窗口期。 高工智能汽车注意到&#xff0c;毫米波雷达的发展某种程度上可以分为两个阶段&#xff1a;第一个阶段&#xff0c;传统毫米波雷达时代&#xff0c;市场基本被博世、大陆、安波福等国际Tier1巨头把持&#xff0c;市场格局长期稳固&…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else

场景 设计模式-策略模式在Java中的使用示例&#xff1a; 设计模式-策略模式在Java中的使用示例_java 策略模式示例_霸道流氓气质的博客-CSDN博客 上面讲了策略模式在Java中的使用示例。 下面看一个在SpringBoot中的实际使用示例。 业务场景: 有多个煤矿&#xff0c;信号灯…

智安网络|网络安全威胁越来越多,教你如何全方面应对

随着互联网的普及和发展&#xff0c;各大网站已经成为人们获取信息和交流的主要平台。然而&#xff0c;随着网络攻击和恶意软件的威胁不断增加&#xff0c;网站经常成为攻击者的目标。因此&#xff0c;在建立和维护网站系统时&#xff0c;必须采取强大的安全措施。 一、网站系…

第四十二章 Unity 下拉框 (Dropdown) UI

本章节我们介绍下拉框 (Dropdown)&#xff0c;我们点击菜单栏“GameObject”->“UI”->“Dropdown”&#xff0c;然后调整它的位置&#xff0c;效果如下 其实它的本质就是一个下拉列表&#xff0c;然后选择列表中的一个选项而已。大家在很多网页中应该可以看到类似的UI元…

Vue框架

目录 简单介绍 MVVM 下载安装Node.js 安装Vue.js插件 新建Vue.js项目 下载vue依赖库 Vue工程目录结构 修改代码模板 vue组件中&#xff0c;添加模型数据 Vue双向绑定 动态绑定 vue组件中&#xff0c;显示图片 单选框绑定 复选框绑定 Vue的script表达式 Vue实例声…

MySQL概述 -- 数据模型SQL简介DDL数据库操作

一. 数据模型 介绍完了Mysql数据库的安装配置之后&#xff0c;接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后&#xff0c;我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。 在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#x…

【Linux】进程地址空间

目录 引入 进程地址空间 虚拟地址与物理地址 如何理解虚拟地址的不同区域 写时拷贝 动态开辟的细节 为什么存在进程地址空间 避免地址被随意访问 进程管理和内存管理解耦合 使进程用统一的视角看待代码和数据 引入 &#x1f383;我们写一个这样的程序&#xff0c;运…

算法记录 | Day50 动态规划

123.买卖股票的最佳时机III 思路&#xff1a; 1.确定dp数组以及下标的含义 最多可完成两笔交易意味着总共有三种情况&#xff1a;买卖一次&#xff0c;买卖两次&#xff0c;不买卖。 具体到每一天结束总共有 5 种状态&#xff1a; 未进行买卖状态&#xff1b;第一次买入状…

springboot - spring.factories

spring.factories 是什么&#xff1f; spring.factories 是 Spring Boot 自动配置的核心机制之一&#xff0c;它用于自动注册 Spring Boot 中的各种自动配置类&#xff0c;从而实现自动化配置的目的。在 Spring Boot 应用程序启动时&#xff0c;Spring Boot 会自动扫描 classp…

深度解读:《数字孪生世界白皮书(2023)》全方位剖析

2023年初&#xff0c;中国信息通信研究院发布了《数字孪生城市产业图谱研究报告&#xff08;2022&#xff09;》&#xff0c;报告中提出我国数字孪生产业四阶段体系&#xff0c;2020年到2030年是我国数字孪生产业增长期&#xff0c;当前数字孪生市场需求和技术均处于高速发展阶…

5月跳槽有风险,不跳也有?

今天讲讲跳槽。 说实话跳槽是为了寻求更好的发展&#xff0c;但在跳槽前我们也不能确定下家就是更好的归宿&#xff0c;这就更加需要我们审慎地去对待&#xff0c;不能盲目跳槽。 其次&#xff0c;我们离职和跳槽&#xff0c;其中的原因很大一部分是目前薪资不符合预期。 那…

C. Permutation Game(博弈 + 拓扑的思想)

Problem - C - Codeforces 经过漫长的一天&#xff0c; Aice和Bob决定玩一个小游戏。游戏棋盘由n个格子组成&#xff0c;在一条直线上&#xff0c;编号从1到n,每个格子包含一个数字4;,qy在1到n.之间&#xff0c;而且没有两个格子包含相同的数字。 一个棋子被放在其中一个格子里…

什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐

相较于有线耳机&#xff0c;无线蓝牙耳机更便携、功能更丰富&#xff0c;不用受到耳机孔与线的限制。那么&#xff0c;什么牌子的蓝牙耳机好用不贵&#xff1f;针对这个问题&#xff0c;我给大家推荐几款国产性价比高的蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱Lite…

Spring使用注解存储和读取对象

文章目录 一、存储Bean对象配置扫描添加注解存储Bean对象注解使用范围Bean的命名五大类注解的关系为什么需要五大类注解? 二、方法注解BeanBean重命名 三、对象注入属性注入Setter注入构造方法注入Autowired 和 Resource 的区别 一、存储Bean对象 之前我们存储Bean时&#xff…