这两天刚好完成一个提取人行简版征信报告PDF所有数据的小项目,中间踩了很多坑,尤其是对于汉字编码问题度娘也不太灵。为了方便后人,在这里记录下在这个过程中我遇到的问题以及我的解决方法。

我用的是mac系统,Python 3.6,依赖第三方库pdfminer3k 1.3.1。这个是pdfminer的python 3.x版本,原始版为pdfminer,只支持python2 .x。

如果想要支持中日韩文字,这个库绝对不可pip安装。如何安装我后面介绍,在这里先吐槽一句,为啥utf-8很多个汉字对应着两套编码啊!!这个设定真是很坑啊!!如果看不懂吐槽没关系,你可以试着解析一下你自己的简版报告就懂了。。。

这个库的使用还是比较简单的,网上有很多的使用方法我就不重复了。其实开发者打包了一个脚本pdf2txt.py,里面包含了这个库的众多使用方法,看一遍就会用。在这里贴上我的代码:

from pdfminer.pdfinterp import PDFResourceManager, process_pdf

from pdfminer.converter import TextConverter, HTMLConverter

from pdfminer.layout import LAParams

from io import StringIO, open

import os

def readPDF(file_name):

rsrcmgr = PDFResourceManager()

retstr = StringIO()

laparams = LAParams(all_texts = True)

device = TextConverter(rsrcmgr, retstr, laparams=laparams)

file = open(file_name, 'rb')

process_pdf(rsrcmgr, device, file)

file.close()

device.close()

content = retstr.getvalue().split('\n')

retstr.close()

for i in range(len(content)):

content[i] = content[i].strip()

if content[i].startswith('第') and content[i].endswith('页'):

content[i]=''

if content[i].startswith('共') and content[i].endswith('页'):

content[i]=''

while '' in content:

content.remove('')

return content

运行完得到一个含有这个PDF所有文字信息的list,我的心中一阵狂喜,这不就是我想要的嘛,接下来使用正则大法提取相关内容就好了嘛!事实证明我还是太年轻。。。

这个包最大的坑就是汉字编码,具体是这样婶儿的:

我得到的content里第i行是字符串'2017年1月1日XXXX'(只是看起来是这样的),在这里我很开心的输入以下代码:

content[i].split('日')[0]

本以为日期就这样提取出来了,结果返回的竟然是原字符串!!难道是字打错了,尝试以下代码:

'日' in content[i]

竟然返回了False!也就是 '日' 并不在字符串 '2017年1月1日XXXX' 里!怎么可能??我瞪大眼睛看了半天,一度怀疑我学的是假python。。。

怀疑归怀疑,问题还是要解决。思索了下想到每个字其实都是对应一个编码,看到的字只是电脑输出的这个编码对应的字符而已,比如Python默认的编码是utf-8,于是我试了下:

content[i][8].encode('utf-8')

'日'.encode('utf-8')

果然返回的结果不一样,提取出来的'日'字编码是b'\xe2\xbd\x87',而我自己输入的'日'字编码为b'\xe6\x97\xa5',看起来一个字编码不一样!!(如果有大神帮忙解惑为啥会这样我将不胜感激。。)不信你可以度娘一个汉字与utf互转的网页,当你输入'日'字时出现的是第二个编码,而你用第一个和第二个编码反查汉字的话,输出的都是'日'字。

填坑过程我就不写了,在通读了这个库的代码后我发现想改只能从安装过程入手(白读半天源代码了。。),这就是之前说不要pip安装的原因。

接下来我贴下我的解决方案,如果有大神有其他方法还望分享。

这个库在安装时候需要单独安装对于cjk字符的支持,这个开发者在如何安装部分也有讲,比如macos/linux版命令如下:

python tools/conv_cmap.py pdfminer/cmap Adobe-CNS1 cmaprsrc/cid2code_Adobe_CNS1.txt

python tools/conv_cmap.py pdfminer/cmap Adobe-GB1 cmaprsrc/cid2code_Adobe_GB1.txt

这里先不着急运行以上命令。因为我的PDF是UniGB-UCS2-H编码,所以研究了一下cid2code_Adobe_GB1.txt,这个文件其实就是把GB系列的编码映射成utf-8编码。查了一下'日'字的编码,果然对应着两套utf-8编码e2bd87,e697a5。到这里问题基本已经摸清楚了,只要改脚本映射到第二个编码问题就解决了。

接下来就简单了,查看conv_cmap.py,发现这个脚本做了两件事情:第一是输出各种编码转CID的字典,第二是输出CID转utf-8字典。这里只需要对第二步稍做改动,定位到文件中的以下位置:

hcodes = []

vcodes = []

在这两行下面加入以下代码:

if len(x.split(',')) == 1:

temp = x.split(',')

else:

temp = x.split(',')[1:]

这4行代码的意思就是去掉我们输入不了的那一套编码,只留下能输入的那一套。

改过以后再执行安装:

python tools/conv_cmap.py pdfminer/cmap Adobe-CNS1 cmaprsrc/cid2code_Adobe_CNS1.txt

