TomRoush / PdfBox-Android

The Apache PdfBox project ported to work on Android
Apache License 2.0
1.02k stars 260 forks source link

Garbled characters are displayed in Chinese #383

Open yyclang opened 2 years ago

yyclang commented 2 years ago

AEDB63BB792F3D12ED16B343A25BB9C4

How can you help me solve the Chinese coding problem, as shown in the figure

yyclang commented 2 years ago

Anybody know?Thank you very much。

anyongjin commented 2 years ago

你是调用的PDFRenderer.renderImage方法么?提供下问题的pdf文件看看

yyclang commented 2 years ago

abc.pdf

anyongjin commented 2 years ago
1647930182(1) 1647930217(1)

第一个图片是你提供的pdf文件,第二个图片是我的另一个发票pdf文件。 正常的pdf嵌入字体,unicode character和glyph是一一对应的,像第二个图片里那样。 你的pdf嵌入的宋体,glyph和unicode character对应关系是混乱的,glyph像是日文。 另外,导致错误的直接原因是你的pdf中嵌入字体缺少ToUnicode属性。正确的嵌入字体都应该包含这个属性,这个属性是告诉pdf解析程序,content stream中代表字符的code如何与unicode字符对应。 因为缺少这个属性,所以字符直接提取失败了。

yyclang commented 2 years ago
1647930182(1) 1647930217(1)

第一个图片是你提供的pdf文件,第二个图片是我的另一个发票pdf文件。 正常的pdf嵌入字体,unicode character和glyph是一一对应的,像第二个图片里那样。 你的pdf嵌入的宋体,glyph和unicode character对应关系是混乱的,glyph像是日文。 另外,导致错误的直接原因是你的pdf中嵌入字体缺少ToUnicode属性。正确的嵌入字体都应该包含这个属性,这个属性是告诉pdf解析程序,content stream中代表字符的code如何与unicode字符对应。 因为缺少这个属性,所以字符直接提取失败了。

我知道问题原因,是找不到宋体字库,但不清楚代码该怎么完善,麻烦你点播一下代码如何完善 PDDocument document = PDDocument.load(getAssets().open("abc.pdf")); //document.registerTrueTypeFontForClosing(); PDFRenderer renderer = new PDFRenderer(document); Bitmap pageImage = renderer.renderImage(0, 3f, ImageType.ARGB); File renderFile = new File(Environment.getExternalStorageDirectory() + "/lixinghang/invoices/" + "发票.png"); FileOutputStream fileOut = new FileOutputStream(renderFile); pageImage.compress(Bitmap.CompressFormat.PNG, 100, fileOut); fileOut.close();

anyongjin commented 2 years ago

亲,不是代码的问题,是你提供的这个pdf文件不规范。你应该用规范的符合pdf标准的pdf文件来测试。

yyclang commented 2 years ago

亲,不是代码的问题,是你提供的这个pdf文件不规范。你应该用规范的符合pdf标准的pdf文件来测试。

这个是税务局给出的发票,我用其他库PDFview是可以正常显示的,没有乱码现象。 另外,我pdbox的桌面版程序做了测试,也是正常显示与转化成图片的

anyongjin commented 2 years ago

custom-render 我用pdfbox测试了你的这个文件,中文部分依然是无法输出的,另一个正常的发票pdf转图片后可以看到中文: 红米K40发票.pdf

pdfbox和pdfbox-android这两个库,都是只针对符合pdf标准的文件做了解析,对于不符合标准的文件,支持有限。其他的pdf阅读器,我知道的如Adobe Acrobat,针对不符合标准的文件也做了很多的额外的修复逻辑,所以可以经常看到,一些pdf在pdfbox中报错,Adobe Acrobat却能打开的现象。

pdfbox似乎目前没有针对不符合标准的文件做很多兼容的计划。pdfbox-android是pdfbox的迁移版本,似乎也没有这样的支持计划。

如果你只是想将pdf转为图片的话,在Android端,我建议使用官方的android.graphics.pdf.PdfRenderer,支持API 21及以上,速度和兼容性都要比pdfbox-android好很多。我测试你这个文件可以在PdfRenderer中转图片后正常显示中文。

yyclang commented 2 years ago

custom-render 我用pdfbox测试了你的这个文件,中文部分依然是无法输出的,另一个正常的发票pdf转图片后可以看到中文: 红米K40发票.pdf

pdfbox和pdfbox-android这两个库,都是只针对符合pdf标准的文件做了解析,对于不符合标准的文件,支持有限。其他的pdf阅读器,我知道的如Adobe Acrobat,针对不符合标准的文件也做了很多的额外的修复逻辑,所以可以经常看到,一些pdf在pdfbox中报错,Adobe Acrobat却能打开的现象。

pdfbox似乎目前没有针对不符合标准的文件做很多兼容的计划。pdfbox-android是pdfbox的迁移版本,似乎也没有这样的支持计划。

如果你只是想将pdf转为图片的话,在Android端,我建议使用官方的android.graphics.pdf.PdfRenderer,支持API 21及以上,速度和兼容性都要比pdfbox-android好很多。我测试你这个文件可以在PdfRenderer中转图片后正常显示中文。

感谢你在百忙之中,测试我的问题,冒昧的问一下,我用PdfRenderer试了下,发现转成图片后右下角的签章不能显示出来,你那可以吗?可以的话,请教一下哪里可以设置

anyongjin commented 2 years ago

我试了下,你的这个pdf,我这里用PdfRenderer转图片也看不到右下角的红章。不过另一个发票pdf转了后能看到。 最简单的方法:要求pdf提供方提供符合标准的pdf文件吧

yyclang commented 2 years ago

我试了下,你的这个pdf,我这里用PdfRenderer转图片也看不到右下角的红章。不过另一个发票pdf转了后能看到。 最简单的方法:要求pdf提供方提供符合标准的pdf文件吧

要求税务局给我标准的文件,这个不现实。而且,我试了下桌面版的pdfbox是没什么问题的 WechatIMG127 WechatIMG128 WeChatcaf5d007895a441d767c4af8c7043bef

XDao7 commented 2 years ago

custom-render 我用pdfbox测试了你的这个文件,中文部分依然是无法输出的,另一个正常的发票pdf转图片后可以看到中文: 红米K40发票.pdf

pdfbox和pdfbox-android这两个库,都是只针对符合pdf标准的文件做了解析,对于不符合标准的文件,支持有限。其他的pdf阅读器,我知道的如Adobe Acrobat,针对不符合标准的文件也做了很多的额外的修复逻辑,所以可以经常看到,一些pdf在pdfbox中报错,Adobe Acrobat却能打开的现象。

pdfbox似乎目前没有针对不符合标准的文件做很多兼容的计划。pdfbox-android是pdfbox的迁移版本,似乎也没有这样的支持计划。

如果你只是想将pdf转为图片的话,在Android端,我建议使用官方的android.graphics.pdf.PdfRenderer,支持API 21及以上,速度和兼容性都要比pdfbox-android好很多。我测试你这个文件可以在PdfRenderer中转图片后正常显示中文。

PdfBox-Android version: [e.g. 2.0.25.0] Android API version: [e.g. API 29] 我在上述环境下尝试打开了这条回复中提供的pdf文件,发票的电子章显示不正常,请问一下是我的代码哪里有问题还是说并不支持显示电子印章? Screenshot_20220811_173716