当前位置: 首页 > 后端技术 > Python

RPA-使用Python处理PDF文件

时间:2023-03-26 11:23:37 Python

介绍在RPA流程设计中,会涉及到各种文件处理,包括pdf文件的处理。这时候就需要调用PyPDF2来编写相关代码了。PyPDF2是一个纯Python包,用于使用PyPDF2包在Python中处理预先存在的PDF。从PDF中提取文档信息旋转页面合并PDF拆分PDF添加水印加密PDF1,提取文档信息使用PyPDF2从PDF中提取元数据和一些文本,特别是在对预先存在的PDF文件执行某些类型的自动化时非常有用。目前可以提取以下数据:AuthorCreatorProducerSubjectTitleNumberofpage您可以在您的计算机上找到一个PDF文件并尝试一下。下面是一些使用该PDF的代码,看看如何访问这些属性:fromPyPDF2importPdfFileReaderdefextract_information(pdf_path):withopen(pdf_path,'rb')asf:pdf=PdfFileReader(f)information=pdf.getDocumentInfo()number_of_pages=pdf.getNumPages()txt=f"""关于{pdf_path}的信息:作者:{information.author}创建者:{information.creator}制作者:{information.producer}主题:{information.subject}标题:{information.title}页数:{number_of_pages}"""print(txt)returninformationif__name__=='__main__':path='xxxx.pdf'extract_information(path)首先从PyPDF2包导入PdfFileReader。PdfFileReader是一个具有多种与PDF文件交互的方法的类。在此示例中,我们调用.getDocumentInfo(),它将返回一个DocumentInformation实例,其中包含我们感兴趣的大部分信息。我们还可以在阅读器对象上调用.getNumPages()以让它返回中的页数文件。信息变量有几个实例属性,可用于从文档中获取所需的其余元数据。我们可以打印此信息并返回以备将来使用。虽然PyPDF2具有.extractText()可用于其页面对象以提取文本(此示例中未显示),但效果不是很好。有些PDF返回文本,有些返回空字符串。如果你想从PDF中提取文本,我建议你看看PDFMiner项目。PDFMiner功能更强大,专为从PDF中提取文本而设计。2.旋转页面有时PDF处于横向模式而不是纵向模式,甚至颠倒。当有人将文档扫描为PDF或电子邮件时,很可能会发生这种情况。我们可以打印文档并阅读纸质版本,也可以使用Python的强大功能来旋转相关页面。让我们看看如何使用PyPDF2来旋转文章的一些页面:fromPyPDF2importPdfFileReader,PdfFileWriterdefrotate_pages(pdf_path):pdf_writer=PdfFileWriter()pdf_reader=PdfFileReader(path)#顺时针旋转90度page_1=pdf_reader.getPage(0).rotateClockwise(90)pdf_writer.addPage(page_1)#逆时针旋转90度page_2=pdf_reader.getPage(1).rotateCounterClockwise(90)pdf_writer.addPage(page_2)#正常方向添加一页pdf_writer.addPage(pdf_reader.getPage(2))withopen('rotate_pages.pdf','wb')asfh:pdf_writer.write(fh)if__name__=='__main__':path='newpath.pdf'rotate_pages(path)3.合并PDF在很多情况下,我们希望将两个或多个PDF合并为一个PDF。例如,现在可能有一个标准的封面需要用于多种类型的报告。这时候就可以借助python来帮助完成这类工作。以下是完成PDF合并操作的实现代码:fromPyPDF2importPdfFileReader,PdfFileWriterdefmerge_pdfs(paths,output):pdf_writer=PdfFileWriter()forpathinpaths:pdf_reader=PdfFileReader(path)forpageinrange(pdf_reader.getNumPages)()):#将每个页面添加到writer对象pdf_writer.addPage(pdf_reader.getPage(page))#使用open(output,'wb')写入合并的pdfasout:pdf_writer.write(out)if__name__=='__main__':paths=['document1.pdf','document2.pdf']merge_pdfs(paths,output='merged.pdf')如果有需要合并的pdf列表,可以直接使用merge_pdf函数完全的。此函数将输入路径和输出路径作为参数。首先遍历输入路径,并为每个输入创建一个PDF阅读对象。然后遍历PDF文件中的所有页面,并使用.addpage()将它们写入writer对象。当列表中所有PDF的所有页面都写入完毕后,最后会写入一个新的结果。如果您不想合并每个PDF的所有页面,您可以通过添加要添加的页面列表来稍微增强此脚本。对于更多挑战,还可以使用Python的argparse模块为该函数创建一个命令行界面。4.拆分PDF有时您可能需要将一个PDF拆分为多个PDF,对于包含大量扫描内容的PDF尤其重要。以下是使用PyPDF2将PDF拆分为多个文件的方法:addPage(pdf.getPage(page))output=f'{name_of_split}{page}.pdf'withopen(output,'wb')asoutput_pdf:pdf_writer.write(output_pdf)if__name__=='__main__':路径='xxx.pdf'split(path,'jupyter_page')在这个函数中再次创建PDFreaer对象,并遍历它读取的页面。对于PDF中的每一页,创建一个新的PDF编写器实例并向其添加一个页面。然后,将该页面写入一个唯一命名的文件。脚本完成运行后,原始PDF的每一页都可以拆分为单独的PDF。5、添加水印水印是纸质或电子文档上的图像或图案,有些水印只有在特殊的光照条件下才能看到。加水印的重要性在于它可以保护您的知识产权,例如图像或PDF。我们可以使用Python和PyPDF2向文档添加水印,并且PDF仅包含带水印的图像或文本。以下是给PDF添加水印的方法:fromPyPDF2importPdfFileWriter,PdfFileReaderdefcreate_watermark(input_pdf,output,watermark):watermark_obj=PdfFileReader(watermark)watermark_page=watermark_obj.getPage(0)pdf_reader=PdfFileReader(input_pdf)pdfd_writer=Addwatermarktoallpagesforpageinrange(pdf_reader.getNumPages()):page=pdf_reader.getPage(page)page.mergePage(watermark_page)pdf_writer.addPage(page)withopen(output,'wb')输出:pdf_writer。write(out)if__name__=='__main__':create_watermark(input_pdf='Jupyter_Notebook_An_Introduction.pdf',output='watermarked_notebook.pdf',watermark='watermark.pdf')上面的create_watermark有3个参数:input_pdf:添加水印的PDF文件路径输出:保存水印的PDF水印版本的路径:包含水印图像或文本的PDF在代码中,打开水印PDF并从文档中抓取第一页,因为水印应该位于此处。然后使用input_pdf和通用pdf_writer对象创建一个PDFwriter对象来写出带水印的PDF。接下来就是遍历input_pdf中的页面,然后以上面读取的水印对象watermark_page为参数调用.mergePage(),会在当前页面之上覆盖watermark_page,然后将新合并的页面添加到pdf_writer对象中间。遍历完成后,最后将新加水印的PDF写入磁盘。6.加密的PDFPyPDF2目前只支持给已有的PDF添加用户密码和所有者密码。在PDF版本中,所有者密码允许管理员访问PDF并允许设置文档的权限,而用户密码只允许打开文档。事实上,PyPDF2不允许对文档设置任何权限,即使它允许设置所有者密码。但无论如何,这是它可以加密的方式,也将固有地加密PDF:fromPyPDF2importPdfFileWriter,PdfFileReaderdefadd_encryption(input_pdf,output_pdf,password):pdf_writer=PdfFileWriter()pdf_reader=PdfFileReader(input_pdf)forpageinrange(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page))pdf_writer.encrypt(user_pwd=password,owner_pwd=None,use_128bit=True)withopen(output_pdf,'wb')作为fh:pdf_writer.write(fh)if__name__=='__main__':add_encryption(input_pdf='reportlab-sample.pdf',output_pdf='reportlab-encrypted.pdf',password='twofish')dd_encryption输入输出PDF路径和密码添加到PDF作为参数。由于需要对整个输入PDF进行加密,因此需要遍历其所有页面并添加到writerwriter。最后一步是使用用户密码、所有者密码以及是否应添加128位加密作为参数来调用.encrypt()。默认情况下,启用128位加密。如果设置为False,将应用40位加密。免费下载试用:https://support.i-search.com.cn/