【问题标题】:iText -> how to do PDF Page ImpositioniText -> 如何进行 PDF 页面拼版
【发布时间】:2014-07-22 00:07:30
【问题描述】:

有人可以展示一个使用 iText 进行 PDF 页面拼版的工作代码示例吗? 看来我已经用尽了我的 Google 选项:那里没有代码示例。

谢谢,

内部管弦乐队

ps:拼版是一个印刷技术术语,我的意思是,例如,一张 11x17 的纸可以容纳两个 8.5x11 的页面。对于名片,这将是相同的页面 (3.75x2.25),而对于小册子则不会,因为纸张会被折叠,并且页面位置会因小册子设置而异。

【问题讨论】:

    标签: java pdf pdf-generation itext imposition


    【解决方案1】:

    阅读 Chapter 6 of my book 或查看 iText 网站上的示例,您可以节省大量时间。以NUpTool 为例。当您在印刷行业工作时,您应该熟悉术语“N-upping”。这是当您获取一份文档,然后创建一个新的文档,其中 2 页合一(2-upping)、4 页合一(4-upping)等...

    您的请求非常相似,但更容易实现,因为当我们获取一个文档时,比如说text_on_stationery.pdf 并且我们使用我书中的示例将其放大 2 倍,您必须缩小页面,例如在文档result2up.pdf

    在您的情况下,这并不难,因为您不需要扩展任何东西。您只需要创建一个大小为原始文档两倍的Document 对象,创建PdfImportedPage 对象以导入页面,并使用具有正确偏移量的addTemplate() 将它们并排添加到新文档中。

    有相当多的例子可以证明PdfImportedPage的用法:http://itextpdf.com/themes/keyword.php?id=236

    奇怪的是,Google 在查找“imposing”时没有向您显示 SuperImposing 示例。在这个例子中,我们添加了四个不同的层:

    PdfReader reader = new PdfReader(SOURCE);
    // step 1
    Document document = new Document(PageSize.POSTCARD);
    // step 2
    PdfWriter writer
        = PdfWriter.getInstance(document, new FileOutputStream(RESULT));
    // step 3
    document.open();
    // step 4
    PdfContentByte canvas = writer.getDirectContent();
    PdfImportedPage page;
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        page = writer.getImportedPage(reader, i);
        canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
    }
    // step 5
    document.close();
    reader.close();
    

    换句话说,一个 4 页的文档现在是一个 1 页的文档,其中所有页面都呈现在彼此的顶部。你现在需要做的是,改变第1步,使新页面的维度不同,并适应第4步,使两个页面相邻添加,每两个页面后添加一个新页面:

    page = writer.getImportedPage(reader, i);
    canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
    i++;
    if (i <= reader.getNumberOfPages())
    page = writer.getImportedPage(reader, i);
    canvas.addTemplate(page, 1f, 0, 0, 1, width / 2, 0);
    document.newPage();
    

    在这个例子中,我假设原始文档的高度等于新文档的高度,并且新文档的width 是原始文档宽度的两倍。不用说,您也可以选择创建一个具有相同宽度和双倍高度的新文档。在这种情况下,您需要:

    page = writer.getImportedPage(reader, i);
    canvas.addTemplate(page, 1f, 0, 0, 1, 0, height / 2);
    i++;
    if (i <= reader.getNumberOfPages())
    page = writer.getImportedPage(reader, i);
    canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
    document.newPage();
    

    【讨论】:

    • Lowagie 先生,非常感谢您花时间回答我的问题。我会把你的书添加到我的图书馆。我没有立即找到您在搜索时提到的样本......(回想起来,我祝贺您网站的工作搜索框)。再次感谢您,布鲁诺,抽出宝贵的时间。非常感谢。
    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多