解决pdfbox中文乱码问题

buybyetoo 2010-12-09 06:07:43
网上搜的中文解决办法都不管用,花了几天时间,终于自己解决了。
##org.apache.pdfbox.pdmodel.font.PDFont.java

public String encode( byte[] c, int offset, int length ) throws IOException
{
String retval = null;
if( cmap != null )
{
if (length == 1 && cmap.hasOneByteMappings())
{
retval = cmap.lookup( c, offset, length );
}
else if (length == 2 && cmap.hasTwoByteMappings())
{
retval = cmap.lookup( c, offset, length );
}

}

// there is no cmap but probably an encoding with a suitable mapping
if( retval == null )
{
Encoding encoding = getEncoding();
if( encoding != null )
{
retval = encoding.getCharacter( getCodeFromArray( c, offset, length ) );
}

// when the font has a DescendantFonts ,try to decode with it
if(length == 2 && retval == null && this instanceof PDType0Font)
{
COSArray descendantFontArray =(COSArray)font.getDictionaryObject( COSName.DESCENDANT_FONTS );

if( descendantFontArray != null && descendantFontArray.size() != 0)
{
COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
PDFont descendentFont = PDFontFactory.createFont( descendantFontDictionary );
CMap cmp = descendentFont.cmap ;
String cmpName = cmp.getRegistry()+"-"+cmp.getOrdering()+"-UCS2";
CMap cmp2 = cmapObjects.get(cmpName);

if(cmp2 == null && threadLocale.get() == null)
{
parseCmap( resourceRootCMAP, getClass().getResourceAsStream(cmpName), COSName.getPDFName(cmpName) );
threadLocale.set(true);
cmp2 = cmapObjects.get(cmpName);
if(cmp2 == null)
{
log.warn("Can't parse the CMap for " + cmpName);
}
}

if(cmp2 != null)
{
retval = cmp2.lookup(c, offset, length);
}

}
}

if( retval == null && (cmap == null || length == 2))
{
retval = getStringFromArray( c, offset, length );
}
}
return retval;
}
...全文
3611 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuangr 2011-01-02
  • 打赏
  • 举报
回复
杂不发呢?
buybyetoo 2010-12-10
  • 打赏
  • 举报
回复
还有点问题。解决后继续发
24K純帥 2010-12-10
  • 打赏
  • 举报
回复
解决了就好~
Jlins 2010-12-10
  • 打赏
  • 举报
回复
哦 谢谢共享..
buybyetoo 2010-12-10
  • 打赏
  • 举报
回复
看另外一篇...
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 将PDF文档转换为图片格式是一种常用的操作,尤其在处理包含中文字符的PDF文件时,这种转换可以有效避免文字乱码问题。Java中的PDFBox库是一个功能强大的工具,专门用于处理PDF文档,其中包括将PDF转换为图像的功能。PDFBox是Apache软件基金会的一个开源项目,提供了丰富的API用于读取、写入和修改PDF文档。 在这个特定的压缩包中,“PDF2img”是一个基于PDFBox开发的示例程序,旨在解决PDF转图片时可能出现的中文乱码问题PDFBox能够将PDF的每个页面渲染成高质量的图像,并支持多种图像格式,如JPEG和PNG等。这使得PDF内容可以方便地用于在线预览或嵌入到其他非PDF格式的文档中。在处理中文字符时,PDFBox通过正确设置字体和编码来确保中文字符的正确显示。中文乱码通常是由于PDF文档中使用的字体在目标系统中缺失,或者编码设置不正确导致的。PDFBox允许开发者指定字体映射,即使原始PDF中没有包含相应的中文字体,也能正确呈现中文字符。 使用PDFBox进行PDF转图片的步骤如下:首先,导入必要的PDFBox库并创建一个PDDocument对象来加载PDF文档。其次,如果PDF文档中使用了特殊字体或编码,需要创建字体映射,以确保PDFBox能够正确显示这些字符。然后,使用PDFRenderer类创建一个渲染器,该渲染器将负责将PDF页面转换为图像。接下来,对PDF的每个页面调用渲染器的renderImage方法,传入页面索引和图像格式(如JPEG或PNG)。生成的图像数据是一个BufferedImage对象,可以将其保存到磁盘。如果遇到中文乱码问题,需要检查PDF文档的编码设置,并确保其与转换代码中的设置一致。如果需要,可以使用PDType0Font来加载

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