我正在尝试将带有阿拉伯字符的 PDF 转换为图像以用作我网页上的缩略图。
PDFrenderer
,PDFBox
转换后都不能保留阿拉伯字符,我只设法获得了令人满意的结果JMagick
,但问题是它使用了 adll
和其他一些我无权添加到我的应用程序安装程序中的依赖项。
有没有我可能错过的更好的开源解决方案,最坏的情况是什么是最好的支付解决方案?
谢谢
这是我的 pdf 模拟文件:
我正在尝试将带有阿拉伯字符的 PDF 转换为图像以用作我网页上的缩略图。
PDFrenderer
,PDFBox
转换后都不能保留阿拉伯字符,我只设法获得了令人满意的结果JMagick
,但问题是它使用了 adll
和其他一些我无权添加到我的应用程序安装程序中的依赖项。
有没有我可能错过的更好的开源解决方案,最坏的情况是什么是最好的支付解决方案?
谢谢
这是我的 pdf 模拟文件:
(我将其发布为答案,因为评论太长了,即使它只是对给定示例 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 使用 JRE 的文本呈现功能,需要首先将文本信息转换为 Unicode,然后呈现这些 unicode 字符。但是,嵌入的字体不包含任何编码或映射信息。
转换为 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
抛出 an:
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 创建过程以包含更完整的字体信息。
ABCpdf .NET 将进行这种类型的转换。
它支持所有那些通常不受支持的功能,例如阿拉伯语、Type 3 字体、渐变、不寻常的色彩空间、专色和 PostScript 功能。
这是使用 ABCpdf .NET 转换为 PNG 的 PDF。
我在 ABCpdf .NET 软件组件上工作,因此我的回复可能包含基于 ABCpdf 的概念。这只是我所知道的。:-)