Вопрос или проблема
Мне нужно автоматически создать PDF-файл (предпочтительно через пакетный процесс/командную строку, оптимально было бы что-то основанное на XSLT/SAXON).
PDF будет содержать много страниц (около 500), и каждая страница будет состоять только из набора (частично перекрывающихся) изображений (в масштабируемом формате, например, SVG или WMF).
Но есть всего лишь базовый набор из ~20 изображений, используемых для этого, и различные страницы отличаются друг от друга только конкретным выбором из этих 20 изображений.
Проблема: если я использую XSL-FO и передаю его в Apache FOP, то результатом будет PDF размером примерно 300 МБ, потому что данные изображений передаются несколько раз в PDF.
Теперь я ищу возможность создать PDF таким образом, чтобы данные изображений этих 20 изображений присутствовали только один раз в PDF, и каждая PDF-страница использовала только “ссылки”/ссылки на этот набор данных изображений (так что итоговый PDF-файл имеет размер всего ~2 МБ).
Я знаю, что язык PDF как таковой имеет такие ссылки, но, конечно, я не заинтересован в том, чтобы создавать PDF-файл напрямую, “на низком уровне”;-)
Любая помощь/идеи будут высоко оценены! Большое спасибо!
Report Lab имеет как программное обеспечение с открытым исходным кодом для выполнения такого рода задач (на Python), так и платный инструмент Report Lab Plus, который вы можете использовать через их язык разметки отчетов (RML).
Вы можете легко достичь этого с помощью PDFTron PDFNet.
Image shared_img_object = Image.Create(doc, input_path + "peppers.jpg");
// затем для каждой страницы добавьте изображение таким образом
Element element = builder.CreateImage(shared_img_object, new Matrix2D(sx, 0, 0, sy, dx, dy));
writer.WritePlacedElement(element);
Смотрите примеры AddImage или ElementBuilder для более подробной информации.
В конце концов, я решил в пользу хорошо известного, устоявшегося инструмента “(обычный) pdfTeX”. Его макросы \pdfximage и \pdfrefximage предлагают именно то, что мне нужно.
(Конечно, pdfTeX не может обрабатывать SVG, но преобразование моих SVG-изображений в набор PDF-файлов не стало проблемой, особенно поскольку это нужно было сделать только один раз.)
В результате у меня теперь есть XSLT, который преобразует мой входной XML в (обычный) pdfTeX, и все преобразование работает удивительно быстро на современных ПК.
Ответ или решение
Создание PDF-документа с повторным использованием изображений: эффективные решения
При создании больших PDF-файлов с множеством страниц, содержащих повторяющиеся изображения, важно быть внимательным к размеру конечного файла. Как вы уже заметили, стандартные методы могут привести к значительному увеличению размера файла из-за дублирования данных изображений. Однако существуют технологии и инструменты, которые позволяют оптимизировать этот процесс, предоставляя возможность повторно использовать изображения и ссылаться на них без необходимости многократного встраивания в документ.
Основные подходы к решению задачи
-
PDFTron PDFNet: Это мощный инструмент для работы с PDF, который предоставляет API для программирования. С помощью этого инструмента можно создать объект изображения один раз и повторно использовать его на разных страницах, что существенно экономит место. Пример кода, который иллюстрирует этот метод:
Image shared_img_object = Image.Create(doc, input_path + "image.jpg"); Element element = builder.CreateImage(shared_img_object, new Matrix2D(sx, 0, 0, sy, dx, dy)); writer.WritePlacedElement(element);
Это обеспечивает легкость в интеграции и дает возможность управлять размерами и положением изображения.
-
ReportLab: Этот инструмент также позволяет создавать PDF-документы с возможностью повторного использования изображений. Использование их Report Markup Language (RML) позволяет легко управлять изображениями и добиваться оптимизации файла. Важно отметить, что ReportLab поддерживает множество форматов изображений, что упрощает процесс подготовки материалов.
-
pdfTeX: Это еще один хороший выбор для создания PDF-документов. Использование команд
\pdfximage
и\pdfrefximage
позволяет включать изображение в документ только один раз, а затем ссылаться на него повторно. Хотя pdfTeX не поддерживает SVG напрямую, можно предварительно конвертировать изображения в PDF-формат, что делает этот метод очень быстрым и эффективным.
Перенос данных с помощью XSLT
Ваша задача по автоматизации процесса создания PDF-документов с использованием XSLT вполне выполнима. Вы можете разработать XSLT-трансформацию, которая преобразует ваши исходные XML-данные в подходящий для pdfTeX или другого выбранного вами инструмента формат. Это позволяет интегрировать вашу систему для пакетной обработки и автоматизации.
Выводы
Существует несколько эффективных инструментов и подходов для создания PDF-документов с минимальным размером при условии повторного использования изображений. Выбор между PDFTron PDFNet, ReportLab и pdfTeX зависит от ваших потребностей и предпочтений. Все предложенные варианты позволяют автоматически генерировать PDF-файлы, сохраняя высокое качество изображений и уменьшая общий размер файлов.
Если у вас возникнут дополнительные вопросы или потребуется консультация по какому-либо из методов, не стесняйтесь обратиться за поддержкой.