Невозможно сохранить арабские слова в PDF - PDFBox Java - PullRequest
6 голосов
/ 01 апреля 2019

Попытка сохранить арабские слова в редактируемом PDF.Он отлично работает с английскими , но когда я использую арабские слова, я получаю следующее исключение:

java.lang.IllegalArgumentException: U + 0627 недоступно в этом шрифтеКодировка Helvetica: WinAnsiEncoding

Вот как я сгенерировал PDF:

public static void main(String[] args) throws IOException
{
  String formTemplate = "myFormPdf.pdf";
  try (PDDocument pdfDocument = PDDocument.load(new File(formTemplate)))
  {
    PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();
    if (acroForm != null)
    {
        PDTextField field = (PDTextField) acroForm.getField( "sampleField" );
        field.setValue("جملة");
    }
    pdfDocument.save("updatedPdf.pdf"); 
  }
}

Ответы [ 2 ]

4 голосов
/ 01 апреля 2019

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

public static void main(String[] args) throws IOException
{
  String formTemplate = "myFormPdf.pdf";

  try (PDDocument pdfDocument = PDDocument.load(new File(formTemplate)))
  {
    PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();
    // you can read ttf from resources as well, this is just for testing 
    PDFont font = PDType0Font.load(pdfDocument,new File("/path/to/font.ttf"));
    String fontName = acroForm.getDefaultResources().add(pdfont).getName();
    if (acroForm != null)
    {
        PDTextField field = (PDTextField) acroForm.getField( "sampleField" );
        field.setDefaultAppearance("/"+fontName +" 0 Tf 0 g");
        field.setValue("جملة");
    }

    pdfDocument.save("updatedPdf.pdf"); 
  }
}

Отредактировано : Добавление комментария к mkl Имя шрифта и размер шрифта являются параметрамиинструкции Tf, а значение серого 0 для черного является параметром для данной инструкции.Параметры и имена команд должны быть соответствующим образом разделены.

1 голос
/ 01 апреля 2019

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

final PDFont font = PDType0Font.load(...);

A Type 0font - это шрифт, который ссылается на форматы множества других шрифтов и может потенциально загружать все доступные символы.

См. также Поваренная книга - работа со шрифтами (без примеров с Type 0,но все же полезно).

...