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

生成PDF全攻略之在已有PDF上添加内容的实现方法

程序员文章站 2024-03-12 08:42:50
项目在变,需求在变,不变的永远是敲击键盘的程序员..... pdf 生成后,有时候需要在pdf上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获...

项目在变,需求在变,不变的永远是敲击键盘的程序员.....

pdf 生成后,有时候需要在pdf上面添加一些其他的内容,比如文字,图片....

经历几次失败的尝试,终于获取到了正确的代码书写方式。

在此记录总结,方便下次以不变应万变,需要的 jar 请移步:生成pdf全攻略

pdfreader reader = new pdfreader("e:\\a.pdf");
  pdfstamper stamper = new pdfstamper(reader, new fileoutputstream("e:\\b.pdf"));
  pdfcontentbyte overcontent = stamper.getovercontent(1);

上述的这段代码算是在原有 pdf 上面添加内容的核心代码,具体流程如下

生成PDF全攻略之在已有PDF上添加内容的实现方法

•如果看官老爷够仔细的话,该代码是将原 a.pdf 读取,然后将它写入 b.pdf,然后操作 b.pdf。

•可能有的看官老爷会说,将 a 读取,然后在写入 a 中,这样肯定是不行的,在读取的时候 a 已经被加载了,不能进行修改。

•我不喜欢这种方式,因为原 pdf 的信息已经存储在数据库中,其中包括 pdf 的服务器路径、旧名称、新名称、类型......

•这样就会多出一次数据库变更操作,因为这里pdf名称需要变更,而且鬼知道后续需求还会怎么变。

•这里急需 只在 pdf 中添加内容,其他的什么都不变,将代码稍微调整了一下。

fileutil.filechannelcopy(a.pdf,a + "tmp".pdf));
  pdfreader reader = new pdfreader(a + "tmp".pdf);
  pdfstamper stamper = new pdfstamper(reader, new fileoutputstream(a.pdf));
  pdfcontentbyte overcontent = stamper.getovercontent(1);

代码流程就变做下面这个样子

生成PDF全攻略之在已有PDF上添加内容的实现方法

这里引入了管道复制文件,将a 复制一份,读取副本,然后写回到原 pdf a 中,最后当然需要删除副本文件。

到这里,无论后续需求怎么变,保证了pdf 的其他属性不变,就能从容面对。

管道复制代码如下:

pubpc static void filechannelcopy(file sources, file dest) {
  try {
 fileinputstream inputstream = new fileinputstream(sources);
 fileoutputstream outputstream = new fileoutputstream(dest);
 filechannel filechannepn = inputstream.getchannel();//得到对应的文件通道
 filechannel filechannelout = outputstream.getchannel();//得到对应的文件通道
 filechannepn.transferto(0, filechannepn.size(), filechannelout);//连接两个通道,并且从in通道读取,然后写入out通道

 inputstream.close();
 filechannepn.close();
 outputstream.close();
 filechannelout.close();
  } catch (exception e) {
 e.printstacktrace();
  }
  }

完整pdf其他内容代码如下:

fileutil.filechannelcopy(new file("e:\\a.pdf"),new file("e:\\a+"tmp".pdf"));
  pdfreader reader = new pdfreader("e:\\a+"tmp".pdf");
  pdfstamper stamper = new pdfstamper(reader, new fileoutputstream("e:\\a.pdf"));
  pdfcontentbyte overcontent = stamper.getovercontent(1);

  //添加文字
  basefont font = basefont.createfont("stsong-pght", "unigb-ucs2-h", basefont.not_embedded);
  overcontent.begintext();
  overcontent.setfontandsize(font, 10);
  overcontent.settextmatrix(200, 200);
  overcontent.showtextapgned(element.apgn_center,"需要添加的文字",580,530,0);
  overcontent.endtext();

  //添加图片
  pdfdictionary pdfdictionary = reader.getpagen(1);
  pdfobject pdfobject = pdfdictionary.get(new pdfname("mediabox"));
  pdfarray pdfarray = (pdfarray) pdfobject;
  image image = image.getinstance("d:\\1.jpg");
  image.setabsoluteposition(100,100);
  overcontent.addimage(image);

  //添加一个红圈
  overcontent.setrgbcolorstroke(0xff, 0x00, 0x00);
  overcontent.setpnewidth(5f);
  overcontent.elppse(250, 450, 350, 550);
  overcontent.stroke();
  stamper.close();

以上这篇生成pdf全攻略之在已有pdf上添加内容的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。