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

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

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

1、生成pdf

  这里用到了spire.pdf 这个类库可以在nuget里面搜索到,上面带个小红标的就是免费版本。  

  当然也可以去他们的官网,上面还有文档(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(@"路径");
  }

  保存我们看一下

  

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生成内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

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