看源码发现有一个包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包(pdfbox-2.0.8.jar,fontbox-2.0.8.jar,pdfbox-tools-2.0.8.jar)
pdfbox-3.0.0-RC1 PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。
提取文本,包括Unicode字符。和Jakarta Lucene等文本搜索引擎的整合过程十分简单。加密/解密PDF文档。从PDF和XFDF格式中导入或导出表单数据。向已有PDF文档中追加内容。将一个PDF文档切分为多个文档。...
pdfbox-app-2.0.2.jar
pdfbox-0.8.0-incubating.jar fontbox-0.8.0-incubating.jar
PDFBox-0.7.2-log4j.jar
有关pdfbox-1.3.1中Identity-H编码为乱码的解决方法 有关pdfbox-1.3.1中Identity-H编码为乱码的解决方法
pdfbox-debugger-2.0.13.jar
pdfbox-app-1.7.1.jar 操作pdf必不可少的东西,版本稳定
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
java中用于处理pdf文件的jar包。
PDFbox.jar,2.0.9版本,PDFbox.jar,2.0.9版本,PDFbox.jar,2.0.9版本,PDFbox.jar,2.0.9版本,
开元Java PDF库,允许访问PDF文件的各项信息。
pdfbox-app-1.8.0 java读写pdf文档的必备jar包
研究pdftoImage时搜索的,包括其他相关联的包
pdf转图片,pdf转图片。。。。。。会选择下载这个的应该是知道做什么用的
java读取加密PDF文件时用到的包,Apache 官网最新的!
需要在java项目中操作PDF文件的话下载这个哦
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