#java #pdf #pdfbox
#java #PDF #pdfbox
Вопрос:
Итак, я использую PDFBox для заполнения некоторых PDF-файлов. Пока все было отлично — я создал форму в формате pdf с использованием шрифта Avenir Light, и я мог ее заполнить. Однако проблема, которая только что обнаружилась, заключается в том, что когда я пытаюсь заполнить PDF-файл, используя такие буквы, как ł
, ą
, ć
… Я получаю следующую ошибку:
U 0142 is not available in this font's encoding: MacRomanEncoding with differences
с разными номерами.
Теперь мой вопрос — как я могу это исправить, чтобы я мог заполнять форму автоматически? Когда я открываю PDF-файл в Acrobat Reader, я могу вставить эти буквы, и я не получаю никаких ошибок. Вот как я устанавливаю поле:
public void setField(PDDocument document, PDField field, String value ) throws IOException {
if( field != null amp;amp; value != null) {
try{
field.setValue(value);
} catch (Exception e){
e.printStackTrace();
}
}
else {
System.err.println( "No field found with name:" field.getPartialName() );
}
}
Обновить
Я пытался загрузить свой собственный файл Avenir-Light.tff следующим образом:
PDFont font = PDType1Font.HELVETICA;
PDResources res = new PDResources();
COSName fontName = res.add(font);
acroForm.setDefaultResources(res);
String da = "/" fontName.getName() " 12 Tf 0 g";
acroForm.setDefaultAppearance(da);
Однако, похоже, это не оказывает никакого влияния на печатные поля и выдает почти то же сообщение:
U 0104 ('Aogonek') is not available in this font Helvetica (generic: ArialMT) encoding: WinAnsiEncoding
Комментарии:
1. Как вы загружаете шрифт Avenir Light в свой код?
2. @IssamELATIF, я не загружаю его в свой код — шрифт встроен в pdf.
3. Поделитесь некоторым кодом о том, как вы заполняете PDField или ячейки, это поможет
4. @IssamELATIF, я обновил свой вопрос
5. Я не уверен, работает ли это в форме (я уже написал ответ и пока удалил его) — пожалуйста, попробуйте
PDType0Font load(doc, new File("path/Avenir-Light.ttf"), false)
использовать его в своих ресурсах.
Ответ №1:
PDFBox определяет 14 стандартных шрифтов в PDType1Font :
PDType1Font.TIMES_ROMAN
PDType1Font.TIMES_BOLD
PDType1Font.TIMES_ITALI
PDType1Font.TIMES_BOLD_ITALIC
PDType1Font.HELVETICA
PDType1Font.HELVETICA_BOLD
PDType1Font.HELVETICA_OBLIQUE
PDType1Font.HELVETICA_BOLD_OBLIQUE
PDType1Font.COURIER
PDType1Font.COURIER_BOLD
PDType1Font.COURIER_OBLIQUE
PDType1Font.COURIER_BOLD_OBLIQUE
PDType1Font.SYMBOL
PDType1Font.ZAPF_DINGBATS
Поэтому, если вы хотите использовать Avenir-Light, вам нужно загрузить его из файла .ttf. Вы можете сделать это, как предложил @TilmanHausherr PDType0Font.load(doc, new File("path/Avenir-Light.ttf"), false).
PDFont font = PDType0Font.load(doc, new File("path/Avenir-Light.ttf"), false);
PDResources res = new PDResources();
COSName fontName = res.add(font);
acroForm.setDefaultResources(res);
String da = "/" fontName.getName() " 12 Tf 0 g";
acroForm.setDefaultAppearance(da);
Обновить
Знаете ли вы, почему он также отображает предупреждение, если форма: таблицы макета OpenType, используемые в шрифте Avenir-Light, не реализованы в PDFBox и будут проигнорированы?
Шрифт Avenir-light использует таблицы компоновки OpenType (Advanced Typographic), которые PDFBox пока не поддерживает. Эта расширенная типография будет проигнорирована
Комментарии:
1. Знаете ли вы, почему он также отображает предупреждение, если форма: таблицы макета OpenType, используемые в шрифте Avenir-Light, не реализованы в PDFBox и будут проигнорированы?
2. Да, отключите ведение журнала для этого класса org.apache.pdfbox.pdmodel.font. PDCIDFontType2 в log4j. Например, этот log4j.logger.org.apache.pdfbox.pdmodel.font. PDCIDFontType2=ВЫКЛ.