专栏名称: 小白玩转Python
分享一些Python相关的资料
目录
相关文章推荐
丁香生活研究所  ·  告别备孕、怀孕焦虑,孕期少跑医院,试试这个办法 ·  3 天前  
丁香医生  ·  尿酸高怎么做降得快? ·  6 天前  
丁香医生  ·  便秘了用哪种通便药最好? ·  1 周前  
51好读  ›  专栏  ›  小白玩转Python

Python 办公 | PDF 文件处理指南

小白玩转Python  · 公众号  ·  · 2024-09-20 20:00

正文

点击下方卡片,关注“小白玩转Python”公众号



PDF 解析和文本提取
首先,我们需要揭开的秘密是 PDF 解析和文本提取。你是否曾经想过如何从 PDF 中提取有用信息?别担心,Python 可以帮助你。我们可以使用像 PyPDF2、FPDF 和 reportlab 这样的神奇库来解析 PDF 文件,然后从中提取文本信息。
以下是 PyPDF2、FPDF 和 reportlab 库的介绍:
  • PyPDF2 库:PyPDF2 是一个用于处理 PDF 文件的 Python 库。它提供了包括合并、拆分、旋转、提取文本、提取页面、添加水印等在内的多种功能。你可以使用 PyPDF2 库来读取 PDF 文件的内容,并提取文本和图像;你还可以用它来创建新的 PDF 文件或修改现有的 PDF 文件。它是一个功能丰富且易于使用的库,适合各种 PDF 操作需求。
  • FPDF:FPDF 是一个用于创建 PDF 文件的 Python 库。它允许你使用 Python 代码生成包含文本、图像、表格图形等元素的标准 PDF 文档。FPDF 简单易用;适合基本的 PDF 生成需求。你可以使用 FDPF 来创建报告文档、证书、发票等。
  • reportlab:reportlab 是一个强大且灵活的 Python 库,用于创建复杂的 PDF 文档。它提供了丰富的功能来处理文本、图像、表格、图形、字体等,并支持高级布局和样式。reportlab 是一个广泛使用的库,适合生成专业的 PDF 报告、书籍、数据可视化等。
