当前位置: 移动技术网 > IT编程>开发语言>Java > 生成PDF全攻略之在已有PDF上添加内容的实现方法

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

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 上面添加内容的核心代码,具体流程如下

•如果看官老爷够仔细的话,该代码是将原 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);

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

这里引入了管道复制文件,将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上添加内容的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网