使用iText从html内容到pdf的阿拉伯字符

使用iText从html内容到pdf的阿拉伯字符,第1张

概述我无法在PDF生成中将 HTML内容中的阿拉伯字符显示为“?” 我能够从String变量中显示阿拉伯语文本.同时我无法从HTML字符串生成阿拉伯语文本. 我想显示带有两列的PDF,左侧是英语,右侧是阿拉伯语文本. 当我使用以下程序转换为PDF格式.请帮助我这方面. try{ Document document = new Document(PageSize.A4, 50, 50, 50, 我无法在pdf生成中将 HTML内容中的阿拉伯字符显示为“?”

我能够从String变量中显示阿拉伯语文本.同时我无法从HTML字符串生成阿拉伯语文本.

我想显示带有两列的pdf,左侧是英语,右侧是阿拉伯语文本.

当我使用以下程序转换为pdf格式.请帮助我这方面.

try{    document document = new document(PageSize.A4,50,50);    ByteArrayOutputStream out = new ByteArrayOutputStream();    pdfWriter writer = pdfWriter.getInstance(document,out);    BaseFont bf = BaseFont.createFont("C:\arial.ttf",BaseFont.IDENTITY_H,BaseFont.EMbedDED);    Font Font = new Font(bf,8);    document.open();    BufferedReader br = new BufferedReader(new fileReader("C:\style.CSS"));    StringBuffer fileContents = new StringBuffer();    String line = br.readline();    while (line != null)    {        fileContents.append(line);        line = br.readline();    }    br.close();    String styles = fileContents.toString(); //"p { Font-family: Arial;}";     Paragraph cirNoEn = null;    Paragraph cirNoAr = null;    String HTMLContentEn = null;    String HTMLContentAr = null;    pdfPCell contentEnCell = new pdfPCell();    pdfPCell contentArCell = new pdfPCell();    cirNoEn = new Paragraph("Circular No. (" + cirEnNo + ")",new Font(bf,14,Font.BolD | Font.UNDERliNE));    cirNoAr = new Paragraph("رقم التعميم (" + cirArNo + ")",Font.BolD | Font.UNDERliNE));    HTMLContentEn = “< p >< span > Dear….</ span ></ p >”;    HTMLContentAr = “< p >< span > رقم التعميم رقم التعميم </ p >< p > رقم التعميم ….</ span ></ p >”;    for (Element e : XMLWorkerHelper.parsetoElementList(HTMLContentEn,styles))    {        for (Chunk c : e.getChunks())        {            c.setFont(new Font(bf));        }        contentEnCell.addElement(e);    }    for (Element e : XMLWorkerHelper.parsetoElementList(HTMLContentAr,styles))    {        for (Chunk c:e.getChunks())        {            c.setFont(new Font(bf));        }        contentArCell.addElement(e);    }    pdfPCell emptyCell = new pdfPCell();    pdfPCell cirNoEnCell = new pdfPCell(cirNoEn);    pdfPCell cirNoArCell = new pdfPCell(cirNoAr);    cirNoEnCell.setHorizontalAlignment(Element.AliGN_CENTER);    cirNoArCell.setHorizontalAlignment(Element.AliGN_CENTER);    emptyCell.setborder(Rectangle.NO_border);    emptyCell.setFixedHeight(15);    cirNoEnCell.setborder(Rectangle.NO_border);    cirNoArCell.setborder(Rectangle.NO_border);    contentEnCell.setborder(Rectangle.NO_border);    contentArCell.setborder(Rectangle.NO_border);    cirNoArCell.setRunDirection(pdfWriter.RUN_DIRECTION_RTL);    contentArCell.setRunDirection(pdfWriter.RUN_DIRECTION_RTL);    contentEnCell.setnowrap(false);    contentArCell.setnowrap(false);    pdfPtable circularInfotable = null;    emptyCell.setColspan(2);    circularInfotable = new pdfPtable(2);    circularInfotable.addCell(cirNoEnCell);    circularInfotable.addCell(cirNoArCell);    circularInfotable.addCell(emptyCell);    circularInfotable.addCell(emptyCell);    circularInfotable.addCell(emptyCell);    circularInfotable.addCell(contentEnCell);    circularInfotable.addCell(contentArCell);    circularInfotable.addCell(emptyCell);    circularInfotable.getDefaultCell().setborder(pdfPCell.NO_border);    circularInfotable.setWIDthPercentage(100);    document.add(circularInfotable);    document.close();}catch (Exception e){}
解决方法 请查看 ParseHtml7和 ParseHtml8示例.他们使用阿拉伯字符输入HTML输入,并使用相同的阿拉伯文字创建pdf:

在我们查看代码之前,请允许我解释在源代码中使用非ASCII字符不是一个好主意.例如:这没有完成:

HTMLContentAr = “<p><span> رقم التعميم رقم التعميم</p><p>رقم التعميم ….</span></p>”;

您永远不会知道如何存储包含这些字形的Java文件.如果它没有存储为UTF-8,那么角色最终可能会看起来像完全不同的东西.已知版本控制系统存在非ASCII字符问题,甚至编译器也可能导致编码错误.如果您确实希望在代码中存储硬编码的String值,请使用UNICODE表示法.您的部分问题是编码问题,您可以在此处阅读更多相关信息:Can’t get Czech characters while generating a PDF

对于屏幕截图中显示的示例,我使用UTF-8编码保存了以下文件:

这是你在文件arabic.HTML中可以找到的:

<HTML><body ><p>رقم التعميم رقم التعميم</p><p>رقم التعميم</p></body></HTML>

这是你在arabic2.HTML文件中找到的:

<HTML><body ><table><tr><td dir="rtl">رقم التعميم رقم التعميم</td><td dir="rtl">رقم التعميم</td></tr></table></body></HTML>

问题的第二部分涉及字体.使用知道如何绘制阿拉伯字形的字体非常重要.很难相信你的C:驱动器的根目录上有arial.ttf.那不是个好主意.我希望你使用C:/windows/Fonts/arialuni.ttf,它肯定知道阿拉伯字形.

选择字体是不够的.您的HTML需要知道要使用哪个字体系列.因为文档中的大多数示例都使用Arial,所以我决定使用NOTO字体.我通过阅读这个问题发现了这些字体:iText pdf not displaying Chinese characters when using NOTO fonts or Source Hans.我非常喜欢这些字体,因为它们很好并且(几乎)支持所有语言.例如,我使用了NotoNaskharabic-Regular.ttf,这意味着我需要像这样定义字体familIE:

  

我在我的XML的body标签中定义了样式,显然你可以选择在哪里定义它:在外部CSS文件中,在< head>的样式部分中,在< td>的级别上. tag,…这个选择完全属于你,但你必须定义哪个字体要使用.

当然:当XML Worker遇到Font-family:Noto Naskh arabic时,除非我们注册该字体,否则iText不知道在哪里找到相应的NotoNaskharabic-Regular.ttf.我们可以通过创建FontProvIDer接口的实例来完成此 *** 作.我选择使用XMLWorkerFontProvIDer,但您可以自由编写自己的FontProvIDer实现:

XMLWorkerFontProvIDer FontProvIDer = new XMLWorkerFontProvIDer(XMLWorkerFontProvIDer.DONTLOOKFORFontS);FontProvIDer.register("resources/Fonts/NotoNaskharabic-Regular.ttf");

还有一个障碍:阿拉伯语是从右到左书写的.我看到您要在pdfPCell级别定义运行方向,并使用ElementList将HTML内容添加到此单元格.这就是我第一次写一个名为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();}

HTML中没有表格,但是我们创建了自己的pdfPtable,我们将HTML中的内容添加到带有运行方向LTR的pdfPCell,然后我们将这个单元格添加到表格中,并将表格添加到文档中.

也许这是你的实际要求,但为什么你会这么复杂地做到这一点?如果您需要一个表,为什么不在HTML中创建该表并定义一些单元格是RTL,如下所示:

<td dir="rtl">...</td>

这样,您不必创建ElementList,您可以像在ParseHtml8示例中那样将HTML解析为pdf:

public voID createpdf(String file) throws IOException,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);    HTMLPipelineContext HTMLContext = new HTMLPipelineContext(CSSApplIErs);    HTMLContext.setTagFactory(Tags.getHTMLTagProcessorFactory());    // Pipelines    pdfWriterPipeline pdf = new pdfWriterPipeline(document,writer);    HTMLPipeline HTML = new HTMLPipeline(HTMLContext,Charset.forname("UTF-8"));;    // step 5    document.close();}

此示例中所需的代码较少,并且当您想要更改布局时,只需更改HTML即可.您无需更改Java代码.

还有一个例子:在ParseHtml9,我创建了一个在一列中有英文名称的表(“LaWrence of arabia”)和另一列中的阿拉伯语翻译(“لورانسالعرب”).因为我需要不同的英文和阿拉伯字体,我在< td>处定义字体.水平:

<table><tr><td>LaWrence of arabia</td><td dir="rtl" >لورانس العرب</td></tr></table>

对于第一列,使用默认字体,从左到右不需要特殊设置.对于第二列,我定义了一个阿拉伯字体,并将运行方向设置为“rtl”.

结果如下:

这比你在代码中尝试做的要容易得多.

总结

以上是内存溢出为你收集整理的使用iText从html内容到pdf的阿拉伯字符全部内容,希望文章能够帮你解决使用iText从html内容到pdf的阿拉伯字符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1033214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存