日常工作中,经常遇到:需要把Pdf格式文件转为Word格式。网上有各种软件,但是99%都是收费的,而且费用很高。下面,胖哥用Python代码手把手教你:Pdf批量转Word。
整体实现解析:
整体上分为2步:
第一步读取PDF文件,第二步写入Word文件。
-
第一步:
def read_from_pdf(file_path):
with open(file_path, 'rb') as file:
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()
return content
content变量存储的就是我们从PDF文件中读取出的文字内容。
- 第二步:
def save_text_to_word(content, file_path):
doc = Document()
for line in content.split('\n'):
paragraph = doc.add_paragraph()
paragraph.add_run(remove_control_characters(line))
doc.save(file_path)
content是前面读取出的文字内容,由于是将整个PDF读成一个字符串,所以需要使用split方法将每一行分隔开,然后按行写入word,否则所有的文字会在同一行。同时这段代码使用了一个remove_control_characters函数,这个函数是需要自己实现的,目的是移除控制字符(换行符、制表符、转义符等),因为python-docx是不支持控制字符写入的。
函数实现:
def remove_control_characters(content):
mpa = dict.fromkeys(range(32))
return content.translate(mpa)
控制字符就是ASCII码在32以下的,所以使用str的translate方法,把32以下的字符移除就可以。
有伙伴们,该有疑问了:没看到怎么实现"批量的?
批量实现如下:
def main():
config_parser = ConfigParser()
config_parser.read('config.cfg')
config = config_parser['default']
tasks = []
with ProcessPoolExecutor(max_workers=int(config['max_worker'])) as executor:
for file in os.listdir(config['pdf_folder']):
extension_name = os.path.splitext(file)[1]
if extension_name != '.pdf':
continue
file_name = os.path.splitext(file)[0]
pdf_file = config['pdf_folder'] + file
word_file = config['word_folder'] + file_name + '.doc'
print('正在处理: ', file)
result = executor.submit(pdf_to_word, pdf_file, word_file)
tasks.append(result)
while True:
exit_flag = True
for task in tasks:
if not task.done():
exit_flag = False
if exit_flag:
print('完成')
exit(0)
如需获取完整的代码,请公众号后台回复:PdfToWord。
更多内容,可关注作者的微信公众号:胖哥真不错。