acroform field.setRichTextValue не работает - PullRequest
0 голосов
/ 04 марта 2019

У меня есть поле от acroform, и я вижу field.setValue() и field.setRichTextValue(...).Первый устанавливает правильное значение, но второй, кажется, не работает, значение расширенного текста не отображается.Вот код, который я использую:

PDDocument pdfDocument = PDDocument.load(new File(SRC));
            pdfDocument.getDocument().setIsXRefStream(true);
            PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();
            acroForm.setNeedAppearances(false);

            acroForm.getField("tenantDataValue").setValue("Deuxième texte");
            acroForm.getField("tradingAddressValue").setValue("Text replacé");
            acroForm.getField("buildingDataValue").setValue("Deuxième texte");
            acroForm.getField("oldRentValue").setValue("750");
            acroForm.getField("oldChargesValue").setValue("655");
            acroForm.getField("newRentValue").setValue("415");
            acroForm.getField("newChargesValue").setValue("358");
            acroForm.getField("increaseEffectiveDateValue").setValue("Texte 3eme contenu");


            // THIS RICH TEXT NOT SHOW ANYTHING
            PDTextField field = (PDTextField) acroForm.getField("tableData");
            field.setRichText(true);
            String val = "\\rtpara[size=12]{para1}{This is 12pt font, while \\span{size=8}{this is 8pt font.} OK?}";
            field.setRichTextValue(val);

Я ожидаю, что поле с именем "tableData" будет установлено со значением расширенного текста!

Вы можете скачать форму PDF, которую я использую с этим кодом: скачать pdf форму и вы можете загрузить вывод после запуска этого кода и сгладить данные формы скачать вывод здесь

1 Ответ

0 голосов
/ 05 марта 2019

Подводя итог сказанному в комментариях к вопросу, а также некоторые исследования рабочей версии ...

Неправильный формат расширенного текста

ОПв своем оригинальном коде это использовалось как форматированный текст

String val = "\\rtpara[size=12]{para1}{This is 12pt font, while \\span{size=8}{this is 8pt font.} OK?}";

, который он взял из этого документа .Но этот документ является руководством для пакета LaTeX richtext , который содержит команды и документацию, необходимые для «простого» создания таких богатых строк. Т.е. \rtpara... выше не PDF-форматированный текст, но вместо команда LaTeX, которая создает PDF-форматированный текст (если выполняется в контексте LaTeX).

Документ даже демонстрирует это с помощьюпример

\rtpara[indent=first]{para1}{Now is the time for
    \span{style={bold,italic,strikeit},color=ff0000}{J\374rgen}
    and all good men to come to the aid of \it{their}
    \bf{country}. Now is the time for \span{style=italic}
    {all good} women to do the same.}

, для которого инструкция генерирует два значения, значение расширенного текста и значение простого текста:

\useRV{para1}: <p dir="ltr" style="text-indent:12pt;
    margin-top:0pt;margin-bottom:0pt;">Now is the time
    for <span style="text-decoration:line-through;
    font-weight:bold;font-style:italic;color:#ff0000;
    ">J\374rgen</span> and all good men to come to the
    aid of <i>their</i> <b>country</b>. Now is the
    time for <span style="font-style:italic;">all
    good</span> women to do the same.</p>
\useV{para1}: Now is the time for J\374rgen and all
    good men to come to the aid of their country. Now
    is the time for all good women to do the same.

Как видно из результата \useRV{para1}, PDF richВ тексте используется (сокращенная) разметка HTML для расширенного текста.

Для получения более подробной информации, пожалуйста, посмотрите спецификацию PDF, например, раздел 12.7.3.4 «Rich Text Strings» в копии ISO 32000-1, опубликованной Adobe * 1034.* here

PDFBox не создает расширенные текстовые представления

OP в своем исходном коде использует

acroForm.setNeedAppearances(false);

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

Однако, как цитирует @Tilman из JavaDocs,

/**
 * Set the fields rich text value.
 * 
 * <p>
 * Setting the rich text value will not generate the appearance
 * for the field.
 * <br>
 * You can set {@link PDAcroForm#setNeedAppearances(Boolean)} to
 * signal a conforming reader to generate the appearance stream.
 * </p>
 * 
 * Providing null as the value will remove the default style string.
 * 
 * @param richTextValue a rich text string
 */
public void setRichTextValue(String richTextValue)

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

acroForm.setNeedAppearances(true);

Создание Adobe Acrobat (Reader) для создания внешнего вида из богатыхtext

Когда Adobe Acrobat попросит сгенерировать внешний вид поля для расширенного текстового поля, он может сделать это либо на основе значения расширенного текста RV , либо значения простого текста V.Я провел несколько быстрых проверок, и Adobe Acrobat, похоже, использует следующие стратегии:

  1. Если установлено RV и значение V равно значению RV без разметки расширенного текста Adobe Acrobat предполагает актуальность значения RV и генерирует внешний вид из этой строки расширенного текста в соответствии со спецификацией PDF. В противном случае значение RV (если оно вообще присутствует) считается устаревшим и игнорируется!

  2. В противном случае, если Значение V содержит разметку расширенного текста, Adobe Acrobat предполагает, что это значение является форматированным текстом, и создает внешний вид в соответствии с этим стилем.

    Это , а не в соответствии с PDFспецификация.

    Возможно, некоторые программные продукты использовали для ложного ввода расширенного текста в значение V , и Adobe Acrobat начал поддерживать это неправильное использование для большей совместимости.

  3. В противном случае значение V используется в качестве простой строки, и соответственно создается внешний вид.

Это объясняет, почему в первоначальном подходе ФП используются только

field.setRichTextValue(val);

не показал никаких изменений - значение расширенного текста было проигнорировано Adobe Acrobat.

И это также объясняет его наблюдение

тогда вместо setRichTextValueпростое использование field.setValue("<body xmlns=\"http://www.w3.org/1999/xhtml\"><p style=\"color:#FF0000;\">Red&#13;</p><p style=\"color:#1E487C;\">Blue&#13;</p></body>") работает!в Acrobat Reader (без выравнивания) поле правильно отформатировано

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

Например, используйте

String val = "<?xml version=\"1.0\"?>"
        + "<body xfa:APIVersion=\"Acroform:2.7.0.0\" xfa:spec=\"2.1\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\">"
        + "<p dir=\"ltr\" style=\"margin-top:0pt;margin-bottom:0pt;font-family:Helvetica;font-size:12pt\">"
        + "This is 12pt font, while "
        + "<span style=\"font-size:8pt\">this is 8pt font.</span>"
        + " OK?"
        + "</p>"
        + "</body>";
String valClean = "This is 12pt font, while this is 8pt font. OK?";
field.setValue(valClean);
field.setRichTextValue(val);

или

String val = "<body xmlns=\"http://www.w3.org/1999/xhtml\"><p style=\"color:#FF0000;\">Red&#13;</p><p style=\"color:#1E487C;\">Blue&#13;</p></body>";
String valClean = "Red\rBlue\r";
field.setValue(valClean);
field.setRichTextValue(val);
...