Идея № 1
Один ответ сразу приходит на ум: Измените iText. В частности, Font.getCalculatedBaseFont
, строка 644.
String fontName = BaseFont.HELVETICA;
На самом деле, я не думаю, что это сработает, если вы не измените способ создания шрифтов ... Строка 712
cfont = BaseFont.createFont(fontName, encoding, false);
Если шрифт не является одним из "Base 14", вы должны указать путь к файлу шрифта, а не простое имя шрифта.
Другой вариант: XSLT
Преобразуйте ввод так, чтобы вы добавили определение шрифта к стилю любого узла, содержащего текст.
Наконец: зарегистрируйте fontProvider
Вы можете расположиться поверх FontFactoryImp и просто отобразить пустые строки на выбранный вами шрифт.
class DefaultFontProvider extends FontFactoryImp {
private String default;
public DefaultFontProvider(String def) {
default = def;
}
// I believe this is the correct override, but there are quite a few others.
public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color, boolean cached) {
if (fontName == null || fontName.size() == 0) {
fontName = default;
}
return super.getFont(fontName, encoding, embedded, size, style, color, cached);
}
}
Map<String,Object> providers = new HashMap<String, Object)();
providers.put(HTMLWorker.FONT_PROVIDER, new DefaultFontProvider("Arial Bold"));
myHTMLWorker.setProviders(providers);
Это кажется мне наиболее технически обоснованной идеей. Он написан для недавно выпущенной версии 5.0.6 iText. Предыдущие версии устанавливали поставщик шрифтов с помощью setInterfaceProps()
. «Провайдеры» - это больше изменение имени, чем что-либо еще на данный момент. Я подозреваю, что это больше не будет иметь место в 5.1.
PS: FontFactoryImp
имеет двух открытых участников, которые могут вас также заинтересовать: defaultEncoding
и defaultEmbedding
. Вы должны быть в состоянии настроить defaultEncoding
на что-то более дружественное к польскому языку. Я рекомендую «Identity-H» (он же BaseFont.IDENTITY_H
), но это заставляет все ваши шрифты быть встроенными подмножествами, игнорируя таким образом defaultEmbedding
и делая ваши файлы немного больше, чем если бы шрифты не были встроены вообще.
Две возможные проблемы:
Явно запрашивает "Helvetica".
Конечно, я предлагаю вставить System.out.println(("Requested font: " + fontName);
в начало вашей функции getFont. Это позволит вам увидеть все вызовы шрифтов и убедиться, что все ваши шрифты заменены правильно. Если это так, вы можете просто проверить его и заменить на _default
.
Ваш fontFactory может ничего не найти для "Arial Bold" и поэтому возвращается к значению по умолчанию (снова Helvetica).
Я думаю, вам нужно позвонить dfp.registerDirectories()
. Это обнаружит все шрифты в нескольких разных ОС и позволит вам ссылаться на них по имени шрифта, а не по пути (именно это FontFactoryImp должен делать в первую очередь).