PDF-формы с символами Unicode

В настоящее время я борюсь с формой PDF, созданной из документа LibreOffice.

Я создал его, как это предлагается в книге "iText in Action", и теперь я пытаюсь предварительно заполнить встроенную форму несколькими значениями, которые могут содержать символы Unicode.

Это включает символ, который состоит из базы char с добавлением, объединяющим char (e.G.M).

Я пробовал несколько разных подсказок, которые я нашел в qaru.site/info/459304/... и книге, но у меня никогда не было документа PDF с формой, которая работает на всех платформах: Linux (Okular, Evince, Acrobat DC, macOS Previewer и т.д.)

Я знаю, что мне нужно иметь шрифт, который покрывает символы и полностью помещает шрифт. Ниже приведен код, который я использовал для записи документа PDF и файла PDF.

Мои вопросы:

  • Является ли различное поведение спецификации спецификации чтения PDF-документов спецификацией PDF, и мне нужно жить с ней?
  • Специально читатели Linux PDF и Acrobat ведут себя плохо. Известны ли ошибки?
  • Я не очень хорошо знаком с внутренними документами PDF, поэтому любые предложения? Являются ли содержимое моих файлов PDF нормально?
  • Любые предложения по улучшению кода для получения лучших результатов?

Код для заполнения формы:

BaseFont uniFont = BaseFont.createFont("./src/main/resources/UnicodeDoc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, false, null, null, false);
uniFont.setSubset(false);

// Debugging code...
for (String codepage : uniFont.getCodePagesSupported()) {
    System.out.println("Codepage = " + codepage);
}

FileInputStream fis = new FileInputStream(src);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(fis);
PdfStamper stamper = new PdfStamper(reader, baos);

// Fill all fields in PDF form
String text = "aM\u0302a"; // Same as "aM̂a"
com.itextpdf.text.pdf.AcroFields form = stamper.getAcroFields();
for (String fname : form.getFields().keySet()) {
    System.out.println("form." + fname);
    form.setField(fname, text);
    form.setFieldProperty(fname, "textfont", uniFont, null);
}
form.setGenerateAppearances(true);
form.addSubstitutionFont(uniFont);
stamper.setFormFlattening(false);
stamper.close();
reader.close();

Заранее спасибо, Mik86

Ответ 1

Я не очень хорошо знаком с внутренними документами PDF, поэтому любые предложения? Являются ли содержание моих файлов PDF нормально?

Мне нужно будет вникнуть в спецификацию PDF, чтобы увидеть, есть ли что-то окончательно неправильное, но мне кажется, что это путаница.

Во-первых, ваш шаблон ввода дает мне ошибку, когда я пытаюсь открыть его в Acrobat, а LiveCycle жалуется, что "UnicodeDoc" должен быть заменен другим шрифтом. "UnicodeDoc" используется в исходном исходном файле:

введите описание изображения здесь

Обратите внимание, что шрифт "UnicodeDoc" имеет не, встроенный в ваш входной файл. При заполнении вы создаете и вставляете шрифт, но похоже, что вы не перезаписываете оригинал (опять же, чтобы не сказать, что это правильно или неправильно):

введите описание изображения здесь

Не вдаваясь во внутреннюю работу PDF файлов, форма, которая заполняется, по-прежнему привязывается к исходному шрифту, который не встроен.

Это не обязательно напрямую касается проблемы, но если я "исправил" ваш документ, удалив шрифт из исходного шаблона:

input.pdf

И запустите его через свой код, он произведет output.pdf, который имеет правильный вывод в Acrobat и Reader.

Опять же, это не значит, что ваш PDF не прав или iText ошибается в этом случае, поскольку я не просмотрел всю спецификацию, чтобы увидеть, что (если есть) взаимодействие ожидается здесь, но по мере того как он стоит шрифт что вы внедряете шрифт не, который становится привычным в поле формы.