如何使用itext将两个PDF页面合并并旋转为一页

3

我正在尝试创建一个Java应用程序,将三个PDF文件合并。前两个PDF我正常合并而没有进行调整和旋转。最后一个PDF我想要旋转并将两个PDF页面放在一个PDF页面中。

我使用了iText 5.5.13。我尝试合并两个PDF文件,它可以工作。

public void mergePdf(List<File> pdfFiles, File outputFile) {
    try {
        Document document = new Document();
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        PdfCopy copy = new PdfSmartCopy(document, outputStream);
        document.open();
        for (File inFile : pdfFiles) {
            PdfReader reader = new PdfReader(inFile.getAbsolutePath());
            copy.addDocument(reader);
            reader.close();
        }
        document.close();
    } catch (DocumentException | IOException ex) {
        ex.printStackTrace();
    }
}

我不知道如何将旋转和重新调整大小与两页合并为一个PDF页面。
2个回答

2

Merge:

public void mergeTwoPagesIntoOne(String originalPdfFile, String outputPdfFile) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(originalPdfFile);
    Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0);
    PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(outputPdfFile));
    doc.open();
    int totalPages = reader.getNumberOfPages();
    for (int i = 1; i <= totalPages; i = i + 2) {
        doc.newPage();
        PdfContentByte cb = writer.getDirectContent();
        PdfImportedPage page = writer.getImportedPage(reader, i); // page #1

        float documentWidth = doc.getPageSize().getWidth() / 2;
        float documentHeight = doc.getPageSize().getHeight();
        if (i > 1)
            documentHeight = documentHeight - 50f;

        float pageWidth = page.getWidth();
        float pageHeight = page.getHeight();

        float widthScale = documentWidth / pageWidth;
        float heightScale = documentHeight / pageHeight;
        float scale = Math.min(widthScale, heightScale);

        float offsetX = (documentWidth - (pageWidth * scale)) / 2;
        float offsetY = 0f;

        cb.addTemplate(page, scale, 0, 0, scale, offsetX, offsetY);

        if (i+1 <= totalPages) {
            PdfImportedPage page2 = writer.getImportedPage(reader, i+1); // page #2

            pageWidth = page.getWidth();
            pageHeight = page.getHeight();

            widthScale = documentWidth / pageWidth;
            heightScale = documentHeight / pageHeight;
            scale = Math.min(widthScale, heightScale);

            offsetX = ((documentWidth - (pageWidth * scale)) / 2) + documentWidth;
            cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY);
        }
    }
    doc.close();
}

旋转:

    public void rotatePdf(String originalPdfFile, String outputPdfFile, int degrees) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(originalPdfFile);
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        PdfDictionary dictionary = reader.getPageN(i);
        dictionary.put(PdfName.ROTATE, new PdfNumber(degrees));
    }
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdfFile));
    stamper.close();
    reader.close();
}

2
通常,您需要将每个页面转换为XObject(@ mflorczak答案中的PdfImportedPage),并将其中两个绘制到单个页面中。
如果您事先知道所有页面的大小和形状相同,则可以在预先决定并硬编码您希望它们出现的方式的情况下完成。如果不是这样,您需要以一种通用的方式处理可能非常多的组合。
这称为“N-up”打印,在互联网上有很多相关内容可供学习。您的特定示例是“2-up”打印。
1.获取要合并的页面的大小 2.在输出文档中创建一个足够大的新页面以容纳它们 3.创建要导入的页面的PdfImportedPage 4.使用所需的对齐和旋转在输出页面的PdfContentByte上绘制导入的页面。 5.返回步骤1 6.无法到达 7.利润!
您可能希望尝试使用比@mflorczak的答案提供的比例和偏移(以及可能的旋转)更多的变化,上述一般理论应该能够帮助您进行指导。 PdfImportedPage 应该会隔离源页面的旋转,因此您只需要考虑它们对边框的影响即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接