对于我的网站,我使用itextpdf 5.5.4生成PDF下载。该网站适用于说英语的人。最近,来自埃及的用户使用了该网站,输入了一些阿拉伯语内容,并与他联系解决了他所遇到的问题。
这是他在浏览器中正确显示的阿拉伯语内容:
这在PDF中显示不正确:
这是我的Java代码。请注意,它实际上能够正确生成带有中文字符的PDF:
BASE_FONT base = BaseFont.createFont("/fonts/ARIALUNI.ttf", BaseFont.IDENTITY_H , BaseFont.EMBEDDED);
Font f = new Font(base, 10f);
String htmlString = string_with_Arabic_text;
Paragraph p = new Paragraph(htmlString, f);
p.setSpacingBefore(20.0f);
p.setSpacingAfter(7.0f);
document.add(p);
如何解决问题?
在Eclipse(我使用的IDE)中,我能够在htmlString
中正确显示阿拉伯字符。此时,由于各种项目原因,我无法升级到使用最新版本的itextpdf。
答案 0 :(得分:1)
iText 5对非西方书写系统的支持有限。它支持从右到左书写,但仅限于 ColumnText
和 PdfPCell
对象的上下文。
这是一个带有ColumnText
的iText 5示例,其中p
包含阿拉伯语文字:
ColumnText canvas = new ColumnText(writer.getDirectContent());
canvas.setSimpleColumn(36, 750, 559, 780);
canvas.setRunDirection(PdfWriter.RUN_DIRECTION_LTR);
canvas.addElement(p);
canvas.go();
这是一个带有PdfPCell
的iText 5示例,其中p
包含阿拉伯语文字:
PdfPCell cell = new PdfPCell(p);
cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
这非常烦人,因为这意味着您必须重写整个应用程序,以便在ColumnText
或PdfPCell
对象中添加所有文本。您还必须检查内容以检查是否需要更改运行方向。
由于你必须重写应用程序,最好升级到iText 7,因为iText 7有一个附加组件,可以根据内容的UNICODE值检测写入系统(参见pdfCalligraph )。当检测到阿拉伯语或希伯来语文本时,附加组件将“从左到右”的书写系统更改为“从右到左”。见How to display Arabic strings from RTL in PDF generated using itext 7 API?
我看到你正在为你的文件编码。请注意,您可以通过使用HTML创建内容,然后使用pdfHTML add-on将其转换为PDF来节省大量工作。 PDF to HTML tutorial有一些涉及阿拉伯语的例子。请参阅chapter 6中的国际化部分以及以下常见问题条目:
iText 7也是第一个支持更多书写系统的版本,例如梵文,泰米尔语,泰卢固语......有关详细信息,请阅读pdfCalligraph white paper。
重要说明: pdfCalligraph插件是封闭源代码。您需要一个试用许可证来测试它和一个商业许可证才能在生产中使用它。请注意,您使用的当前版本的iText被许可为AGPL软件,这意味着您无法在封闭的源环境中使用您的项目。您提到外部用户,这意味着您正在分发您的服务。你开源所有自己的源代码了吗?如果没有,您应购买使用iText的商业许可证。