PDFBox объединить 2 PDF-файлы бок о бок с Java - PullRequest
0 голосов
/ 06 октября 2018

Я сравниваю 2 файла PDF и отмечаю их подсветкой.Когда я использую pdfbox, чтобы объединить его для сравнения.В нем отсутствует ошибка.

combine pdfs

Я использую эту функцию: Функция для слияния двух файлов pdf со всеми страницами из нихбок о бок.

function void generateSideBySidePDF() {
    File pdf1File = new File(FILE1_PATH);
    File pdf2File = new File(FILE2_PATH);
    File outPdfFile = new File(OUTFILE_PATH);
    PDDocument pdf1 = null;
    PDDocument pdf2 = null;
    PDDocument outPdf = null;
    try {

        pdf1 = PDDocument.load(pdf1File);
        pdf2 = PDDocument.load(pdf2File);

        outPdf = new PDDocument();
        for(int pageNum = 0; pageNum < pdf1.getNumberOfPages(); pageNum++) {
            // Create output PDF frame
            PDRectangle pdf1Frame = pdf1.getPage(pageNum).getCropBox();
            PDRectangle pdf2Frame = pdf2.getPage(pageNum).getCropBox();
            PDRectangle outPdfFrame = new PDRectangle(pdf1Frame.getWidth()+pdf2Frame.getWidth(), Math.max(pdf1Frame.getHeight(), pdf2Frame.getHeight()));

            // Create output page with calculated frame and add it to the document
            COSDictionary dict = new COSDictionary();
            dict.setItem(COSName.TYPE, COSName.PAGE);
            dict.setItem(COSName.MEDIA_BOX, outPdfFrame);
            dict.setItem(COSName.CROP_BOX, outPdfFrame);
            dict.setItem(COSName.ART_BOX, outPdfFrame);
            PDPage outPdfPage = new PDPage(dict);
            outPdf.addPage(outPdfPage);

            // Source PDF pages has to be imported as form XObjects to be able to insert them at a specific point in the output page
            LayerUtility layerUtility = new LayerUtility(outPdf);
            PDFormXObject formPdf1 = layerUtility.importPageAsForm(pdf1, pageNum);
            PDFormXObject formPdf2 = layerUtility.importPageAsForm(pdf2, pageNum);

            // Add form objects to output page
            AffineTransform afLeft = new AffineTransform();
            layerUtility.appendFormAsLayer(outPdfPage, formPdf1, afLeft, "left" + pageNum);
            AffineTransform afRight = AffineTransform.getTranslateInstance(pdf1Frame.getWidth(), 0.0);
            layerUtility.appendFormAsLayer(outPdfPage, formPdf2, afRight, "right" + pageNum);
        }
        outPdf.save(outPdfFile);
        outPdf.close();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (pdf1 != null) pdf1.close();
            if (pdf2 != null) pdf2.close();
            if (outPdf != null) outPdf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1 Ответ

0 голосов
/ 07 октября 2018

Вставьте это в свой код после сегмента «Исходные страницы PDF необходимо импортировать», чтобы скопировать аннотации.У правого PDF должен быть перемещен прямоугольник.

// copy annotations
PDPage src1Page = pdf1.getPage(pageNum);
PDPage src2Page = pdf2.getPage(pageNum);
for (PDAnnotation ann : src1Page.getAnnotations())
{
    outPdfPage.getAnnotations().add(ann);                
}
for (PDAnnotation ann : src2Page.getAnnotations())
{
    PDRectangle rect = ann.getRectangle();
    ann.setRectangle(new PDRectangle(rect.getLowerLeftX() + pdf1Frame.getWidth(), rect.getLowerLeftY(), rect.getWidth(), rect.getHeight()));
    outPdfPage.getAnnotations().add(ann);                
}

Обратите внимание, что у этого кода есть недостаток - он работает только с аннотациями с потоком внешнего вида (у большинства он есть).Это будет иметь странные эффекты для тех, кто не будет, в этом случае придется корректировать координаты в зависимости от типа аннотации.Для бликов это будут квадрупоты, для линии - координаты линии и т. Д. И т. Д.

...