Я не могу дать вам конкретный исходный код, но могу объяснить, как это сделать на очень низком уровне.Кроме того, то, что вы ищете, похоже на то, что называется наложением в издательской индустрии.
Вы начинаете так же, как слияние, что означает извлечение страниц из другого документа.Вы должны ввести все зависимости страницы рекурсивно.Но будьте осторожны, чтобы избежать бесконечных циклов, которые существуют в PDF, поэтому вы должны отслеживать посещаемый объект.Не используйте рекурсивные функции, потому что ваш стек легко переполняется, ссылки в PDF могут быть очень глубокими.Вы должны реализовать рекурсию обхода в куче (Поиск в глубину в порядке).
Ключом к штамповке PDF в PDF является превращение исходного объекта Page в форму XObject (не смешивать с AcroForms или заполнять с возможностью заполнения).поля формы).Форма XObject очень похожа на объект Page со следующими исключениями:
-
/Type /Page
становится /Type /XObject /Subtype /Form
. - Страница
MediaBox
и CropBox
вместестать /BBox
в форме.Но будьте осторожны, они оба могут быть унаследованы через дерево страниц, поэтому вы должны искать унаследованные атрибуты. - Страница
Rotate
(также наследуемая) становится Matrix
, что является преобразованием (вращением)матрица, а не угол. - * * * * * * * * * * * * * *
Metadata
страницы могут быть введены без изменений и добавлены к объекту формы. - Страница
Contents
поток долженперенести в форму.Однако страница Contents
является внешним объектом и может быть массивом, что означает, что вам нужно объединить части.Форма XObject является потоковым объектом. - Все остальные атрибуты хитры, и вы можете игнорировать их, если не уверены.
Как только это будет сделано, все, что вам нужносделать, это нарисовать форму XObject на новой странице.Вы должны сгенерировать уникальное имя для XObject и добавить его к странице Resources
.Само рисование представляет собой серию операторов cm
и Do
, как рисование изображения.Если вам нужно обрезать исходный контент, то вам также нужно установить обтравочный контур до Do
.
Излишне говорить, что это далеко не тривиально, и есть много подводных камней.Я реализовал это, и я могу сказать вам, что это действительно работает, но это сложнее, чем кажется.У вас должна быть очень хорошая низкоуровневая библиотека PDF и очень глубокое понимание спецификаций PDF.
Я не обсуждал некоторые другие детали, такие как управление цветом (что если вы рисуете DeviceRGB на управляемыхCMYK), PDF / A, PDF / X, передача полей аннотаций и форм и т. Д.
Если это не для вас, вам следует искать библиотеку наложения с открытым исходным кодом, потому что она работает практически так же,Верстка означает размещение двух или более страниц на чистом листе бумаги с целью печати книги или флаера.У меня тоже есть коммерческое решение.