2015-06-15 2 views
1

Я пытаюсь преобразовать * .xhtml с символами на иврите (UTF-8) в PDF с помощью библиотеки iText, но Я получаю все буквы в обратном порядке. Насколько я понял из этого question я могу установить RTL только для ColumnText и PdfCell объектов:Невозможно установить направление RTL для букв на иврите при преобразовании из * .xhtml в * .pdf с помощью библиотеки iText

арабские (и иврит) могут быть правильно воспроизведены только в контексте ColumnText и PdfPCell.

Так что я сомневаюсь, можно ли конвертировать всю * .xhtml страницу в PDF?

Это * .xhtml файл, который я пытаюсь импортировать:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <title>Title of document</title> 
</head> 

<body style="font-size:12.0pt; font-family:Arial"> 
    שלום עולם 
</body> 

</html> 

И это Java-код, который я использую:

public static void convert() throws Exception{ 
      Document document = new Document(); 
      PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("import.pdf")); 
      writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); 
      document.open(); 

      String str = null; 
      BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("import.xhtml"), "UTF8")); 
      StringBuilder sb = new StringBuilder(); 

      while ((str = in.readLine()) != null) { 
       System.out.println(str); 
       sb.append(str); 
      } 
      in.close(); 


      XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); 

      InputStream is = new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8)); 
      worker.parseXHtml(writer, document, is, Charset.forName("UTF-8")); 

      document.close(); 
     } 
    } 

Это то, что я получаю до настоящего времени:

And this is result which I get


Благодарим за любую помощь.

+0

Я не могу читать иврит, так что простите мне мое замешательство, но я вижу «שלום עולם» в вашем коде, и я вижу те же самые глифы, которые справа налево написаны на вашем снимке экрана. Разве это не означает, что iText изменил ориентацию текста? –

+0

@BrunoLowagie, они одни и те же глифы, но в противоположном направлении. В коде «ש» находится самый правый символ, а на картинке «ש» - самый левый глиф. – Anatoly

+0

ОК, я буду экспериментировать. В HTML в PDF вы можете иметь что-то вроде этого: '

שלום עולם
', но это должно переключать порядок глифов, так что 'ש' находится слева, не так ли? Я проверю. –

ответ

1

Пожалуйста, взгляните на пример ParseHtml10. В этом примере мы имеем взять файл hebrew.html:

<html> 

<head> 
    <title>Hebrew text</title> 
</head> 

<body style="font-size:12.0pt; font-family:Arial"> 
<div dir="rtl" style="font-family: Noto Sans Hebrew">שלום עולם</div> 
</body> 

</html> 

И мы преобразовать его в PDF с помощью этого кода:

public void createPdf(String file) throws IOException, DocumentException { 
    // step 1 
    Document document = new Document(); 
    // step 2 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); 
    // step 3 
    document.open(); 
    // step 4 
    // Styles 
    CSSResolver cssResolver = new StyleAttrCSSResolver(); 
    XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); 
    fontProvider.register("resources/fonts/NotoSansHebrew-Regular.ttf"); 
    CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); 
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers); 
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 

    // Pipelines 
    PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); 
    HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); 
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); 

    // XML Worker 
    XMLWorker worker = new XMLWorker(css, true); 
    XMLParser p = new XMLParser(worker); 
    p.parse(new FileInputStream(HTML), Charset.forName("UTF-8"));; 
    // step 5 
    document.close(); 
} 

Результат выглядит hebrew.pdf:

enter image description here

Какие препятствия вам нужно предпринять?

  • Вы должны обернуть текст в элемент, такой как <div> или <td>.
  • Чтобы определить направление, вам необходимо добавить атрибут dir="rtl".
  • Вам необходимо убедиться, что вы используете шрифт, который знает, как отображать иврит. Я использовал шрифт NOTO для иврита. Это один из шрифтов, распространяемых Google в их программе для предоставления шрифтов для всех возможных языков.

Я не могу прочитать иврит, но я надеюсь, что полученный PDF-файл будет правильным и что это решает вашу проблему.

Важно: это решение требует, по меньшей мере, IText и XML работник 5.5.5, потому что поддержка атрибута dir была введена в 5.5.4 и улучшениях в 5.5.5.

+1

Спасибо вам большое! Да, это абсолютно правильно! – Anatoly

+0

Извините, но это определенно выглядит правильно, но код не работает. Я виноват, что вчера не проверял код, но я делаю предположение, что если он работает для вас, это не должно быть проблемой для его реализации еще раз, я был неправ. Прямо сейчас я попытался реализовать ваше решение, но на самом деле я скопировал ваш пример * .xhtml и ваш код Java, и он не работает. Он отображает еще раз неправильное направление. – Anatoly

+0

Какую версию iText/XML Worker вы используете? –

Смежные вопросы