java - 使用 iText 库从 *.xhtml 转换为 *.pdf 时,无法设置希伯来字母的 RTL 方向

标签 java itext right-to-left hebrew xmlworker

我正在尝试使用 iText 库将带有希伯来字符 (UTF-8) 的 *.xhtml 转换为 PDF,但我得到的所有字母都是相反的顺序。 据我所知question我只能为 ColumnTextPdfCell 对象设置 RTL:

Arabic (and Hebrew) can only be rendered correctly in the context of ColumnText and 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

<小时/>

感谢您的帮助。

最佳答案

请查看 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 Worker 5.5.5,因为支持 dir属性在 5.5.4 中引入并在5.5.5中进行了改进.

关于java - 使用 iText 库从 *.xhtml 转换为 *.pdf 时,无法设置希伯来字母的 RTL 方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847907/

相关文章:

c# - 从右到左 TabControl c# 的 TabPages 的关闭按钮

ios - 在 iOS 中的 TextView 中对齐阿拉伯文本

java - 将第一个、第二个和第三个 int 扫描器值分配给 3 个不同的队列

java - HttpClient 执行两次后停止在循环中执行相同的 HttpGet 方法

java - Java中的Itext PDF操作

itext - 将边距应用到运行的 CSS 位置

android - textview不是从右到左虽然从右到左设备

java - Hibernate 进行两次插入并导致违反唯一键约束

java - 将 .spd 文件转换为 pdf 文件

c# - 如何在 iTextSharp 中绘制垂直渐变?