首先安装模块:
pip install PyPDF2 FPDF reportlab
安装完成后,你就可以愉快地玩转 PDF 文件了。
特别说明:在学习本模块的 API 时,需要注意一个问题。在 3.0.0 版本中,PdfFileReader、PdfFileWriter 和 PdfFileMerger 类将被移除。建议使用 PdfReader、PdfWriter 和 PdfMerger 代替。
我已经安装了 PyPDF2(版本 3.0.1),只有以下代码才能正确运行。大家需要注意版本兼容性问题。
import PyPDF2
# Open PDF filewith open('example.pdf', 'rb') as file: # Create a PDF reader object reader = PyPDF2.PdfReader(file) # Get the number of pages in a PDF file. num_pages = len(reader.pages) # Extract text content page by page and print. for page_num in range(num_pages): page = reader.pages[page_num] text = page.extract_text() print(text)
合并和拆分 PDF
接下来是我们的第二招:PDF 合并和拆分。想象一下,你手中有很多 PDF 文件,你可以使用 Python 轻松地将它们合并成一个整洁的 PDF,或者将一个大文件拆分成多个较小的文件。让我们试试这段有趣的代码:
from PyPDF2 import PdfMerger, PdfReader, PdfWriter
# Create a PDF mergermerger = PdfMerger()
# Merge multiple PDF filesmerger.append('example.pdf')merger.append('file2.pdf')
# Save the merged file.merger.write('merged.pdf')merger.close()
# Split a PDF filewith open('merged.pdf', 'rb') as file: reader = PdfReader(file) num_pages = len(reader.pages) # Split every 10 pages into one file. for start in range(0, num_pages, 10): end = min(start + 9, num_pages - 1) writer = PdfWriter() # Add specified range of pages to a new file. for page_num in range(start, end + 1): writer.add_page(reader.pages[page_num]) # Save the split files. with open(f'part_{start+1}-{end+1}.pdf', 'wb') as output_file: writer.write(output_file)
print("Ta-da! The magic of merging and splitting is complete.!")
PDF 表单处理
第三项技能是 PDF 表单处理。我们都知道,填写大量 PDF 表单是一项非常繁琐的任务,但别担心,Python 的魔法助手在这里!我们可以使用像 PyPDF2、pdfw 和 FPDF 这样有趣的库来自动填写表单字段、读取填写的数据或生成全新的 PDF 表单。去试试吧!
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
# Automatically fill in form fieldsdef fill_form(input_file, output_file, data): c = canvas.Canvas(output_file) c.setFont("Helvetica", 12) # Read input file, process page by page. reader = PdfReader(input_file) for page_num, page in enumerate(reader.pages, start=1): # Obtain the size of the page and create a canvas of corresponding size. page_width = float(page.mediabox.width) page_height = float(page.mediabox.width) c.setPageSize((page_width, page_height)) # Draw page content c.showPage() # Check if the page has form fields. if '/Annots' in page: # Traverse all form fields for annot in page['/Annots']: # Check the field type as text area. if '/T' in annot and '/V' in annot and annot['/Type'] == '/Annot': field_name = annot['/T'][1:-1] # Get field name # Replace the field value with the incoming data. if field_name in data: field_value = data[field_name] c.drawString(annot['/Rect'][0], annot['/Rect'][1], field_value) # Save the PDF with filled data. c.save()
# Read the filled data.def read_form_data(input_file): data = {} reader = PdfReader(input_file) # Traverse all pages. for page in reader.pages: # Check if there are form fields. if '/Annots' in page: # Traverse all form fields for annot in page['/Annots']: # Check the field type as text area. if '/T' in annot and '/V' in annot and annot['/Type'] == '/Annot': field_name = annot['/T'][1:-1] # Get field name field_value = annot['/V'][1:-1] if isinstance(annot['/V'], str) else '' data[field_name] = field_value return data
# Create a new PDF formdef create_form(output_file, data): c = canvas.Canvas(output_file) c.setFont("Helvetica", 12) # Add data line by line to the form. y = 800 for field, value in data.items(): c.drawString(50, y, f"{field}: {value}") y -= 20 # Save form c.save()
# Fill in the form fields and save.fill_form('form_template.pdf', 'filled_form.pdf', {'name': 'joe', 'age': '18'})
# Read the filled data and print.form_data = read_form_data('filled_form.pdf')print(form_data)
# Create a new PDF formcreate_form('my_form.pdf', {'name': 'joe', 'age': '18'})
print("Magic completed! Now you can easily handle PDF forms!")
PDF 文档转换
下一个魔法是 PDF 文档转换。有时 PDF 的格式可能不太方便,你可能想将 PDF 转换为其他格式,如图像、HTML 或纯文本。让我们一起探索转换的魔法吧!在将 PDF 文档转换为另一种格式时,你可以使用不同的库和工具来实现。以下是每种转换类型的理论解释以及相应的示例代码:
1. 将 PDF 转换为图像
要将 PDF 转换为图像,你可以使用 pdf2image 库。这个库可以将 PDF 页面转换为图像格式(如 JPEG、PNG 等)。以下是将 PDF 转换为图像的示例代码:
from pdf2image import convert_from_path
def pdf_to_image(input_file, output_file): images = convert_from_path(input_file) for i, image in enumerate(images): image.save(f'{output_file}_{i}.jpg', 'JPEG')
pdf_to_image('input.pdf', 'output_image')
你可以调用 pdf_to_image 函数将输入的 PDF 文件转换为图像,并以 JPEG 格式图像文件保存结果。
注意:如果你遇到 pdf2image.exceptions.PDFInfoNotInstalledError 错误消息。这个错误通常发生在缺少 poppler-utils 依赖时。要解决这个问题,请根据你的操作系统按照以下步骤操作:
Windows:
  1. 访问以下网站:
    https://github.com/oschwartz10612/poppler-windows/releases/
  2. 在“Assets”部分下载适合你的操作系统的 poppler-x.x.x_x 版本。
  3. 解压缩下载的文件,并将它的路径添加到系统环境变量中。
