`
shappy1978
  • 浏览: 699864 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java pdfbox0.8 UniGB-UCS2-H 问题

    博客分类:
  • J2EE
阅读更多

http://drunkfish.spaces.live.com/blog/cns!FC3E3585A287F598!372.entry

看源码发现有一个包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,没有详细查看。

 

分享到:
评论
1 楼 linustseng 2011-07-25  
你好.
這似乎是舊版的修正代碼, 請問有新版的修正代碼嗎?

相关推荐

    pdfbox-3.0.0-RC1.jar

    pdfbox-3.0.0-RC1 PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。

    pdfbox-2.0.8.jar,fontbox-2.0.8.jar,pdfbox-tools-2.0.8.jar

    在这个压缩包中,我们找到了三个核心的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的核心库,...

    pdfbox-app-2.0.31.jar

    从 https://pdfbox.apache.org/ 下载,太费时了。 为了节约你的时间,我上传了这个 pdfbox-app-2.0.31.jar

    PDFbox-app-2.0.9.jar;PDFbox.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中Identity-H编码为乱码的解决方法

    在使用PDFBox 1.3.1版本时,可能会遇到一个常见的问题,即当处理包含非ASCII字符(如中文、日文或韩文等)的PDF文件时,可能会出现“Identity-H”编码导致的乱码现象。这是因为PDFBox在解析含有Unicode编码的PDF文档...

    pdfbox-app-2.0.2.jar

    pdfbox-app-2.0.2.jar

    PDFBox-0.7.2-log4j.jar

    PDFBox-0.7.2-log4j.jar

    pdfbox-1.8.0-src

    在"pdfbox-1.8.0-src"这个压缩包中,包含了PDFBox库的源代码,对于开发者来说,这是一个深入了解PDFBox工作原理和定制功能的好资源。 PDFBox的核心功能包括: 1. **文档读取**:PDFBox提供了PDDocument类,可以...

    pdfbox-0.8.0-incubating.jar fontbox-0.8.0-incubating.jar

    PDFBox的0.8.0-incubating版本代表这是一个早期的不稳定版本,可能包含一些未解决的问题或功能不完善的地方,但它是PDFBox发展过程中的一个重要里程碑。 FontBox是PDFBox的配套库,专注于处理PDF文档中的字体问题。...

    pdfbox-debugger-2.0.13.jar

    pdfbox-debugger-2.0.13.jar

    pdfbox-app-1.8.5.zip

    PDFBox-app-1.8.5.zip 是一个包含Apache PDFBox应用模块的版本1.8.5的压缩包。Apache PDFBox是Java的一个开源库,专门用于处理PDF文档。这个库提供了许多功能,如创建、读取、编辑PDF文档,以及签署PDF文件、提取...

    pdfbox-app-1.7.1.jar pdf操作

    在本例中,我们关注的是`pdfbox-app-1.7.1.jar`,这是一个特定版本的PDFBox应用组件,适用于Java环境。 PDFBox 1.7.1是该库的一个稳定版本,这意味着它经过了广泛的测试和验证,适合在生产环境中使用。这个版本包含...

    pdfbox-2.0.7全部jar包

    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.15

    pdfbox-app-1.8.2.jar

    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

    这个"pdfbox-app-1.8.4"版本是其应用程序模块,主要提供了在Java环境中对PDF文档进行操作的功能,比如读取、写入、转换、签署以及提取元数据等。在Java开发中,如果你需要处理PDF相关的任务,PDFBox是一个非常实用的...

    pdfbox-app-1.6.0.jar

    java中用于处理pdf文件的jar包。

    pdfbox-app-1.8.0

    pdfbox-app-1.8.0 java读写pdf文档的必备jar包

Global site tag (gtag.js) - Google Analytics