Часто проблема связана со встроенными шрифтами.
Видите ли, PDF действительно стремится сохранить ваш документ в точности так, как вы его сделали.
Для этого библиотека PDF может решить встроить шрифт. Вы можете представить, что просто поместите файл шрифта в документ PDF.
Но здесь начинается сложная часть.
В спецификации PDF учтено, что это может быть излишним.
Я имею в виду, что если вы используете только 50 символов, которые обычно используются в западных языках, нет смысла вставлять весь шрифт.
Таким образом, PDF поддерживает функцию «подмножество шрифтов». Это означает, что вместо встраивания всего шрифта в документ встраиваются только те символы, которые фактически используются.
Так что же происходит не так, когда вы объединяете эти документы?
(я пропущу много технических деталей.)
Чтобы различать полностью встроенный шрифт, системный шрифт или встроенный шрифт подмножества, iText
генерирует новое имя шрифта для ваших шрифтов, когда оно их встраивает.
Таким образом, документ, содержащий подмножество Times New Roman, может иметь в своих ресурсах «Times-AUHFDI».
Аналогично, во втором документе (опять же содержащем подмножество Times New Roman) может быть указан «Times-VHUIEF» в качестве одного из ресурсов.
Я полагаю, это просто добавляет случайный 6-символьный суффикс. (бывший разработчик iText здесь)
PdfSmartCopy
должен решить, что делать с этими ресурсами. И, к сожалению, он не знает, являются ли эти шрифты на самом деле одинаковыми. Поэтому он решает включить оба этих подмножества в новый документ.
Это огромный штраф памяти.
Если у вас есть 100 документов, все из которых используют подмножество одного и того же шрифта, это подмножество будет внедрено 100 раз.
Другой инструмент, который вы перечислили, может фактически проверить, являются ли эти шрифты одинаковыми (и, если они есть, вставьте их только один раз). Или другой инструмент может просто не заботиться об этом и предположить на основании частичного совпадения имен, что они совпадают.
Идеальным решением, конечно, было бы сравнение фактических символов в шрифте, чтобы увидеть, можно ли объединить эти два подмножества.
Но это было бы намного сложнее (и, возможно, могло бы привести к снижению производительности).
Что вы можете сделать?
Существует 12 шрифтов, которые никогда не встраиваются. Предполагается, что они присутствуют в каждой системе (и поэтому они никогда не внедряются).
Если у вас есть контроль над процессом создания документов PDF, вы можете просто решить создать их, используя только эти шрифты.
В качестве альтернативы вы можете написать умнее PdfSmartCopy
. Вам нужно посмотреть, как создаются и хранятся шрифты, и выполнить фактическое сравнение, которое я упоминал ранее.
Обратитесь в службу технической поддержки на iText. Если достаточное количество людей запросят эту особенность, вы можете ее получить.