当前位置: 首页 > 知识库问答 >
问题:

在PDF iText中得到错误的阿拉伯语翻译

尚俊楠
2023-03-14

我正在从我的超文本标记语言字符串生成PDF文件,但当生成PDF文件时,超文本标记语言和PDF中的内容不匹配。内容是PDF是一些随机内容。我在谷歌上读到过这个问题,他们建议使用Unicode表示法,如%u0627%u0646%u0627%u0627%u0633%u0645%u0649%u0639%u0628%u062F%u0627%u0644%u0644%u0647。但我正在将其放入我的超文本标记语言中,它正在按原样打印。

相关问题:使用itext在pdf中编写阿拉伯语

package com.example.demo;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.styledxmlparser.css.media.MediaDeviceDescription;
import com.itextpdf.styledxmlparser.css.media.MediaType;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.layout.font.FontProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) throws IOException {
        SpringApplication.run(DemoApplication.class, args);
        String htmlSource = getContent();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ConverterProperties converterProperties = new ConverterProperties();
        FontProvider dfp = new DefaultFontProvider(true, false, false);
        dfp.addFont("/Library/Fonts/Arial.ttf");
        converterProperties.setFontProvider(dfp);
        converterProperties.setMediaDeviceDescription(new MediaDeviceDescription(MediaType.PRINT));
        HtmlConverter.convertToPdf(htmlSource, outputStream, converterProperties);
        byte[] bytes = outputStream.toByteArray();
        File pdfFile = new File("java19.pdf");
        FileOutputStream fos = new FileOutputStream(pdfFile);
        fos.write(bytes);
        fos.flush();
        fos.close();
    }

    private static String getContent() {
        return "<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
                "    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n" +
                "    <title>Document</title>\n" +
                "    <style>\n" +
                "      @page {\n" +
                "        margin: 0;\n" +
                "        font-family: arial;\n" +
                "      }\n" +
                "    </style>\n" +
                "</head>\n" +
                "\n" +
                "<body\n" +
                "    style=\"margin: 0;padding: 0;font-family: arial, sans-serif;font-size: 14px;line-height: 125%;width: 100%;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #222222;\">\n" +
                "    <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"background: white; direction: rtl;\">\n" +
                "        <tbody>\n" +
                "            <tr>\n" +
                "                <td style=\"padding: 0 35px;\">\n" +
                "                    <p> انا اسمى عبدالله\n" +
                "                    </p>\n" +
                "                </td>\n" +
                "            </tr>\n" +
                "        </tbody>\n" +
                "    </table>\n" +
                "\n" +
                "</body>\n" +
                "\n" +
                "</html>";
    }
}

共有3个答案

巫马承德
2023-03-14

确保您的字体支持所需的字符,并且如果您在构建期间使用Maven资源目录包含额外的字体,请检查字体文件是否未被过滤(属性替换),因为这会损坏文件:Maven在构建jar时损坏了源/主/资源中的二进制文件

魏煜祺
2023-03-14

请检查以确保您的源文件和编译器使用相同的编码,例如UTF-8。我有时会通过包含仅在unicode中可用而在其他经典代码页中不可用的字符来检查。

我试图重现问题,在运行示例代码时,我在日志记录中收到以下警告:

找不到 pdfCalligraph 模块,这是其中一个布局属性隐式需要的

