itext on tomcat 打印不同的字体

itext on tomcat print different fonts

我正在从 Eclipse 和 Tomcat 上将这段代码执行到 Web 应用程序中

        FileInputStream is = new FileInputStream("C:/Users/admin/Desktop/dummy.txt");

        try {
            FontFactory.register("C:/Workspace/Osmosit/ReportManager/testSvn/ReportManagerCommon/src/main/java/com/osmosit/reportmanager/common/itext/fonts/ARIALUNI.TTF"); 
        } catch (Exception e) {
            e.printStackTrace();
        }



        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
        Document document = new Document(PageSize.A4);
        PdfWriter writer;

        writer = PdfWriter.getInstance(document, byteArrayOutputStream);
        document.open();

        XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
        document.close();
        byteArrayOutputStream.close();


        FileOutputStream fos = new FileOutputStream("C:/Users/admin/Desktop/prova-web.pdf");
        fos.write(byteArrayOutputStream.toByteArray());
        fos.close();

dummy.txt 是一个简单的 html,带有阿兰语和拉丁字符

<div style="font-family: Arial Unicode MS;" ><p>كما. أي مدن العدّ وقام test latin</p><br /></div>

当我 运行 在 eclipse 下我得到一个正确的 pd,当它 运行s 在 Tomcat 我得到这个:

كما。 أي مدن العدّ Ùцقام 测试拉丁语

PS: 我正在使用 itextpdf 版本 5.5.8

您遇到编码问题。您保存 dummy.txt 使用错误的编码(例如,作为 Latin-1 而不是 UTF-8),或者您正在使用错误的编码读取 dummy.txt。

请参阅 并调整您使用 parseHtml() 的行:

XMLWorkerHelper.getInstance().parseXHtml(writer, document,
    is, null, Charset.forName("UTF-8"), fontImp);

查看 ParseHtml11 示例,了解 fontImp 的内容。

您还犯了另一个错误:阿拉伯语是从右向左阅读的,而在您的代码中,您没有定义 运行 方向。参见

在你的情况下,我会把阿拉伯语文本放在 table 中,我会遵循官方文档中的 ParseHtml7 示例:

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/NotoNaskhArabic-Regular.ttf");
    CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
    // HTML
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
    // Pipelines
    ElementList elements = new ElementList();
    ElementHandlerPipeline pdf = new ElementHandlerPipeline(elements, null);
    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"));

    PdfPTable table = new PdfPTable(1);
    PdfPCell cell = new PdfPCell();
    cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
    for (Element e : elements) {
        cell.addElement(e);
    }
    table.addCell(cell);
    document.add(table);
    // step 5
    document.close();
}