[更文挑战]iText番盘-PDF神器-24

260 阅读3分钟

「这是我参与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文件就是这样的. 文件中的半页内容的复制到另外一个文件中, 他也是当作一整页来处理的. 不会去将内容重新编制.