Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ITextRenderer将html转换为PDF时遇到的阿拉伯语问题_Itext_Flying Saucer - Fatal编程技术网

使用ITextRenderer将html转换为PDF时遇到的阿拉伯语问题

使用ITextRenderer将html转换为PDF时遇到的阿拉伯语问题,itext,flying-saucer,Itext,Flying Saucer,当我使用ITextRenderer将html转换为PDF时。这是我的代码 ByteArrayOutputStream out = new ByteArrayOutputStream(); ITextRenderer renderer = new ITextRenderer(); String inputFile = "C://Users//Administrator//Desktop//aaa2.html"; String url = new File(inputFile).toURI().t

当我使用ITextRenderer将html转换为PDF时。这是我的代码

ByteArrayOutputStream out = new ByteArrayOutputStream();

ITextRenderer renderer = new ITextRenderer();
String inputFile = "C://Users//Administrator//Desktop//aaa2.html";
String url = new File(inputFile).toURI().toURL().toString();
renderer.setDocument(url);
renderer.getSharedContext().setReplacedElementFactory(
        new B64ImgReplacedElementFactory());
    // 解决阿拉伯语问题
ITextFontResolver fontResolver = renderer.getFontResolver();
try {
    fontResolver.addFont("C://Users//Administrator//Desktop//arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
} catch (DocumentException e) {
    e.printStackTrace();
}

renderer.layout();
OutputStream outputStream = new FileOutputStream("C://Users//Administrator//Desktop//HTMLasPDF.pdf");
renderer.createPDF(outputStream, true);
/*PdfWriter writer = renderer.getWriter();

writer.open();
writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
OutputStream outputStream2 = new FileOutputStream(  "C://Users//Administrator//Desktop//HTMLasPDFcopy.txt");
renderer.createPDF(outputStream2);*/
renderer.finishPDF();
out.flush();
out.close();
实际PDF结果:

预期PDF结果:


如何制作阿拉伯文连字?

希腊字母似乎被省略了;他们没有出现在文件中

在飞碟中,生成的PDF使用某种默认值 (可能是Helvetica)字体,包含非常有限的字符集, 这显然不包含希腊代码页


如果您想正确地执行此操作(我假设使用iText,因为您的帖子被标记为这样),您应该使用

  • (将HTML转换为PDF)
  • (正确处理阿拉伯语连字)
  • 支持这些功能的字体(如另一个答案所示)
例如,请参阅,更具体地说是以下常见问题:

您需要包含所需字形的字体,例如:

public static final String[] FONTS = {
    "src/main/resources/fonts/noto/NotoSans-Regular.ttf",
    "src/main/resources/fonts/noto/NotoNaskhArabic-Regular.ttf",
    "src/main/resources/fonts/noto/NotoSansHebrew-Regular.ttf"
};
您需要一个
FontProvider
,它知道如何在
converterproperty
中找到这些字体:

public void createPdf(String src, String[] fonts, String dest) throws IOException {
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    for (String font : fonts) {
        FontProgram fontProgram = FontProgramFactory.createFont(font);
        fontProvider.addFont(fontProgram);
    }
    properties.setFontProvider(fontProvider);
    HtmlConverter.convertToPdf(new File(src), new File(dest), properties);
}

请注意,如果你没有正确的答案,文本将完全错误。该附加组件在创建飞碟时不存在,因此您不能使用飞碟转换带有阿拉伯文、印地文、泰卢固文等文本的文档,。。。如果您想了解有关连字的更多信息,请阅读。

我使用wkhtmltopdf更改转换pdf的方式。

事实上,OP使用的是名为“飞碟”的第三方工具。飞碟使用的是不支持连字的旧iText版本。请参阅官方HTML到PDF教程的常见问题部分。我使用wkhtmltopdf更改转换PDF的方式。