我想用iText做以下事情:
(1)解析现有的PDF文件
(2)在文档的现有单页上添加一些数据(例如时间戳)
(3)写出文件
我似乎无法弄清楚如何用iText做到这一点 . 在伪代码中,我会这样做:
Document document = reader.read(input);
document.add(new Paragraph("my timestamp"));
writer.write(document, output);
但由于某些原因,iText的API非常复杂,我无法绕过它 . PdfReader实际上保存文档模型或其他东西(而不是吐出文档),你需要一个PdfWriter来读取它的页面......呃?
4 回答
iText有多种方法可以做到这一点 .
PdfStamper
类是一个选项 . 但我发现最简单的方法是创建一个新的PDF文档,然后将现有文档中的各个页面导入到新的PDF中 .这将从
templateInputStream
读取PDF并将其写入outputStream
. 这些可能是文件流或内存流或任何适合您的应用程序 .Gutch的代码很接近,但它只能在以下情况下正常工作:
没有注释(链接,字段等),没有文档结构/标记内容,没有书签,没有文档级脚本等,等等......
页面大小恰好是A.4(不错的赔率,但它碰巧碰到了't work on any ol' PDF)
您不介意丢失所有原始文档元数据( 生产环境 者,创建日期,可能是作者/ Headers /关键字),也可能是文档ID . 你 can't 复制创建日期和文档ID,除非你对iText本身做了一些非常深刻的hackery) .
批准的方法是反过来做 . 使用PdfStamper打开现有文档,并使用getOverContent()返回的PdfContentByte将文本(以及您可能需要的任何其他内容)直接写入页面 . 不需要第二份文件 .
并且您可以使用ColumnText来处理布局等等...无需使用beginText(),setFontAndSize(),drawText(),drawText()...,endText()进行处理 .
这是我能想象到的最复杂的场景:我有一个用Ilustrator创建并用Acrobat修改的PDF文件,用AcroFields(AcroForm),我将用这个Java代码填充数据,这个PDF文件的结果是添加文档后,将修改字段中的数据 .
实际上,在这种情况下,我动态生成一个添加到PDF的背景,该背景也是使用具有未知数据或页面数量的文档动态生成的 .
我正在使用JBoss,这段代码在JSP文件中(应该可以在任何JSP Web服务器中使用) .
注意:如果您使用的是IExplorer,则必须使用POST方法提交HTTP表单才能下载该文件 . 如果没有,您将在屏幕上看到PDF代码 . 这不会发生在Chrome或Firefox中 .
还有另一种解决方案更简单,并解决了您的问题 . 这取决于您要添加的文本量 .