Как объединить и повернуть две страницы PDF в одну страницу - PullRequest
3 голосов
/ 17 июня 2019

Я пытаюсь создать 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 голосов
/ 17 июня 2019

Как правило, вы хотите превратить каждую страницу в объект XObject (PdfImportedPage в ответе @ mflorczak) и нарисовать две из них на одной странице.

Если вы заранее знаете, что все страницы имеют одинаковый размер и форму, то вы можете заранее решить, как вы хотите, чтобы они отображались. Если нет, то вы должны быть в состоянии передать потенциально большое количество комбинаций общим способом.

Это называется печатью " N-up ", и об этом много написано в Интернете, если вы хотите узнать больше. Ваш конкретный пример - печать «2-вверх».

  1. получите размеры страниц, которые вы хотите объединить
  2. создайте новую страницу в выходном документе, достаточно большую, чтобы держать их обоих
  3. Создание PdfImportedPage страниц, которые вы хотите импортировать
  4. Нарисуйте импортированные страницы с желаемым выравниванием и вращением на выходной странице PdfContentByte.
  5. Перейти к 1
  6. Недоступен
  7. Profit!

Возможно, вы захотите поэкспериментировать с масштабами и смещениями (и, возможно, вращением) в сравнении с тем, что приведено в ответе @ mflorczak, и приведенная выше общая теория должна помочь вам в этом. PdfImportedPage должен изолировать вас от вращения [s] исходных страниц, так что вам нужно будет только учитывать границы их эффектов.

2 голосов
/ 17 июня 2019

Слияние:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...