阅读文本大概需要 6 分钟。
现在网上有很多文档是 pdf 格式,虽然这个格式阅读起来很方便,并且里面的内容不会乱掉,但相应的我们就无法修改里面的内容。虽然现在市面上有很多 pdf 转 word 软件,比如 wps,但大多数的软件是要收费的,并且价格不菲。
前些天就有人叫我帮她把 pdf 文档转成 word 的文档。因为 pdf 文档里面的内容有很多,如果全部打印的话,费用还是挺高的。所以她想把里面的内容格式修改下,比如行间距,字间距等等。通过这样的修改,可以把文档的页数减少很多,这样就省下不少的钱。
于是乎我就想到了利用 python 来写个程序,把 pdf 转成 word 文档。秉承着不要重复造轮子的想法,我首先在网上搜索了下。果然已经有人写好了,我们直接拿来用就行。程序一共只有 60 行代码,使用也非常的简单,
程序源代码
importos
fromconfigparserimportConfigParser
fromioimportStringIO
fromioimportopen
fromconcurrent.futuresimportProcessPoolExecutor
frompdfminer.pdfinterpimportPDFResourceManager
frompdfminer.pdfinterpimportprocess_pdf
frompdfminer.converterimportTextConverter
frompdfminer.layoutimportLAParams
fromdocximportDocument
defread_from_pdf(file_path):
withopen(file_path,'rb')asfile:
resource_manager = PDFResourceManager()
return_str = StringIO()
lap_params = LAParams()
device = TextConverter(
resource_manager, return_str, laparams=lap_params)
process_pdf(resource_manager, device, file)
device.close()
content = return_str.getvalue()
return_str.close()
returncontent
defsave_text_to_word(content, file_path):
doc = Document()
forlineincontent.split('\n'):
paragraph = doc.add_paragraph()
paragraph.add_run(remove_control_characters(line))
doc.save(file_path)
defremove_control_characters(content):
mpa = dict.fromkeys(range(32))
returncontent.translate(mpa)
defpdf_to_word(pdf_file_path, word_file_path):
content = read_from_pdf(pdf_file_path)
save_text_to_word(content, word_file_path)
defmain():
config_parser = ConfigParser()
config_parser.read('config.cfg')
config = config_parser['default']
tasks = []
withProcessPoolExecutor(max_workers=int(config['max_worker']))asexecutor:
forfileinos.listdir(config['pdf_folder']):
extension_name = os.path.splitext(file)[1]
ifextension_name !='.pdf':
continue
file_name = os.path.splitext(file)[]
pdf_file = config['pdf_folder'] +'/'+ file
word_file = config['word_folder'] +'/'+ file_name +'.docx'
print('正在处理: ', file)
result = executor.submit(pdf_to_word, pdf_file, word_file)
tasks.append(result)
whileTrue:
exit_flag =True
fortaskintasks:
ifnottask.done():
exit_flag =False
ifexit_flag:
print('完成')
exit()
if__name__ =='__main__':
main()
使用方法
领取专属 10元无门槛券
私享最新 技术干货