我正在尝试将包含阿拉伯字符的PDF转换为图片,以便在我的网页上用作缩略图。
PDFrenderer
,PDFBox
转换后都无法保留阿拉伯字符,我只能使用JMagick
获得令人满意的结果,但问题是它使用的是dll
和一些其他依赖项我无权添加到我的应用程序安装程序。
我可能错过了更好的开源解决方案,最糟糕的情况是那里最好的应付解决方案是什么?
谢谢
这是我的pdf模拟文件:
答案 0 :(得分:0)
(我发布这个作为答案,因为评论太长了,即使它只是对给定样本PDF的分析)
当PDFBox尝试渲染样本PDF时,实际上至少存在两个问题。
对于所有拉丁字母和所有数字,原始字体将替换为默认字体。参看日志输出如下:
23.05.2013 09:15:48 org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString
WARNUNG: Changing font on <H> from <Arial> to the default font
这是由于PDFBox的文字渲染方式以及嵌入字体可用的非常有限的信息。
PDFBox以一种首先将文本信息转换为Unicode然后渲染这些unicode字符的方式利用JRE的文本呈现功能。但是,嵌入字体不包含任何编码或映射信息。
转换为Unicode意外成功,因为PDFBox使用的回退只是假设某些默认编码。但是,渲染失败,因为JRE代码没有任何用于哪个Unicode字符的字形信息。
对于所有阿拉伯语文本,无法读取嵌入字体,因此使用Arial:
23.05.2013 09:15:48 org.apache.pdfbox.pdmodel.font.PDCIDFontType2Font getawtFont
INFO: Can't read the embedded font HYMDAA+ArialMT-Identity-H
23.05.2013 09:15:58 org.apache.pdfbox.pdmodel.font.PDType0Font getawtFont
INFO: Using font Arial instead of HYMDAA+ArialMT-Identity-H
这里已经解析嵌入字体失败了。在内部,JRE代码抛出Exception
:
java.awt.FontFormatException: Font name not found
at sun.font.TrueTypeFont.init(TrueTypeFont.java:527)
at sun.font.TrueTypeFont.<init>(TrueTypeFont.java:162)
at sun.font.FontManager.createFont2D(FontManager.java:2474)
at java.awt.Font.<init>(Font.java:570)
at java.awt.Font.createFont(Font.java:896)
at org.apache.pdfbox.pdmodel.font.PDCIDFontType2Font.getawtFont(PDCIDFontType2Font.java:81)
...
我对字体内部知识不是很了解,因此,不知道JRE代码在这里是否有些过于敏感,或者嵌入字体是否真的坏了。但这似乎很可疑。
问题1看起来像是PDFBox的缺点(期望能够从字形到Unicode进行往返,并且在没有丢失的情况下回到字形在PDF世界中是非常幼稚的)。因此,使用不太天真的方法的其他渲染器很可能成功地正确显示受此问题影响的文本。
另一方面,问题2可能会对许多渲染器造成障碍。我建议尝试调整PDF创建过程以包含更完整的字体信息。
答案 1 :(得分:0)
ABCpdf .NET将进行此类转换。
它支持所有通常不支持的功能,如阿拉伯语,Type 3字体,渐变,不寻常的色彩空间,专色和PostScript功能。
这是使用ABCpdf .NET将您的PDF转换为PNG。
我在ABCpdf .NET软件组件上工作,所以我的回复可能包含基于ABCpdf的概念。这就是我所知道的。 : - )