pdf,搜索相关路径下pdf文档,把pdf文档移动到指定的路径下,再对该路径下的pdf文档进行转换
缺点:无法转换带有图片的pdf文档,转换后的文档格式问题
安装相应的库
1)pip install pdfminer3k 是pdfminer的Python 3端口
2)安装docx库
pip install python_docx
使用了os.walk对特定路径下的pdf文档进行查找,并对该文档进行移动
import osimport shutilimport importlibimport sysimport redef load_file():walk = os.walk(r'C:\Users\ALFIEL\Desktop\0527')i=1for root, dirs,files in walk:print((root,dirs,files))for name in files:if len(re.findall('(\w)\.pdf',name))>=1:#添加条件对pdf文件进行筛选shutil.move(os.path.join(root,name), "C:\\Users\\SALFIEL\\Desktop\\pdfdocement\\"+str(i)+".pdf")i+=1load_file()
转换完整的代码如下:
#pdf转换器from pdfminer.pdfparser import PDFParser, PDFDocumentfrom pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter,process_pdffrom pdfminer.layout import LAParamsfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.pdfinterp import PDFTextExtractionNotAllowedfrom docx import Documentfrom pdfminer.layout import *document = Document()import warningswarnings.filterwarnings("ignore")from pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom io import StringIOfrom urllib.request import urlopenimport pandas as pdimport osdef readPDF(pdfFile):#读取pdf文件#创建PDf 资源管理器 来管理共享资源rsrcmgr = PDFResourceManager()retstr = StringIO()#数据保存到内存中laparams = LAParams()device = TextConverter(rsrcmgr, retstr, laparams=laparams)process_pdf(rsrcmgr, device, pdfFile)device.close()content = retstr.getvalue()retstr.close()return contentdef save_to_file(file_name, contents):#可以存储为相应的格式的文档,单纯以文字的pdf转换fh = open(file_name, 'w',encoding='utf-8')#若没有encoding='utf-8'则会爆出gbk编码错误。写入txt,csv需要转换格式utf-8fh.write(contents)fh.close()# save_to_file('mobiles.txt', 'your contents str')def main():#当某个目录下面寻找pdf文档文件并把它移动到某个路径下面#进行txt或则csv的转换walk=os.walk(r"C:\Users\ALFIEL\Desktop\pdfdocement")for root, dirs,files in walk:for name in files:if len(re.findall('(\w)\.pdf',name))>=1:#添加条件对pdf文件进行筛选pdfFile = open("{}".format(os.path.join(root,name)),'rb')outputString = readPDF(pdfFile)save_to_file('c.csv',outputString)def save_to_doxc(file_name,path):#以二进制读取打开文件fn = open(file_name,'rb')#用文件对象创建pdf文档分析器parser = PDFParser(fn)#创建一个pdf文档doc = PDFDocument()#连接分析器与文档对象parser.set_document(doc)doc.set_parser(parser)# 提供初始化密码# 如果没有密码 就创建一个空的字符串doc.initialize()# 检测文档是否提供txt转换,不提供就忽略if not doc.is_extractable:raise PDFTextExtractionNotAllowedelse:resource = PDFResourceManager()laparams = LAParams()device = PDFPageAggregator(resource,laparams=laparams)# 创建一个PDF解释器对象interpreter = PDFPageInterpreter(resource,device)num_page, num_image, num_curve, num_figure, num_TextBoxHorizontal = 0, 0, 0, 0, 0for i in doc.get_pages():#循环遍历列表,每次处理一个page的内容num_page += 1 interpreter.process_page(i)layout = device.get_result()print(layout)for x in layout:if isinstance(x,LTImage):num_image += 1if isinstance(x,LTCurve): num_curve += 1if isinstance(x,LTFigure): # figure对象num_figure += 1if isinstance(x, LTTextBoxHorizontal):#判断变量时水平文本框对象num_TextBoxHorizontal += 1# 水平文本框对象增一# 保存文本内容if hasattr(x,"get_text"):#判断x对象是否有get_text方法with open(r'{}'.format(path), 'a',encoding='utf-8') as f: #生成doc文件的文件名及路径results = x.get_text()print(results)f.write(results)f.write('\n')# 获取文本内容print('对象数量:\n','页面数:%s\n'%num_page,'图片数:%s\n'%num_image,'曲线数:%s\n'%num_curve,'水平文本框:%s\n'%num_TextBoxHorizontal)print ('处理完成')def main2():walk=os.walk(r"C:\Users\ALFIEL\Desktop\pdfdocement")for root, dirs,files in walk:for name in files:if len(re.findall('(\w)\.pdf',name))>=1:#添加条件对pdf文件进行筛选pdfFile = os.open(r"{}".format(os.path.join(root,name)),os.O_RDWR)save_to_doxc(pdfFile,path=os.path.join(root,name).replace('.pdf','.doc'))if __name__ == '__main__':main2()
注意:当写入txt,csv文件时,需要吧编码模式encoding为utf-8
doc转pdf或其他
还有通过调用win32接口进行doc的转换
from win32com.client import Dispatch, constantsdef doc2pdf(input1, output):w = Dispatch('Word.Application')try:doc = w.Documents.Open(input1, ReadOnly=1)doc.SaveAs(output, 17)return Trueexcept Exception as e:print(e)return Falsefinally:doc.Close()def main():input1 = r'C:\Users\ALFIEL\Desktop\pdfdocement\1.doc'output = r'C:\Users\ALFIEL\Desktop\pdfdocement\6.pdf'rc = doc2html(input1, output)if rc:print('转换成功')else:print('转换失败')if __name__ == '__main__':main()
其中SaveAs(output,wdformat)
wdfomat参数如下:
wdFormatDocument = 0
wdFormatDocument97 = 0
wdFormatDocumentDefault = 16
wdFormatDOSText = 4
wdFormatDOSTextLineBreaks = 5
wdFormatEncodedText = 7
wdFormatFilteredHTML = 10
wdFormatFlatXML = 19
wdFormatFlatXMLMacroEnabled = 20
wdFormatFlatXMLTemplate = 21
wdFormatFlatXMLTemplateMacroEnabled = 22
wdFormatHTML = 8
wdFormatPDF = 17
wdFormatRTF = 6
wdFormatTemplate = 1
wdFormatTemplate97 = 1
wdFormatText = 2
wdFormatTextLineBreaks = 3
wdFormatUnicodeText = 7
wdFormatWebArchive = 9
wdFormatXML = 11
wdFormatXMLDocument = 12
wdFormatXMLDocumentMacroEnabled = 13
wdFormatXMLTemplate = 14
wdFormatXMLTemplateMacroEnabled = 15
wdFormatXPS = 18照着字面意思应该能对应到相应的文件格式,如果你是office 可能支持不了这么多格式。word文件转html有两种格式可选wdFormatHTML、wdFormatFilteredHTML(对应数字8、10),区别是如果是wdFormatHTML格式的话,word文件里面的公式等ole对象将会存储成wmf格式,而选用wdFormatFilteredHTML的话公式图片将存储为gif格式,而且目测可以看出用wdFormatFilteredHTML生成的HTML明显比wdFormatHTML要干净许多。
参考自/binger819623/article/details/6770932
如果觉得《python pdf 转换成txt csv doc 及doc转换为pdf初级》对你有帮助,请点赞、收藏,并留下你的观点哦!