「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
PDF神器iText英文版翻译与学习
作者: 薛大郎.
英文原版: iText in Action 2nd Edition.pdf
坚持. 分享. 成长. 利他 !
一. 前言
产品和开发不对付是与生俱来的
产品很苦, 开发也很苦. 作为开发你抱怨过吗?
产品和开发 分工完全不一样. 苦法也不再一层面上. 开发逻辑和实现的不确定性, 不可预见性, 使得在评估时间的精确程度跟产品制作文档和Prd不在一个量级上.
-
开发 → 产品: 大部分愿意转. 因为我国开发年龄的现象, 逻辑赶不上了. 可以做产品.
-
产品 → 开发: 大部分没有愿意转. 大多数觉得自己逻辑不行, 英语不行, 根本原因是技术卷的更苦.
二.正文.
1.4 PdfStamper继续探究
上一篇写道 AcroFields form = stamper.getAcroFields()
. 这里有可能会遇到一些异常.
FAQ:
-
有时候我们会遇到
DoumentException
, 报错信息为This AcroFileds instance is read only.
(这个AcroField为只读实例). 如果遇到这个问题是因为 getAcroFields方法是使用的 PdfReader#getAcroFields方法. PdfStamper也有这个方法. 而如果我们想填充field的画, 请使用 PdfStamper#getAcroFields方法. -
有时候也会遇到
DoumentException
, 报错信息为The original document was reused. Read it again from file.
(这个源Document已经使用过了, 请从文件中重新读取). 如果遇到这个问题, 那可能是因为在循环中, 认为是同样的PdfReader, 就在循环外的拿到循环里边使用了. 其实解决起来比较简单, 就是拉到循环里边来, 因为PdfReader只能用于一个PdfStamper实例来使用.
// PdfStamper 中.
if (reader.isTampered())
throw new DocumentException(MessageLocalization.getComposedMessage("the.original.document.was.reused.read.it.again.from.file"));
reader.setTampered(true);
关于Form表单填充的就先讲到这里. 因为还涉及到很多中Form, 不是只有AcroFields这种类型, 其他的将在后边章节中继续深入讲解.
1.5 使用PdfCopy来复制页面
一说到复制, 开发人员来说是最喜欢的. 尤其是CV开发攻城狮.
当我们想从很多的Pdf文件中去组装成出来一个document, 那就需要使用PdfCopy了. PdfCopy 也继承自 PdfWriter.上一篇的例子中就有相关介绍.
这篇我们主要关注从多个Pdf文件中来复制到一个Document中.
// 多个Pdf文件路径
String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
Document document = new Document();
// 当作一个PdfWriter来使用, 输出到一个文件中
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
document.open();
PdfReader reader;
int n;
for (int i = 0; i < files.length; i++) {
// 读取一个文件
reader = new PdfReader(files[i]);
n = reader.getNumberOfPages();
// 全部复制到document中.
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
}
document.close();
这里我们在做demo的时候会发现, 怎么合并后的文件会出现很多空白页, 或者半页没完, 也合并不到一起. 还是要强调, Pdf文件就是这样的. 文件中的半页内容的复制到另外一个文件中, 他也是当作一整页来处理的. 不会去将内容重新编制.