当前位置: 首页 > 知识库问答 >
问题:

合并pdf文档到一个单页iText

狄元魁
2023-03-14

我正在尝试将多个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();

编辑:尝试从这里这个代码,但它只是合并成一个文件的pdf页面,我需要他们收缩成一个单一的页面

共有1个答案

澹台衡
2023-03-14

因为您不希望将页面复制为新文档的单个页面(这是最常见的合并pdf文档用例),而是希望所有页面都适合单个页面(一路上缩小它们的宽度和高度,您单独引用的代码源并不满足您的需要:那里的代码侧重于常见用例。

您的用例让人想起更多的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的页面排列在一个文档中,每个目标页面上有2个源页面。

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

 类似资料:
  • 主要内容:合并多个PDF文档,示例在前一章中,我们已经看到如何将给定的PDF文档分成多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 使用类的类将多个PDF文档合并到单个PDF文档中,该类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态

  • 在上一章中,我们已经了解了如何合并多个PDF文档。 在本章中,我们将了解如何从PDF文档的页面中提取图像。 从PDF文档生成图像 PDFBox库为您提供了一个名为PDFRenderer的类, PDFRenderer PDF文档呈现为AWT BufferedImage。 以下是从PDF文档生成图像的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态方法load()加载现有PDF文档

  • 在上一章中,我们已经了解了如何将给定的PDF文档拆分为多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 您可以使用名为PDFMergerUtility类的类将多个PDF文档合并到一个PDF文档中,此类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态方法load

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 我有一个PDF文档,有两页。我需要阅读此文档的第一页,并使用阅读内容创建一个新的PDF文档。我将如何使用iText执行此操作?到目前为止,我无法尝试任何事情,因为我真的不知道如何开始。最好的方法是什么?

  • 我在用iText7做游戏。净c#。我正在尝试在内存中创建一个多页PDF文档(n页数),其中源PDF文档只包含一页。 我可以用一页创建一个新文档,但无法根据需要创建额外的页面。我试过了 但我得到了一个ArgumentOutOfRange例外。。。索引超出范围。。。等 我试图关闭destPdfDoc,然后重新打开它,认为第二页直到我关闭它才被写入。但是当第二次打开destPdfDoc时,它没有页面。我

  • 如果我有一些文件,每个文件都有一个页面,我想使用 我在这里读到了几十个关于相同的问题,但大多数问题都已经过时或不再适用于