Как разрешить «… недоступен в кодировке этого шрифта»?

#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=ВЫКЛ.