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

使用iText从html内容到pdf的阿拉伯文字符,html,pdf,text,itext,arabic,Html,Pdf,Text,Itext,Arabic,在PDF生成中,我无法将HTML内容中的阿拉伯字符显示为“?” 我能够显示字符串变量中的阿拉伯语文本。同时,我无法从HTML字符串生成阿拉伯语文本 我想显示两列的PDF,左边是英文,右边是阿拉伯文 当我使用以下程序转换成pdf时。请在这方面帮助我 try { Document document = new Document(PageSize.A4, 50, 50, 50, 50); ByteArrayOutputStream out = new ByteArrayOutputSt

在PDF生成中,我无法将HTML内容中的阿拉伯字符显示为“

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

我想显示两列的PDF,左边是英文,右边是阿拉伯文

当我使用以下程序转换成pdf时。请在这方面帮助我

try
{
    Document document = new Document(PageSize.A4, 50, 50, 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 + ")", new Font(bf, 14, 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)
{

}
试试看
{
文件=新文件(PageSize.A4、50、50、50、50);
ByteArrayOutputStream out=新建ByteArrayOutputStream();
PdfWriter writer=PdfWriter.getInstance(文档,输出);
BaseFont bf=BaseFont.createFont(“C:\\arial.ttf”,BaseFont.IDENTITY\u H,BaseFont.EMBEDDED);
Font Font=新字体(bf,8);
document.open();
BufferedReader br=新的BufferedReader(新文件阅读器(“C:\\style.css”);
StringBuffer fileContents=新的StringBuffer();
String line=br.readLine();
while(行!=null)
{
fileContents.append(行);
line=br.readLine();
}
br.close();
字符串样式=fileContents.toString();/“p{font-family:Arial;}”;
第cirNoEn段=空;
第cirNoAr段=空;
字符串HTMLCONTEN=null;
字符串htmlContentAr=null;
PdfPCell contentEnCell=新的PdfPCell();
PdfPCell contentArCell=新的PdfPCell();
cirNoEn=新段落(“通告编号”(“+cirEnNo+”),新字体(bf,14,Font.BOLD | Font.UNDERLINE));
cirNoAr=新段落(“Ciranno+”),新字体(bf,14,Font.BOLD,Font.UNDERLINE));
HTMLCONTEN=“亲爱的…”;
htmlContentAr=“”;
for(元素e:XMLWorkerHelper.parseToElementList(HTMLContent,styles))
{
for(Chunk c:e.getChunks())
{
c、 setFont(新字体(bf));
}
内容二、补遗(e);
}
for(元素e:XMLWorkerHelper.parseToElementList(HTMLContent,styles))
{
for(Chunk c:e.getChunks())
{
c、 setFont(新字体(bf));
}
contentArCell.addElement(e);
}
PdfPCell emptyCell=新的PdfPCell();
PdfPCell cirNoEnCell=新的PdfPCell(cirNoEn);
PdfPCell cirNoArCell=新的PdfPCell(cirNoAr);
cirNoEnCell.setHorizontalAlignment(元素对齐\中心);
Cirnarcell.setHorizontalAlignment(元素对齐\中心);
emptyCell.setBorder(矩形,无边框);
空芯设置固定高度(15);
cirNoEnCell.SetBeOrder(矩形,无边框);
Cirnarcell.SetBeOrder(矩形,无边框);
ContentCell.SetBeOrder(矩形,无边框);
contentArCell.setBorder(矩形,无边框);
cirNoArCell.setRunDirection(PdfWriter.RUN\u DIRECTION\u RTL);
contentArCell.setRunDirection(PdfWriter.RUN\u DIRECTION\u RTL);
contentEnCell.setNoWrap(false);
contentArCell.setNoWrap(false);
PdfPTable circularInfoTable=null;
空细胞集落数(2);
circularInfoTable=新的PdfPTable(2);
循环表addCell(cirNoEnCell);
循环表addCell(cirNoArCell);
循环表addCell(emptyCell);
循环表addCell(emptyCell);
循环表addCell(emptyCell);
circularInfoTable.addCell(contentEnCell);
循环表addCell(contentArCell);
循环表addCell(emptyCell);
circularInfoTable.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
可循环设置宽度百分比(100);
文件。添加(循环表格);
document.close();
}
捕获(例外e)
{
}
请看下面的示例。他们使用阿拉伯语字符输入HTML,并使用相同的阿拉伯语文本创建PDF:

在我们看代码之前,请允许我解释一下,在源代码中使用非ASCII字符不是一个好主意。例如:此操作未完成:

 htmlContentAr = “<p><span> رقم التعميم رقم التعميم</p><p>رقم التعميم ….</span></p>”;
这是您将在文件
arabic2.html
中找到的内容:

<html>
<body style="font-family: Noto Naskh Arabic">
<p>رقم التعميم رقم التعميم</p>
<p>رقم التعميم</p>
</body>
</html>
<html>
<body style="font-family: Noto Naskh Arabic">
<table>
<tr>
<td dir="rtl">رقم التعميم رقم التعميم</td>
<td dir="rtl">رقم التعميم</td>
</tr>
</table>
</body>
</html>
我在XML的body标记中定义了样式,很明显,您可以选择在何处定义它:在外部CSS文件中,在
的样式部分,在
标记级别,。。。这完全是你的选择,但你必须定义使用哪种字体

当然:当XML工作者遇到
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内容添加到此单元格。这就是为什么我首先写了一个类似的例子,名为:

HTML中没有表,但我们创建了自己的
PdfPTable
,我们使用运行方向LTR将HTML中的内容添加到
PdfPCell
,并将此单元格添加到表中,将表添加到文档中

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

<td dir="rtl">...</td>
本例中所需的代码较少,当您想要更改布局时,只需更改HTML即可。您不需要更改Java代码

还有一个例子:在中,我创建了一个表,其中一列为英文名称(“阿拉伯的劳伦斯”),另一列为阿拉伯语翻译(“阿拉伯的劳伦斯”)。因为英语和阿拉伯语需要不同的字体,所以我在
级别定义字体:

<table>
<tr>
<td>Lawrence of Arabia</td>
<td dir="rtl" style="font-family: Noto Naskh Arabic">لورانس العرب</td>
</tr>
</table>

阿肯色州的劳伦斯
<td dir="rtl">...</td>
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);
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

    // Pipelines
    PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
    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"));;
    // step 5
    document.close();
}
<table>
<tr>
<td>Lawrence of Arabia</td>
<td dir="rtl" style="font-family: Noto Naskh Arabic">لورانس العرب</td>
</tr>
</table>