Alexsey Subach已经提到了这一点,它可能会导致以下问题:

    < li >文本方向有问题(我不是阿拉伯语专家,但文本靠右对齐) < li >错误的字符组合(详情请参见本文档:https://iText pdf . com/sites/default/files/2018-12/iText _ pdfCalligraph _ 4 pager . pdf)

这是我在没有pdfCalligraph的情况下得到的输出:

没有书法的PDF结果

使用此存储库上的代码库创建

因此,为了让一切都像您的浏览器与阿拉伯语的超文本标记语言一样完美地工作,您还需要:

  • https://itextpdf.com/en/products/itext-7/pdfcalligraph 的商业许可证
  • 加载许可证文件的代码(或者您将获得许可证文件NotLoadedException)
  • 此依赖项 https://repo.itextsupport.com/releases/com/itextpdf/typography/2.0.6/

您的问题被标记为关于iText7,但根据您的需求,可能还有其他可能的免费替代方案,如Apache FOP,根据该源代码,它应该使用阿拉伯语连字,但可能需要返工,因为它基于XSL-FO。理论上,您可以使用当前使用的任何模板机制(例如JSP/JSF/Thymeleaf等)生成XSL-FO,并在请求期间(在web应用程序中)使用ServletFilter之类的工具将XSL-FO动态转换为PDF

章安宜
2023-03-14

在没有看到错误输出的情况下,很难确定问题到底是什么。但是您的“随机内容”听起来像是一个编码问题。

因为您的源代码中直接包含阿拉伯语内容,所以您必须小心编码。例如,使用< code>ISO-8859-1,生成的PDF输出为:

使用 Unicode 转义序列 (\uXXXX),您确实可以避免其中一些编码问题。取代

"                    <p> انا اسمى عبدالله\n" +

具有

"                    <p>\u0627\u0646\u0627 \u0627\u0633\u0645\u0649 \u0639\u0628\u062F\u0627\u0644\u0644" +

即使使用ISO-8859-1编码,也会产生阿拉伯字形。或者,您可以使用<code>UTF-8

当您的编码问题得到解决时,您可能会得到如下输出:

为了正确呈现某些书写系统,iText 7需要一个可选模块pdfCalligraph。启用该模块后,产生的输出如下所示:

用于上述测试的代码:

public static void main(String[] args) throws IOException {
    // Needed for pdfCalligraph
    LicenseKey.loadLicenseFile("all-products.xml");

    File pdfFile = new File("java19.pdf");
    OutputStream outputStream = new FileOutputStream(pdfFile);
    String htmlSource = getContent();
    ConverterProperties converterProperties = new ConverterProperties();
    FontProvider dfp = new DefaultFontProvider(true, false, false);
    dfp.addFont("/Library/Fonts/Arial.ttf");
    converterProperties.setFontProvider(dfp);
    converterProperties.setMediaDeviceDescription(new MediaDeviceDescription(MediaType.PRINT));
    HtmlConverter.convertToPdf(htmlSource, outputStream, converterProperties);
}

private static String getContent() {
    return "<!DOCTYPE html>\n" +
            "<html lang=\"en\">\n" +
            "\n" +
            "<head>\n" +
            "    <meta charset=\"UTF-8\">\n" +
            "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
            "    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n" +
            "    <title>Document</title>\n" +
            "    <style>\n" +
            "      @page {\n" +
            "        margin: 0;\n" +
            "        font-family: arial;\n" +
            "      }\n" +
            "    </style>\n" +
            "</head>\n" +
            "\n" +
            "<body\n" +
            "    style=\"margin: 0;padding: 0;font-family: arial, sans-serif;font-size: 14px;line-height: 125%;width: 100%;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #222222;\">\n" +
            "    <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"background: white; direction: rtl;\">\n" +
            "        <tbody>\n" +
            "            <tr>\n" +
            "                <td style=\"padding: 0 35px;\">\n" +
// Arabic content
//            "                    <p> انا اسمى عبدالله\n" +
// Arabic content with Unicode escape sequences
            "                    <p>\u0627\u0646\u0627 \u0627\u0633\u0645\u0649 \u0639\u0628\u062F\u0627\u0644\u0644\u0647" +
            "                    </p>\n" +
            "                </td>\n" +
            "            </tr>\n" +
            "        </tbody>\n" +
            "    </table>\n" +
            "\n" +
            "</body>\n" +
            "\n" +
            "</html>";
}
 类似资料:
  • 问题内容: 我有一个包含JTextField的表单,其中一些特定于法语,另一些特定于阿拉伯语。我想从一种语言切换到另一种而不按Alt + Shift键。解决方案的任何帮助将不胜感激。谢谢, 问题答案: 感谢aymeric的回答,但我找到了解决问题的方法,这是我解决问题的方法:

  • 我有一个关于阿拉伯语编码和将阿拉伯语存储到mysql的问题。 我应用了以下所有步骤: set-MySQL字符集:UTF-8 Unicode(utf8) 设置MySQL连接排序规则:utf8\u常规\u ci 集合数据库和表排序规则设置为:utf8\U general\U ci或utf8\U unicode\U ci mysql_查询(“设置名称‘utf8’”); mysql_查询('SET CHA

  • 问题内容: 我正在评估NLTK处理阿拉伯文本的能力,这项研究旨在分析和提取情感。 问题如下: NTLK是否可以处理并允许分析阿拉伯文本? python是否能够操纵\标记阿拉伯文本? 我可以使用Python解析和存储阿拉伯文本吗? 如果python和NTLK不是完成这项工作的工具,那么您会推荐哪些工具(如果存在)? 谢谢。 编辑 根据研究: NTLK仅能阻止阿拉伯文本:链接 Python支持UTF-

  • Adobe 亚洲语言书写器 借助 Adobe 亚洲语言书写器,您可以使用中东和南亚语言创建内容。您可以键入或混合键入阿拉伯语、希伯来语、英语和其他语言。 您可以在“段落”面板菜单(窗口 > 段落 > 面板菜单)中的可用书写器之间进行选择。例如,您可以使用中东和南亚语言单行书写器或中东和南亚语言逐行书写器。 有关 Illustrator 中支持的其他亚洲语言的更多信息,请参阅适用于亚洲语言文字的书写

  • 启用中东语言功能 若要在 Photoshop 界面中显示中东文字选项,请执行以下操作: 选取“编辑”>“首选项”>“文字”(Windows) 或“Photoshop”>“首选项”>“文字”(Mac OS)。 在“选取文本引擎选项”部分中,选取“中东”。 单击“确定”,并重新启动 Photoshop。 选取“文字”>“语言选项”>“中东语言功能”。 文本方向 要创建阿拉伯语和希伯来语内容,您可以将默

  • 在 Dreamweaver 中将双向流量应用到阿拉伯语和希伯来语文本;使用标签编辑器、“表格”属性和 Div 属性。 在中东和北非版本的此软件中,可通过阿拉伯语和希伯来语使用新的功能和改进功能。 双向文字流 中东语言的文字大多从右向左 (RTL) 书写。但是,一般而言,最常用的形式为双向 (bidi) 文字 - 混用从左向右和从右向左书写的文字。bidi 文字的一个示例是含有阿拉伯语和英语文字的段