Ошибка в косвенном объекте с некоторым PDF при разбиении / объединении - PullRequest
0 голосов
/ 22 мая 2018

Мне нужно разделить или объединить некоторые PDF, и у меня есть несколько редких PDF, которые создают следующее исключение.

com.itextpdf.kernel.PdfException: Pdf indirect object belongs to other PDF document. Copy object to current pdf document.at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:216)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:206)
at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:112)
at com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java:393)
at com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:301)
at com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1743)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:183)
at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:152)
at com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:94)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:505)
at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:462)
at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:847)
at testPDF.PDF.splitByPage(PDF.java:564)
at testPDF.Main.main(Main.java:153)

После небольшого поиска я обнаружил этот пост о схожей проблеме:

Itext7 генерирует PDF с исключением "Pdf косвенный объект принадлежит другому документу PDF. Копировать объектк текущему документу pdf. "

В моем случае я только разделяю и объединяю pdf, я не касаюсь содержимого pdf, поэтому я не знаю, почему происходит это исключение.(Из того, что я понял, исключение связано с проблемой копирования какого-либо шрифта).

Мой код следующий:

public static void splitByPage(File pdfToSplit, int nbPageByPDF){
    try {
        // Open the document in reading mode
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfToSplit));

        List<PdfDocument> splitDocuments = new PdfSplitter(pdfDoc) {
            int partNumber = 1;

            @Override
            protected PdfWriter getNextPdfWriter(PageRange documentPageRange) {
                try {
                    return new PdfWriter(pdfToSplit.getAbsolutePath()
                                                   .substring(0,
                                                              pdfToSplit.getAbsolutePath()
                                                                        .lastIndexOf(".")
                                                              ) 
                                            + "splitPage_part" 
                                            + String.valueOf(partNumber++) 
                                            + ".pdf");
                } catch (FileNotFoundException e) {
                    throw new RuntimeException();
                }
            }
        }.splitByPageCount(nbPageByPDF);

        // Close all the part created
        for (PdfDocument doc : splitDocuments) {
            doc.close(); // exception throws at the first closing
        }

        // Close the initial pdf to split
        pdfDoc.close();

    }

Этот код основан на следующем примере: https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-splitting-pdf-file

При объединении возникает та же ошибка, когда я пытаюсьзакройте новый PDF-файл, где я добавил PDF-файл, вызывающий исключения.(Но я могу сделать это по-другому. Я могу добавить другой PDF-файл (без этой проблемы) в PDF-файл с проблемой).

Я думаю, что мне нужно найти способ скопировать шрифт непосредственно изисходный pdf для каждого pdf-файла, который я создаю, но я не могу найти способ сделать это.

При необходимости я могу отправить вам конфиденциально pdf, с которым возникает ошибка, только конфиденциально, так как этот pdfнемного конфиденциально.

Заранее благодарен за любую помощь или предложение.

1 Ответ

0 голосов
/ 30 мая 2018

Эта проблема уже была исправлена ​​в текущем состоянии версии разработки 7.1.3-SNAPSHOT.Точнее, это было исправлено в коммите 251606e55768a47cb68eb8c58f2f5fe36324d85b от 2018-04-23 13:46:25 в ходе решения проблемы DEVSIX-1913 (исправление копирования унаследованных записей страницы).

Причина была в том, что вPdfPage.copyInheritedProperties(PdfPage, PdfDocument) для некоторых свойств значения были добавлены как есть к целевому документу.

Это нормально для прямых объектов;так как в большинстве PDF-файлов значения этих свойств являются прямыми объектами, это довольно долго оставалось незамеченным.

Рассматриваемое свойство страницы - CropBox , которое в вашем примере документа оказываетсянаследуется от корня дерева страниц и имеет косвенное значение.

Таким образом, вы можете либо

  • дождаться выпуска 7.1.3, либо
  • используйте 7.1.3-SNAPSHOT или
  • , чтобы отправить исправление в вашу версию iText.В этом случае вам просто нужно заменить

    copyPdfPage.put(PdfName.CropBox, cropBox);
    

    на

    copyPdfPage.put(PdfName.CropBox, cropBox.copyTo(pdfDocument));
    

    в PdfPage.copyInheritedProperties(PdfPage, PdfDocument).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...