macOS:
通过 Homebrew 安装 Poppler。运行以下命令:
brew install poppler
Ubuntu/Debian:
安装 Poppler。运行以下命令:
sudo apt-get install poppler-utils
安装完成后,请重新启动你的 Python 环境,然后再次尝试运行 pdf_to_image 函数。这样,你将能够成功地将 PDF 转换为图像。
2. 将 PDF 转换为 HTML
如果你想将 PDF 文件转换为 HTML 格式,你可以使用支持 PDF 解析的库,如 PyPDF2。以下是将 PDF 转换为 HTML 的示例代码:
from PyPDF2 import PdfReader
def pdf_to_html(input_file, output_file): with open(input_file, 'rb') as file: reader = PdfReader(file) text = "" # Extract text content page by page for page in reader.pages: text += page.extract_text() # Save as HTML file with open(output_file, 'w') as html_file: html_file.write(f"{text}")
pdf_to_html('input.pdf', 'output.html')
你可以调用 pdf_to_html 函数将输入的 PDF 文件转换为 HTML 格式,并将结果保存到输出文件中。
3. 将 PDF 转换为纯文本
要将 PDF 转换为纯文本格式,你可以使用 pdfminer 库。它是一个从 PDF 文档中提取文本的强大工具。以下是将 PDF 转换为纯文本的示例代码:
pdfminer.six 库:这是 pdfminer 库的新版本,专门为 Python 3 编写。它是 PDF 解析的现代实现,并持续进行维护和更新。pdfminer.six 库兼容 Python 2 和 Python 3,因此它可以在 Python 的更新版本中使用,同时也支持一些较旧的版本。
安装依赖项:使用 pdfminer.six 库
pip install pdfminer.six
示例代码:
from pdfminer.high_level import extract_text_to_fp
def pdf_to_text(input_file, output_file): with open(output_file, 'w') as text_file: with open(input_file, 'rb') as file: extract_text_to_fp(file, text_file)
pdf_to_text('input.pdf', 'output.txt')
你可以调用 pdf_to_text 函数将输入的 PDF 文件转换为纯文本格式,并将结果保存到输出文件中。
4. 将 PDF 转换为 Word 文档
要将 PDF 转换为 Word 文档,你可以使用第三方库 python-docx,它可以用来创建和编辑 Word 文档。以下是 python-docx 库的介绍:
  • python-docx 库:python-docx 是一个用于创建和修改 Microsoft Word 文档的 Python 库。它提供了一个简单而强大的 API,允许你通过代码创建、修改和操作 Word 文档。使用 python-docx,你可以添加段落、字体样式、表格、图像等内容。你还可以修改现有文档的样式和内容。它支持 Word 2007 及更高版本的 docx 文件格式。
