Изменить шрифт PDFbox для текста поля - PullRequest
0 голосов
/ 03 февраля 2019

Я пишу приложение, которое использует библиотеку PDFbox для заполнения полей в файле PDF.
В одном из этих полей я задаю текст, который будет написан ивритскими буквами.
Когда я запускаю код на своем устройстве Android, я получаю следующий журнал:

java.lang.IllegalArgumentException: This font type only supports 8-bit code points
    at com.tom_roush.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:317)
    at com.tom_roush.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:264)
    at com.tom_roush.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:293)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.PlainTextFormatter.format(PlainTextFormatter.java:183)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.insertGeneratedAppearance(AppearanceGeneratorHelper.java:360)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceContent(AppearanceGeneratorHelper.java:224)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(AppearanceGeneratorHelper.java:128)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:247)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.PDTerminalField.applyChange(PDTerminalField.java:221)
    at com.tom_roush.pdfbox.pdmodel.interactive.form.PDTextField.setValue(PDTextField.java:202)
    at com.package.app.MainActivity.lambda$checkPdf$4$MainActivity(MainActivity.java:128)
    at com.package.app.MainActivity$$Lambda$2.run(Unknown Source:18)
    at java.lang.Thread.run(Thread.java:764)

Я пытался найти некоторую информацию об этом по всему переполнению стека, но ни один из найденных ответовсвязанные с заполнением форм.Все это связано с PDPageContentStream.

Вот как я заполняю форму в своем коде:

try {
    PDDocument document = PDDocument.load(getAssets().open("file.pdf"));
    PDDocumentCatalog docCatalog = document.getDocumentCatalog();
    PDAcroForm acroForm = docCatalog.getAcroForm();

    // Fill the text field
    ((PDTextField) acroForm.getField("name")).setValue("בדיקה");

    File root = android.os.Environment.getExternalStorageDirectory();

    String path = root.getAbsolutePath() + "/test.pdf";
    document.save(path);
    document.close();
} catch (IOException e) {
    Log.e("e", e.getMessage());
}

Можете ли вы помочь мне решить эту ошибку и заполнить буквы на иврите в форме, используяPDFbox

1 Ответ

0 голосов
/ 15 февраля 2019

Я использовал этот ответ , чтобы изменить шрифт текста поля.Единственная проблема заключается в том, что теперь текст был направлен в неправильном направлении, поэтому я изменил направление строки:

try {
    PDDocument document = PDDocument.load(getAssets().open("file.pdf"));
    PDDocumentCatalog docCatalog = document.getDocumentCatalog();
    PDAcroForm acroForm = docCatalog.getAcroForm();
    PDResources dr = acroForm.getDefaultResources();

    PDFont liberationSans = PDType0Font.load(document, getAssets().open("com/tom_roush/pdfbox/resources/ttf/LiberationSans-Regular.ttf"));
    COSName fontName = dr.add(liberationSans);
    Iterator<PDField> it = acroForm.getFields().iterator();
    while (it.hasNext()) {
        PDField field = it.next();
        if (field instanceof PDTextField) {
            PDTextField textField = (PDTextField) field;
            String da = textField.getDefaultAppearance();

            // replace font name in default appearance string
            Pattern pattern = Pattern.compile("\\/(\\w+)\\s.*");
            Matcher matcher = pattern.matcher(da);
            String oldFontName = matcher.group(1);
            da = da.replaceFirst(oldFontName, fontName.getName());

            textField.setDefaultAppearance(da);
        }
    }

    // Fill the text field
    ((PDTextField) acroForm.getField("name")).setValue(new StringBuilder("בדיקה").reverse().toString());

    File root = android.os.Environment.getExternalStorageDirectory();

    String path = root.getAbsolutePath() + "/test.pdf";
    document.save(path);
    document.close();
} catch (IOException e) {
    Log.e("e", e.getMessage());
}
...