生成PDF全攻略之在已有PDF上添加内容的实现方法
程序员文章站
2024-03-12 14:53: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 上面添加内容的核心代码,具体流程如下
•如果看官老爷够仔细的话,该代码是将原 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上添加内容的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: SpringBoot模板引擎
下一篇: 明明的随机数——疑惑