Краткий ответ: пожалуйста, прочитайте документацию.
Ответ на вопрос 1
Является ли создание DefaultFontProvider допустимым для каждого отдельного вызова илидолжен ли быть только один экземпляр (например, из-за затрат на создание)?
Вы должны создавать новый экземпляр для каждого преобразования, как сейчас.Поставщики шрифтов привязаны к документам, что указано в документации для базового FontProvider
класса.Хотя если вы повторно используете поставщик шрифтов, он все равно будет работать, но я не рекомендую это делать.
Документация по методу setFontProvider
, который вы используете, прямо говорит об этом:
Обратите внимание, что экземпляры FontProvider не могут быть повторно использованы в нескольких документах и, следовательно, как только вы установите этосвойство, этот экземпляр ConverterProperties становится полезным только для одного преобразования HTML.
Ответ на вопрос 2
Если DefaultFontProvider инициализируется только один раз -> сохраняет ли этот экземпляр поток?
Нет гарантии безопасности потока.Документация поможет вам использовать DefaultFontProvider
только для одного преобразования.
Советы по оптимизации
(чтобы я мог их применить)
- Посмотрите на конструктор
DefaultFontProvider(boolean, boolean, boolean)
.По умолчанию pdfHTML загружает стандартные шрифты PDF, а также шрифты, которые поставляются с pdfHTML.Если вы уверены, что шрифты, которые вы добавляете вручную, покрывают все сценарии, которые вы используете в своих HTML-файлах, вы можете передать false
всем трем параметрам конструктора (new DefaultFontProvider(false, false, false)
).Но если вы не уверены, не делайте этого, потому что это может привести к отсутствию текста в результате.Или добавьте необходимые шрифты в свою коллекцию, чтобы быть уверенными. - Повторное использование
FontProgram
экземпляров.Они поточнобезопасны и могут быть использованы для конвертации многих документов.Тем не менее, это стандартное поведение iText, и это, скорее всего, не улучшит ситуацию в вашем случае, за исключением явного указания факта. - Если вы можете указать
1.
, то вы также можете повторно использовать FontSet
если вы используете другую реализацию FontProvider
- сначала создайте DefaultFontProvider
один раз и добавьте туда все шрифты один раз , затем получите экземпляр FontSet
через defaultFP.getFontSet()
после чего вы можете создавать поставщиков шрифтов с помощью набора шрифтов new FontProvider(fontSet)
- это вам придется делать каждый раз, когда вы выполняете конвертацию (см. ответ на вопрос 1).