php和java混合编程 pdf_java_生成PDF全攻略之在已有PDF上添加内容的实现方法,项目在变,需求在变,不变的 - phpStudy...

生成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上添加内容的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持phpstudy。相关阅读:

C#使用Object类实现栈的方法详解

将php数组输出html表格的方法

PHP中使用file_get_contents post数据代码例子

ajax遍历xml文档的方法

win10为什么不显示缩略图只能看到图标?

SublimeText自带格式化代码功能之reindent

简单封装js的dom查询实例代码

jQuery实现订单提交页发送短信功能前端处理方法

php处理json格式数据经典案例总结

C#进度轴控件分享

使用CXF和Jersey框架来进行Java的WebService编程

JQuery与Ajax调用新浪API获取短网址的代码

android 中去掉窗口全屏显示的简单方法

C#记录消息到日志文件的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值