欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net 对于PDF生成以及各种转换的操作

程序员文章站 2022-06-24 13:30:21
前段时间公司的产品,要做一个新功能,签章(就是把需要的数据整理成pdf很标准的文件,然后在盖上我们在服务器上面的章)然后我就在百度上找了找,发现搞pdf的类库很少,要么就要钱,要么就有水印,破解版的没...

前段时间公司的产品,要做一个新功能,签章(就是把需要的数据整理成pdf很标准的文件,然后在盖上我们在服务器上面的章)

然后我就在百度上找了找,发现搞pdf的类库很少,要么就要钱,要么就有水印,破解版的没找到。

先讲一讲我是怎么生成pdf的

1、生成pdf

  这里用到了spire.pdf 这个类库可以在nuget里面搜索到.Net 对于PDF生成以及各种转换的操作,上面带个小红标的就是免费版本。  

  当然也可以去他们的官网,上面还有文档(https://www.e-iceblue.cn/introduce/spire-pdf-net.html)。

  代码(这是我自己写的一个测试的表格)

 public static void abc()
  {
   //创建pdf文档
   spire.pdf.pdfdocument doc = new spire.pdf.pdfdocument();

   //添加一页
   pdfpagebase page = doc.pages.add();
    //设置字体
   pdftruetypefont font = new pdftruetypefont(new system.drawing.font("microsoft yahei", 20f), true);
   pdftruetypefont font1 = new pdftruetypefont(new system.drawing.font("microsoft yahei", 11f), true);

   //创建一个pdfgrid对象
   pdfgrid grid = new pdfgrid();

        //这一段的内容是在表格只玩显示一些数据 根据坐标定位 第一个是内容,第二个是字体,第三个是颜色,第四第五是坐标
   page.canvas.drawstring("xxxxxxxx管理中心回单",
     font,
     new pdfsolidbrush(system.drawing.color.black), 130, 10);
   page.canvas.drawstring("编号:31231",
     font1,
     new pdfsolidbrush(system.drawing.color.black), 380, 60);
   page.canvas.drawstring("经办人:xxxx",
     font1,
     new pdfsolidbrush(system.drawing.color.black), 60, 250);
   page.canvas.drawstring("打印日期:2020/06/15",
     font1,
     new pdfsolidbrush(system.drawing.color.black), 380, 250);
   //设置单元格边距
   grid.style.cellpadding = new pdfpaddings(1, 1, 4, 4);

   //设置表格默认字体
   grid.style.font = new pdftruetypefont(new system.drawing.font("microsoft yahei", 12f), true);

   //添加4行4列
   pdfgridrow row1 = grid.rows.add();
   pdfgridrow row2 = grid.rows.add();
   pdfgridrow row3 = grid.rows.add();
   pdfgridrow row4 = grid.rows.add();
   pdfgridrow row5 = grid.rows.add();
   pdfgridrow row6 = grid.rows.add();
   grid.columns.add(4);

   //设置列宽
   foreach (pdfgridcolumn col in grid.columns)
   {
    col.width = 120f;
   }

   //写入数据 第一行第一个格式的值,第一行第二个格子的值 
   row1.cells[0].value = "收款单位";
   row1.cells[1].value = "{dw}";
   row2.cells[0].value = "收款单位";
   row2.cells[1].value = "{dw}";
   row3.cells[0].value = "汇款时间";
   row3.cells[1].value = "2016/06/02";
   row3.cells[2].value = "金额小写";
   row3.cells[3].value = "¥231";
   row4.cells[0].value = "金额合计大写";
   row4.cells[1].value = "大苏打实打实";
   row5.cells[0].value = "用途:" +
    "付xxxx2020年04月至2020年04月";
   row6.cells[0].value = "提示:回单可重复打印,请勿重复xxx";

   //row5.cells[0].height = (float)20;
   //水平和垂直合并单元格 从那个格子开始合并几个(包含当前格子)
   row1.cells[1].columnspan = 3;
   row2.cells[1].columnspan = 3;
   row4.cells[1].columnspan = 3;
   row5.cells[0].columnspan = 2;
   row5.cells[2].columnspan = 2;
   row6.cells[0].columnspan = 2;
   row6.cells[2].columnspan = 2;
        //这个是垂直合并,但是我之前合并的没有效果
   row5.cells[1].rowspan = 2;

   //设置单元格内文字对齐方式
   row1.cells[0].stringformat = new pdfstringformat(pdftextalignment.center);
   row1.cells[1].stringformat = new pdfstringformat(pdftextalignment.center);
   row2.cells[0].stringformat = new pdfstringformat(pdftextalignment.center);
   row2.cells[1].stringformat = new pdfstringformat(pdftextalignment.center);
   row3.cells[0].stringformat = new pdfstringformat(pdftextalignment.center);
   row3.cells[1].stringformat = new pdfstringformat(pdftextalignment.center);
   row3.cells[2].stringformat = new pdfstringformat(pdftextalignment.center);
   row3.cells[3].stringformat = new pdfstringformat(pdftextalignment.center);
   row4.cells[0].stringformat = new pdfstringformat(pdftextalignment.center);
   row4.cells[1].stringformat = new pdfstringformat(pdftextalignment.center);
   row5.cells[0].stringformat = new pdfstringformat(pdftextalignment.center);
   row6.cells[0].stringformat = new pdfstringformat(pdftextalignment.center);
   //设置单元格背景颜色
   //row1.cells[0].style.backgroundbrush = pdfbrushes.gray;
   //row3.cells[3].style.backgroundbrush = pdfbrushes.green;
   //row4.cells[3].style.backgroundbrush = pdfbrushes.mediumvioletred;

   //设置边框颜色、粗细
   pdfborders borders = new pdfborders();
   borders.all = new pdfpen(system.drawing.color.black, 0.1f);
   foreach (pdfgridrow pgr in grid.rows)
   {
    foreach (pdfgridcell pgc in pgr.cells)
    {
     pgc.style.borders = borders;
    }
   }
   //保存到文档
   //在指定为绘入表格
   grid.draw(page, new pointf(30, 80));
   doc.savetofile(@"路径");
       //这句是在浏览器重打开这个pdf  
   system.diagnostics.process.start(@"路径");
  }

  保存我们看一下

  .Net 对于PDF生成以及各种转换的操作

2、之后就是关于pdf一些转换的操作了(pdf转base64,转图片之类的,我把代码贴到下面)

这个用到了itextsharp类库,也可以在nuget下载到

/// <summary>
  /// 图片转pdf
  /// </summary>
  /// <param name="jpgfile"></param>
  /// <param name="pdf"></param>
  public static bool convertjpg2pdf(string jpgfile, string pdf)
  {
   try
   {
    var document = new itextsharp.text.document(itextsharp.text.pagesize.a4, 25, 25, 25, 25);
    using (var stream = new filestream(pdf, filemode.create, fileaccess.write, fileshare.none))
    {
     pdfwriter.getinstance(document, stream);
     document.open();
     using (var imagestream = new filestream(jpgfile, filemode.open, fileaccess.read, fileshare.readwrite))
     {
      var image = itextsharp.text.image.getinstance(imagestream);
      if (image.height > itextsharp.text.pagesize.a4.height - 25)
      {
       image.scaletofit(itextsharp.text.pagesize.a4.width - 25, itextsharp.text.pagesize.a4.height - 25);
      }
      else if (image.width > itextsharp.text.pagesize.a4.width - 25)
      {
       image.scaletofit(itextsharp.text.pagesize.a4.width - 25, itextsharp.text.pagesize.a4.height - 25);
      }
      image.alignment = itextsharp.text.image.align_middle;
      document.newpage();
      document.add(image);
     }
     document.close();
    }

    return true;

   }
   catch (exception ex)
   {
    throw ex;
   }
  }

这个和上面用的也是同一个(我觉得这个比较好用一些)

/// <summary>
  /// pdf转img
  /// </summary>
  /// <param name="path">pdf位置</param>
  /// <param name="path2">img位置</param>
  public static void pdf2img(string path, string path2)
  {
   pdffile pdffile = pdffile.open(path);
   //实例化一个pdfdocument类对象,并加载pdf文档
   using (spire.pdf.pdfdocument doc = new spire.pdf.pdfdocument())
   {
    doc.loadfromfile(path);
    //调用方法saveasimage()将pdf第一页保存为bmp格式
    system.drawing.image bmp = doc.saveasimage(0);
    // //调用另一个saveasimage()方法,并将指定页面保存保存为emf、png   
    system.drawing.image emf = doc.saveasimage(0, spire.pdf.graphics.pdfimagetype.bitmap);
    system.drawing.image zoomimg = new bitmap((int)(emf.size.width * 2), (int)(emf.size.height * 2));
    using (graphics g = graphics.fromimage(zoomimg))
    {
     g.scaletransform(2.0f, 2.0f);
     g.drawimage(emf, new system.drawing.rectangle(new system.drawing.point(0, 0), emf.size), new system.drawing.rectangle(new system.drawing.point(0, 0), emf.size), graphicsunit.pixel);
     zoomimg.save(path2, imageformat.jpeg);
     
     zoomimg.dispose();
     emf.dispose();
     bmp.dispose();
    }
    doc.close();
    doc.dispose();
   }  
  }

我主要也就用到这些,之后在发现,我在往上加  

https://www.jb51.net/dll/o2s.components.pdfrender4net.dll.html

  这个是o2s.components.pdfrender4net的文件,我看评论里有问的,之前忘记发了,网上有的是收费的,nuget里面带后缀的我没用过。

到此这篇关于.net 对于pdf生成以及各种转换的操作的文章就介绍到这了,更多相关.net pdf生成内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

本文作者:沉_默
本文链接:https://www.cnblogs.com/silentcm/p/13130333.html

相关标签: .Net PDF 生成