gpt4 book ai didi

java - tomcat上的itext打印不同的字体

转载 作者:行者123 更新时间:2023-11-28 22:50:52 24 4
gpt4 key购买 nike

我正在从 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,当它在 Tomcat 上运行时,我得到这个:

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

PS:我使用的是 itextpdf 5.5.8 版

最佳答案

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

参见 html to pdf convert, cyrillic characters not displayed properly并调整您使用 parseHtml() 的行:

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

看看 ParseHtml11找出 fontImp 是关于什么的示例。

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

在你的例子中,我会把阿拉伯语文本放在一个表格中,然后我会遵循 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();
}

关于java - tomcat上的itext打印不同的字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39975577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com