安装依赖项:
pip install python-docx PyPDF2
以下是将 PDF 转换为 Word 文档的示例代码:
from docx import Documentfrom PyPDF2 import PdfReader
def pdf_to_word(input_file, output_file): with open(input_file, 'rb') as file: reader = PdfReader(file) text = "" # Extract text content page by page for page in reader.pages: text += page.extract_text() # Create Word document doc = Document() doc.add_paragraph(text) # Save as Word document doc.save(output_file)
pdf_to_word('input.pdf', 'output.docx')
你可以调用 pdf_to_word 函数将输入的 PDF 文件转换为 Word 文档,并将结果保存到输出文件中。请确保在运行上述示例代码之前已安装相应的库和依赖项。你可以使用 pip 命令安装任何缺失的库。
PDF 水印和签名
接下来是 PDF 水印和数字签名的魔法!想象一下,为 PDF 文件添加水印或数字签名可以增强版权保护和安全性:
from PyPDF2 import PdfReader, PdfWriterfrom reportlab.pdfgen import canvasimport io
# Add watermark to PDFdef add_watermark(input_file, output_file, watermark_text): reader = PdfReader(input_file) writer = PdfWriter()
watermark_buffer = io.BytesIO()
# Create a PDF with watermark. c = canvas.Canvas(watermark_buffer) c.setFont("Helvetica", 48) # Pay attention to the choice of font. c.rotate(45) c.translate(-500, -500) c.setFillAlpha(0.3) c.drawString(400, 400, watermark_text) c.save()
watermark_buffer.seek(0) watermark_pdf = PdfReader(watermark_buffer)
# Traverse each page. for i, page in enumerate(reader.pages, start=1): watermark_page = watermark_pdf.pages[0]
# Add watermark to the page page.merge_page(watermark_page) writer.add_page(page)
# Save the file with watermark. with open(output_file, 'wb') as file: writer.write(file)
# Add digital signature to PDFdef add_signature(input_file, output_file, signature_image): reader = PdfReader(input_file) writer = PdfWriter()
# Traverse each page. for i, page in enumerate(reader.pages, start=1): # Add a signature image to the bottom right corner of the page. page.merge_page(signature_image) writer.add_page(page)
# Save the document with a signature. with open(output_file, 'wb') as file: writer.write(file)
# Use the functions add_watermark() and add_signature() to add watermark and signature.watermark_text = "Confidential document, do not disclose."signature_image = PdfReader("signature.pdf").pages[0]
add_watermark('part_21-30.pdf', 'document_with_watermark.pdf', watermark_text)add_signature('document_with_watermark.pdf', 'document_with_watermark_and_signature.pdf', signature_image)
print("Watermark and signature magic completed! You can now make your PDF files more secure and professional!")
PDF 报告生成
现在,我们准备探索最后一块魔法!PDF 报告生成,想象一下使用 Python 的力量生成各种漂亮的 PDF 报告,包括图表、表格和文本。
依赖项安装:
pip install pytesseract
import matplotlib.pyplot as pltfrom reportlab.lib.pagesizes import A4from reportlab.platypus import SimpleDocTemplate, Table, Imagefrom reportlab.lib.styles import getSampleStyleSheetfrom reportlab.platypus import Paragraph, Spacer
# Create report contentdef create_report(output_file, data): # Create PDF document object doc = SimpleDocTemplate(output_file, pagesize=A4)
# Load stylesheet styles = getSampleStyleSheet()
# Create report content elements elements = []
# Add title title = Paragraph("Sales report", styles["Title"]) elements.append(title) elements.append(Spacer(1, 20))
# Add table table_data = data table = Table(table_data) elements.append(table) elements.append(Spacer(1, 20))
# Generate charts and save as PNG images plt.plot(data[1][1:], marker='o') plt.xlabel("date") plt.ylabel("Sales revenue") plt.title("Sales Trend Chart") plt.savefig("sales_plot.png") plt.close()
# Add charts to the report content. image = Image("sales_plot.png", width=400, height=300) elements.append(image)
# Generate report doc.build(elements)
# Create report datareport_data = [ ["date", "Sales revenue"], ["1/1", 100], ["1/2", 200], ["1/3", 150], ["1/4", 300],]
# Generate reportcreate_report('sales_report.pdf', report_data)
print("Table generation completed! Now you can view the generated report file.")
OCR(光学字符识别)
最后一块魔法是 OCR(光学字符识别)。想象一下,你有一些扫描的 PDF 文档,需要将文本转换为可搜索和可编辑的文本。好消息是,Python 可以帮助你实现这一点!让我们一起体验这个神奇的咒语吧!
import pdf2imageimport pytesseract
# Convert PDF to imagedef pdf_to_image(input_file): images = pdf2image.convert_from_path(input_file) return images
# Use OCR to convert images into text.def image_to_text(image): text = pytesseract.image_to_string(image) return text
# Save the text to a filedef save_text_to_file(text, output_file): with open(output_file, 'w', encoding='utf-8') as file: file.write(text)
# Extract text from PDF.def extract_text_from_pdf(input_file, output_file): # Convert PDF to image images = pdf_to_image(input_file) extracted_text = "" # Extract text from each image. for image in images: text = image_to_text(image) extracted_text += text + "\n" # Save the extracted text to a file. save_text_to_file(extracted_text, output_file)
# Extract text from scanned PDF.extract_text_from_pdf('scanned_document.pdf', 'extracted_text.txt')
print("OCR (Optical Character Recognition) magic completed! Now you can convert scanned PDF documents into editable text!")

·  END  ·

🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!
回复Python视觉实战项目,解锁31个超有趣的视觉项目大礼包!🎁

本文仅供学习交流使用,如有侵权请联系作者删除