看源码发现有一个包org.apache.pdfbox.encoding.conversion, 这里已经有了各自中文编码的解析程序. 可奇怪的是却没有任何地方调用这些程序. 所以解析pdf文档是依然会报IOException说UniGB-UCS2-H等字体找不到. 看来只有修改源码来解决了. 仔细研究代码后, 发现修改点是程序org.apache.pdfbox.pdmodel.font.PDFont.java
首先增加一个方法以得到字体信息
public String getEncodingName() {
COSBase encoding = font.getDictionaryObject(COSName.ENCODING);
if (encoding != null) {
if (encoding instanceof COSName) {
return ((COSName) encoding).getName();
}
}
return null;
}
再修改方法:
public String encode( byte[] c, int offset, int length ) throws IOException
......
//大约420多行, 原代码如下:
if( retval == null && cmap != null )
{
retval = cmap.lookup( c, offset, length );
}
//if we havn't found a value yet and
//we are still on the first byte and
//there is no cmap or the cmap does not have 2 byte mappings then try to encode
//using fallback methods.
//修改为:
if( retval == null && cmap != null )
{
String encodingStr = getEncodingName();
if (encodingStr != null) {
EncodingConverter converter = EncodingConversionManager.getConverter(encodingStr);
if (converter != null) {
if (length == 1) return null;
retval = converter.convertBytes(c, offset, length, cmap);
} else {
retval = cmap.lookup( c, offset, length );
}
} else {
retval = cmap.lookup( c, offset, length );
}
}
//if we havn't found a value yet and
//we are still on the first byte and
//there is no cmap or the cmap does not have 2 byte mappings then try to encode
//using fallback methods.
测试通过, 问题解决
//*********************************************************shappy 评述
这个问题网上找了好久,浪费了一个下午的时间,问的人很多,更多是是混淆视听,列出一些诸如把中文输出到pdf的答案,谢谢上面的作者,ant编译后可用,不过存在两个问题:
1 上述代码遇到非中文字体的中文(比如system),会解析为乱码,因此修改为如下代码:
retval = cmap.lookup( c, offset, length );
if(retval==null){
String encodingStr = getEncodingName();
if (encodingStr != null) {
EncodingConverter converter = EncodingConversionManager.getConverter(encodingStr);
if (converter != null) {
if (length == 1) return null;
retval = converter.convertBytes(c, offset, length, cmap);
} else {
retval = cmap.lookup( c, offset, length );
}
}
2 解析UniGB-UCS2-H字体的文件会在部分文字中间插入一个空格,而解析其他字体不会,这个估计是EncodingConversionManager的bug,没有详细查看。
分享到:
相关推荐
pdfbox-3.0.0-RC1 PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。
在这个压缩包中,我们找到了三个核心的JAR文件:`pdfbox-2.0.8.jar`, `fontbox-2.0.8.jar`, 和 `pdfbox-tools-2.0.8.jar`,它们分别对应PDFBox的主要功能模块。 1. **pdfbox-2.0.8.jar**: 这是PDFBox的核心库,...
从 https://pdfbox.apache.org/ 下载,太费时了。 为了节约你的时间,我上传了这个 pdfbox-app-2.0.31.jar
PDFbox.jar,2.0.9版本,PDFbox.jar,2.0.9版本,PDFbox.jar,2.0.9版本,PDFbox.jar,2.0.9版本,
在使用PDFBox 1.3.1版本时,可能会遇到一个常见的问题,即当处理包含非ASCII字符(如中文、日文或韩文等)的PDF文件时,可能会出现“Identity-H”编码导致的乱码现象。这是因为PDFBox在解析含有Unicode编码的PDF文档...
pdfbox-app-2.0.2.jar
PDFBox-0.7.2-log4j.jar
在"pdfbox-1.8.0-src"这个压缩包中,包含了PDFBox库的源代码,对于开发者来说,这是一个深入了解PDFBox工作原理和定制功能的好资源。 PDFBox的核心功能包括: 1. **文档读取**:PDFBox提供了PDDocument类,可以...
PDFBox的0.8.0-incubating版本代表这是一个早期的不稳定版本,可能包含一些未解决的问题或功能不完善的地方,但它是PDFBox发展过程中的一个重要里程碑。 FontBox是PDFBox的配套库,专注于处理PDF文档中的字体问题。...
pdfbox-debugger-2.0.13.jar
PDFBox-app-1.8.5.zip 是一个包含Apache PDFBox应用模块的版本1.8.5的压缩包。Apache PDFBox是Java的一个开源库,专门用于处理PDF文档。这个库提供了许多功能,如创建、读取、编辑PDF文档,以及签署PDF文件、提取...
在本例中,我们关注的是`pdfbox-app-1.7.1.jar`,这是一个特定版本的PDFBox应用组件,适用于Java环境。 PDFBox 1.7.1是该库的一个稳定版本,这意味着它经过了广泛的测试和验证,适合在生产环境中使用。这个版本包含...
pdfbox-2.0.7.jar fontbox-2.0.7.jar preflight-2.0.7.jar xmpbox-2.0.7.jar pdfbox-tools-2.0.7.jar pdfbox-debugger-2.0.7.jar
pdfbox-app-1.8.15
pdfbox-app-1.8.2.jarpdfbox-app-1.8.2.jarpdfbox-app-1.8.2.jarpdfbox-app-1.8.2.jarpdfbox-app-1.8.2.jarpdfbox-app-1.8.2.jar
这个"pdfbox-app-1.8.4"版本是其应用程序模块,主要提供了在Java环境中对PDF文档进行操作的功能,比如读取、写入、转换、签署以及提取元数据等。在Java开发中,如果你需要处理PDF相关的任务,PDFBox是一个非常实用的...
java中用于处理pdf文件的jar包。
pdfbox-app-1.8.0 java读写pdf文档的必备jar包