python tools/conv_cmap.py pdfminer/cmap Adobe-GB1 cmaprsrc/cid2code_Adobe_GB1.txt

python setup.py install

经过这样的修改,安装后提取的内容的编码就与我们输入的编码一致了,问题解决!

如果有同学遇到其他编码的相似问题,这个方法应该也能解决。如果不行可以贴出来大家一起研究~~

python解析pdf中文乱码_使用Python第三方库pdfminer提取PDF内容,并解决中文编码不支持的问题...相关推荐

  1. python 折线图中文乱码_彻底解决 Python画图中文乱码问题--Pyplotz组件

    1 源起 自从开始学习Python,就非常喜欢用来画图.一直没有需求画要中文显示信息的图,所以没有配置Python中文的环境.由于昨天就需要画几十个形式相同,只是数据不同的图,并且需要显示中文信息.如 ...

  2. python画图显示中文乱码_解决Python pandas plot输出图形中显示中文乱码问题

    解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'd:\\Anaco ...

  3. python解析pdf中文乱码_解析PDF文件以及解决编码问题

    1.解析pdf文件 最近需要将pdf中文本提取出来,于是就了解了一下pdfminer 首先安装:pip3 install pdfminer3k 之后就是用pdfminer解析,不多说,直接上代码,这些 ...

  4. python中字符串中文乱码_[python] 中文乱码问题

    乱码产生的原因 乱码产生的根本原因是字节流转换字符前后不一致导致.只要掌握了这个核心,就能解决乱码问题.python2中使用了一些"trick"(没有区分字符和字节流),所以理解起 ...

  5. python写入文件中文乱码_记一次python写入txt文件正常,但是写入csv文件中文乱码问题...

    今天在将已经爬取完存成txt文件批量导入保存csv格式时,文本中的汉字能够正常正常显示,但是用正常的方法保存到csv中就成了乱码. 最开始的写法:with open(city+'.csv','a+') ...

  6. python随机生成中文句子_关于python:从语法或Ngrams生成随机句子?

    我正在编写一个程序,该程序应该吐出一个我自己选择的复杂性的随机句子. 举一个具体的例子,我想通过吐出语法结构的有效句子并使用我已经学习过的单词来帮助我的语言学习. 尽管我愿意接受其他想法,但我想使用p ...

  7. python解析json多行_用Python将JSON单行解析为多行CSV

    我是一个pythonnoob,使用Plaid API获取银行交易.我希望每个事务都是它自己的行,我只想为每个记录提取四个值:日期.帐户.名称和金额,并用这些数据填充一个CSV文件.我有下面的代码,它填 ...

  8. python随机生成中文字符串_用Python生成随机UTF-8字符串

    下面是一个示例函数,它可能创建一个随机的格式良好的UTF-8序列,如Unicode 5.0.0的表3-7所定义:#!/usr/bin/env python3.1 # From Table 3–7 of ...

  9. java读取pdf多表格_在Java中使用tabula提取PDF中的表格数据

    问题:如何将pdf文件中指定的表格数据提取出来? 尝试过的工具包有:pdfbox.tabula.最终选用tabula 两种工具的比较 pdfbox 其中,pdfbox能将pdf中的内容直接提取成Str ...

最新文章

  1. DB2 创建数据库、缓冲池和表空间
  2. 学计算机一般要off,必须要学的电脑知识
  3. php gd测试代码,PHP: GD - Manual
  4. JMeter打开jmx文件出错CannotResolveClassException: org.apache.jmeter.protocol.ssh.sampler.SSHCommandSampler
  5. kafka reassign 限速_RabbitMQ 七战 Kafka,差异立现!
  6. jquery 中多条件选择器,相对选择器,层次选择器的区别
  7. springboot整合通用mapper操作数据库
  8. python 使用整数编码字符串的值
  9. CTO 职场解惑指南系列(一)
  10. 高效的java异常处理
  11. 1206、0805、0603、0402、0201、01005、008004,你手工焊接过的最小的封装是哪个
  12. oracle 11g DG 物理搭建 DG切换模式
  13. QT 学习之饼状图实现
  14. 一文读懂ICS工业控制系统架构
  15. C语言入门,编写程序,输出两个整数中的较大值。
  16. 后缀表达式的求值(c语言)
  17. MicroSoft Visual Studio 2013 社区版下载地址
  18. Ansible-大总结(六)
  19. [book]自卑与超越
  20. Ecshop文件结构,二次开发

热门文章

  1. lombok使用详细教程
  2. VC设置断点无效的各种解决方法
  3. pstree命令使用
  4. hexo添加valine评论系统 (yilia主题)
  5. 底部孕线形态有哪些?底部孕线形态特征是什么?
  6. 中小学高级职称计算机考试试题,2012年小学教师高级职称考试备考试题及参考答案(2)...
  7. 学计算机的演员,南开大学计算机系到演员 张桐回顾“不安分”的青春_TOM明星...
  8. java用友eai_用友EAI接口开发的问题
  9. 14、TWS API和IB中的账户和投资组合数据
  10. UE4中部分物理概念的单位