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

219 阅读4分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

PDF神器iText英文版翻译与学习

作者: 薛大郎.
英文原版:iText in Action 2nd Edition.pdf

坚持. 分享. 成长. 利他 !

一. 前言

书是人类进步的阶梯

体验了三天的更文挑战, 属实不易, 越来越理解和敬仰那些优秀的博主, 能够坚持肝出每一篇内容完整, 条例清楚, 排版图文优秀的文章, 真的为了我们开发的进步铺了路.

有人评论我的更文很短, 在这里弱弱的解释一下: 本人第一次更文挑战, 而且更文要求的是每天都更, 我的更文尽量也都是白天上班时间(晚上顾家), 各位看官大大见谅.我会保证我的更文质量会更进一步, 让大家能够快速的拥有实战和理解的更深.

二.正文.

3. 详解创建Document的五步

3.3 打开Document

使用iText必须打开Document, 也要记得关闭. 调用open()时, 初始化了很多东西:

  • header将写入到outputStream中.
  • pdf的version版本号.
  • 也可以访问到bookmarks书签.
  • document在第二天提到的那些API的setter方法也都必须在打开之前, 然后再打开是就初始化好了. (如果你再打开document后, 然后调用了document的setter方法, 将不生效. )

3.4 添加内容到Document中

这将是我们真的world, 也是我们真正打开主要的战场, 那就是真的添加了很多的元素内容到文档中.

之前提到的之所以说Paragraph为高级元素, 是因为其实iText给我们做了很多的工作, 这些工作其实可以让我们更加的懂得他是怎样实现的, 以及什么叫高级元素, 什么叫低级元素.

helloWorldDirect.png

在这个图片例子中, 我们使用writer获取到了一个PdfContentByte, 这个我们后期在扩展, 我们可以通过这个PdfContentByte, 我们可以画一条线, 可以开始我们的文字编写, 可以这只我们的字体和大小, 而且每行右侧的注释就是我们在往这个PDF文件中所写的byte, 也是PDF设计者所定义的一些格式规范, 然后通过reader等Pdf阅读器, 我们能够欣赏这个PDF神奇(可以缩放, 文件极小, 方便操作, 简直神来之笔)的文件了. 为了能看到PDF的语法, 勿忘记writer.setCompressionLevel(0); 将不会进行压缩;

当你使用iText的时候, 刚开始你会觉得这个样式儿怎么这么难调, 其实这样是iText coder的期望, 需要你耐心的使用数学计算进行样式的调整, 当然coder也提供了一些方便的类和方法:

    Phrase hello = new Phrase("Hello World");
    PdfContentByte canvas = writer.getDirectContentUnder();
    ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, hello, 36, 788, 0);

可以设置这个canvas(画布)之上的元素的样式, 左对齐和margin.

3.5 关闭Document

一般情况下, 使用PDF的时候我们可能这个文件中包含了很多页. 一般金融机构会使用iText创建10w+页的一个大文件, 这时候iText也有很好的机制来处理这种情况下的内存溢出, 它可以尽快将内容通过outputStream异步地从内存中flush到硬盘文件中.

而且我们无需关闭OutputStream, iText也会在%EOF的序列后关闭掉我们的stream. 当然有些情况下, 我们也需要自己来控制stream的关闭. 比如我们想直接生成多个Zip压缩文件的时候:

    ZipOutputStream zip =
        new ZipOutputStream(new FileOutputStream(RESULT));
    for (int i = 1; i <= 3; i++) {
        ZipEntry entry = new ZipEntry("hello_" + i + ".pdf");
        zip.putNextEntry(entry);
        Document document = new Document();
        PdfWriter writer =
            PdfWriter.getInstance(document, zip);
        // 此处可以将自动关闭stream流改为手动.
        writer.setCloseStream(false);
        document.open();
        document.add(new Paragraph("Hello " + i));
        document.close();
        zip.closeEntry();
    }
    zip.close(); // 实际开发中请使用finally块中来关闭. 

总结

到此我们就完成了第一章节的内容, 我们也完成了第一个简单的例子, 也了解了基本的一些iText常用的类, 一些注意事项, 也留下了很多我们后边章节中要扩展深入讲解的一些概念.

这就是我们的第四篇更文挑战内容, 就先到这里, 欲知后文, 且听下文;