Метод copyPagesTo PdfDocument или метод copyAsFormXObject PdfCanvas для копирования содержимого из PDF в PDF

Я следовал руководству по этому URL-адресу: http://developers.itextpdf.com/content/itext-7-jump-start-tutorial/chapter-6-reusing-existing-pdf-documents

Следуя этому руководству, у меня возникла проблема, когда некоторый контент из PDF-файла не был скопирован в целевой PDF-файл при использовании copyAsFormXObject (для которого я отправил запрос в службу поддержки). Альтернативой, которую я нашел в то же время, было то, что я мог использовать метод copyPagesTo PdfDocument и просто открыть страницу, которая была скопирована с помощью getPage, в целевом PDF-файле. Исходя из этого, я могу создать PdfCanvas из существующей страницы и выполнить наши преобразования (например, масштабирование) на объекте.

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

Есть ли какие-либо недостатки в использовании метода copyPagesTo для копирования содержимого, в отличие от того, что предлагает руководство (copyAsFormXObject)? Производительность, память или посторонний невидимый контент и т.д.?

Код, демонстрирующий эту проблему:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfDocument origPdf = new PdfDocument(new PdfReader(src));
PdfPage origPage = origPdf.getPage(1);

PdfPage page = pdf.addNewPage();
PdfCanvas canvas = new PdfCanvas(page);
PdfFormXObject pageCopy = origPage.copyAsFormXObject(pdf);
canvas.addXObject(pageCopy, 0, 0);

pdf.close();
origPdf.close();

Код, которого нет:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfDocument origPdf = new PdfDocument(new PdfReader(src));
origPdf.copyPagesTo(1,2,pdf);

pdf.close();
origPdf.close();

person Biggert    schedule 31.08.2016    source источник
comment
Разве я не писал, что вся интерактивность пропадает при копировании страницы как PdfFormXObject. Я должен проверить и добавить это, потому что любому, кто знаком с PDF, очевидно, что страница имеет запись /Annots, но эти /Annots никогда не могут быть частью XObject. Если это не ясно из учебника, пожалуйста, объясните, как я могу улучшить текст.   -  person Bruno Lowagie    schedule 01.09.2016
comment
Ага, теперь я вижу, вы имели в виду руководство по началу работы, а не это: developers.itextpdf.com/content/itext-7-building-blocks/ Начальное руководство предназначено только для того, чтобы вы начали; это не предназначено для подробностей.   -  person Bruno Lowagie    schedule 01.09.2016
comment
@Biggert Хотя Бруно, вероятно, уже намекнул на правильную причину, нам понадобится ваш основной код и ваш PDF-файл, чтобы воспроизвести проблему и проверить анализ.   -  person mkl    schedule 01.09.2016
comment
@BrunoLowagie Спасибо за ссылку, я нашел ее очень информативной. В поисках лучшего инструмента для проверки PDF на уровне объекта я нашел ваш отличный инструмент rups, поэтому я активно исследую, чем этот PDF отличается от других. Тем временем я добавил пример кода в этот пост и свой запрос в службу поддержки. Я также пытаюсь получить неконфиденциальную версию PDF.   -  person Biggert    schedule 01.09.2016
comment
@Biggert Я также пытаюсь получить неконфиденциальную версию PDF. - Когда вы ее получите, убедитесь, что проблема воспроизводится с этим документом.   -  person mkl    schedule 01.09.2016
comment
Нам удалось получить неконфиденциальную версию PDF, и в ней обнаружена та же проблема. Билет службы поддержки — SUP-1554.   -  person Biggert    schedule 01.09.2016


Ответы (1)


Я предоставил код и ответы для конкретной проблемы в вашем запросе в службу поддержки.

Что касается разницы между copyToPages() и copyAsFormXObject() для копирования страниц:

copyToPages() — это высокоуровневый метод, который копирует всю страницу, сохраняя всю структуру и добавляя любые применимые ресурсы в новый документ.

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

Хотя копирование с использованием низкоуровневых методов, таких как XObjects, дает намного больше контроля над тем, как может выглядеть результат, они сопряжены со своими опасностями и ловушками. Для повсеместных задач, таких как копирование страниц, лучше использовать методы высокого уровня, чтобы избежать таких возможных проблем.

РЕДАКТИРОВАТЬ: мы решили, что это поведение является ошибкой и что 'copyAsFormXObject()' должен включать используемые ресурсы, даже если они хранятся на уровне /Pages. Это будет исправлено в более позднем выпуске iText.

person Samuel Huylebroeck    schedule 06.09.2016