【问题标题】:Merge pdf documents into a single page iText将 pdf 文档合并为单页 iText
【发布时间】:2015-12-02 14:34:49
【问题描述】:

我正在尝试将多个 pdf 页面合并为一个 pdf 页面。 有很多 iText 示例展示了如何将 pdf 页面合并到一个文件中,但我需要将所有页面都放入一个页面中(沿途缩小它们的宽度和高度)

    String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
// step 1
Document document = new Document();
// step 2
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
PdfReader reader;
int n;
// loop over the documents you want to concatenate
for (int i = 0; i < files.length; i++) {
    reader = new PdfReader(files[i]);
    // loop over the pages in that document
    n = reader.getNumberOfPages();
    for (int page = 0; page < n; ) {
        copy.addPage(copy.getImportedPage(reader, ++page));
    }
    copy.freeReader(reader);
    reader.close();
}
// step 5
document.close();

编辑: 从here 尝试了这段代码,但它只是将 pdf 页面合并为 1 个文件,我需要将它们缩小为 1 个单页

【问题讨论】:

  • 你能详细说明“不快乐”吗?它创造了一份沉闷的报纸?将您的文档转换为折叠帽?打印出来全黑?请edit您的问题以添加缺少的信息。
  • 对不起,我的意思是它不会合并到单个页面中,而是合并到具有多个页面的单个文件中。我需要将 4 个不同 pdf 文件中的 4 页合并到 1 个包含所有 4 页的单个 pdf 表中(全部缩小到原始大小的 25%)

标签: java pdf itext


【解决方案1】:

因为您不想希望将页面原样复制为新文档的单个页面(这是最常见的合并 pdf 文档用例),但是相反希望所有页面都适合单个页面(沿途缩小它们的宽度和高度,单独的 code source you referenced 并不能满足您的需要:那里的代码重点关于常见用例。

您的用例更像是一个 n-up 用例。因此,您应该查看 n-up iText 示例。最明显的是NUpTool,其中的焦点代码是这样的:

public void manipulatePdf(String src, String dest, int pow)
    throws IOException, DocumentException {
    // reader for the src file
    PdfReader reader = new PdfReader(src);
    // initializations
    Rectangle pageSize = reader.getPageSize(1);
    Rectangle newSize = (pow % 2) == 0 ?
        new Rectangle(pageSize.getWidth(), pageSize.getHeight()) :
        new Rectangle(pageSize.getHeight(), pageSize.getWidth());
    Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());
    for (int i = 0; i < pow; i++) {
        unitSize = new Rectangle(unitSize.getHeight() / 2, unitSize.getWidth());
    }
    int n = (int)Math.pow(2, pow);
    int r = (int)Math.pow(2, pow / 2);
    int c = n / r;
    // step 1
    Document document = new Document(newSize, 0, 0, 0, 0);
    // step 2
    PdfWriter writer
       = PdfWriter.getInstance(document, new FileOutputStream(String.format(dest, n)));
    // step 3
    document.open();
    // step 4
    PdfContentByte cb = writer.getDirectContent();
    PdfImportedPage page;
    Rectangle currentSize;
    float offsetX, offsetY, factor;
    int total = reader.getNumberOfPages();
    for (int i = 0; i < total; ) {
        if (i % n == 0) {
            document.newPage();
        }
        currentSize = reader.getPageSize(++i);
        factor = Math.min(
            unitSize.getWidth() / currentSize.getWidth(),
            unitSize.getHeight() / currentSize.getHeight());
        offsetX = unitSize.getWidth() * ((i % n) % c)
          + (unitSize.getWidth() - (currentSize.getWidth() * factor)) / 2f;
        offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n) / c) + 1))
          + (unitSize.getHeight() - (currentSize.getHeight() * factor)) / 2f;
        page = writer.getImportedPage(reader, i);
        cb.addTemplate(page, factor, 0, 0, factor, offsetX, offsetY);
    }
    // step 5
    document.close();
    reader.close();
}

(NUpTool.java)

此方法将 PDF src 的页面排列在具有 2pow 源的文档 dest 中每个目标页面上的页面。


因此,对于您的用例,在将页面合并到一个文件中之后,您只需在上面的例程中使用 @ 的最小值对该单个文件进行后处理987654326@ 其中 2pow 不小于原始页数。

【讨论】:

  • 正是我需要的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2014-10-25
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
相关资源
最近更新 更多