点击下方卡片,关注“小白玩转Python”公众号
首先,我们需要揭开的秘密是 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
特别说明:在学习本模块的 API 时,需要注意一个问题。在 3.0.0 版本中,PdfFileReader、PdfFileWriter 和 PdfFileMerger 类将被移除。建议使用 PdfReader、PdfWriter 和 PdfMerger 代替。我已经安装了 PyPDF2(版本 3.0.1),只有以下代码才能正确运行。大家需要注意版本兼容性问题。import PyPDF2
with open('example.pdf', 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
for page_num in range(num_pages):
page = reader.pages[page_num]
text = page.extract_text()
print(text)
接下来是我们的第二招:PDF 合并和拆分。想象一下,你手中有很多 PDF 文件,你可以使用 Python 轻松地将它们合并成一个整洁的 PDF,或者将一个大文件拆分成多个较小的文件。让我们试试这段有趣的代码:from PyPDF2 import PdfMerger, PdfReader, PdfWriter
merger = PdfMerger()
merger.append('example.pdf')
merger.append('file2.pdf')
merger.write('merged.pdf')
merger.close()
with open('merged.pdf', 'rb') as file:
reader = PdfReader(file)
num_pages = len(reader.pages)
for start in range(0, num_pages, 10):
end = min(start + 9, num_pages - 1)
writer = PdfWriter()
for page_num in range(start, end + 1):
writer.add_page(reader.pages[page_num])
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 表单是一项非常繁琐的任务,但别担心,Python 的魔法助手在这里!我们可以使用像 PyPDF2、pdfw 和 FPDF 这样有趣的库来自动填写表单字段、读取填写的数据或生成全新的 PDF 表单。去试试吧!from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
def fill_form(input_file, output_file, data):
c = canvas.Canvas(output_file)
c.setFont("Helvetica", 12)
reader = PdfReader(input_file)
for page_num, page in enumerate(reader.pages, start=1):
page_width = float(page.mediabox.width)
page_height = float(page.mediabox.width)
c.setPageSize((page_width, page_height))
c.showPage()
if '/Annots' in page:
for annot in page['/Annots']:
if '/T' in annot and '/V' in annot and annot['/Type'] == '/Annot':
field_name = annot['/T'][1:-1]
if field_name in data:
field_value = data[field_name]
c.drawString(annot['/Rect'][0], annot['/Rect'][1], field_value)
c.save()
def read_form_data(input_file):
data = {}
reader = PdfReader(input_file)
for page in reader.pages:
if '/Annots' in page:
for annot in page['/Annots']:
if '/T' in annot and '/V' in annot and annot['/Type'] == '/Annot':
field_name = annot['/T'][1:-1]
field_value = annot['/V'][1:-1] if isinstance(annot['/V'], str) else ''
data[field_name] = field_value
return data
def create_form(output_file, data):
c = canvas.Canvas(output_file)
c.setFont("Helvetica", 12)
y = 800
for field, value in data.items():
c.drawString(50, y, f"{field}: {value}")
y -= 20
c.save()
fill_form('form_template.pdf', 'filled_form.pdf', {'name': 'joe', 'age': '18'})
form_data = read_form_data('filled_form.pdf')
print(form_data)
create_form('my_form.pdf', {'name': 'joe', 'age': '18'})
print("Magic completed! Now you can easily handle PDF forms!")
下一个魔法是 PDF 文档转换。有时 PDF 的格式可能不太方便,你可能想将 PDF 转换为其他格式,如图像、HTML 或纯文本。让我们一起探索转换的魔法吧!在将 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 依赖时。要解决这个问题,请根据你的操作系统按照以下步骤操作:- https://github.com/oschwartz10612/poppler-windows/releases/
- 在“Assets”部分下载适合你的操作系统的 poppler-x.x.x_x 版本。
- 解压缩下载的文件,并将它的路径添加到系统环境变量中。
通过 Homebrew 安装 Poppler。运行以下命令:sudo apt-get install poppler-utils
安装完成后,请重新启动你的 Python 环境,然后再次尝试运行 pdf_to_image 函数。这样,你将能够成功地将 PDF 转换为图像。如果你想将 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 = ""
for page in reader.pages:
text += page.extract_text()
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 格式,并将结果保存到输出文件中。要将 PDF 转换为纯文本格式,你可以使用 pdfminer 库。它是一个从 PDF 文档中提取文本的强大工具。以下是将 PDF 转换为纯文本的示例代码:pdfminer.six 库:这是 pdfminer 库的新版本,专门为 Python 3 编写。它是 PDF 解析的现代实现,并持续进行维护和更新。pdfminer.six 库兼容 Python 2 和 Python 3,因此它可以在 Python 的更新版本中使用,同时也支持一些较旧的版本。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 文件转换为纯文本格式,并将结果保存到输出文件中。要将 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 Document
from PyPDF2 import PdfReader
def pdf_to_word(input_file, output_file):
with open(input_file, 'rb') as file:
reader = PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text()
doc = Document()
doc.add_paragraph(text)
doc.save(output_file)
pdf_to_word('input.pdf', 'output.docx')
你可以调用 pdf_to_word 函数将输入的 PDF 文件转换为 Word 文档,并将结果保存到输出文件中。请确保在运行上述示例代码之前已安装相应的库和依赖项。你可以使用 pip 命令安装任何缺失的库。接下来是 PDF 水印和数字签名的魔法!想象一下,为 PDF 文件添加水印或数字签名可以增强版权保护和安全性:from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
import io
def add_watermark(input_file, output_file, watermark_text):
reader = PdfReader(input_file)
writer = PdfWriter()
watermark_buffer = io.BytesIO()
c = canvas.Canvas(watermark_buffer)
c.setFont("Helvetica", 48)
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)
for i, page in enumerate(reader.pages, start=1):
watermark_page = watermark_pdf.pages[0]
page.merge_page(watermark_page)
writer.add_page(page)
with open(output_file, 'wb') as file:
writer.write(file)
def add_signature(input_file, output_file, signature_image):
reader = PdfReader(input_file)
writer = PdfWriter()
for i, page in enumerate(reader.pages, start=1):
page.merge_page(signature_image)
writer.add_page(page)
with open(output_file, 'wb') as file:
writer.write(file)
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 报告生成,想象一下使用 Python 的力量生成各种漂亮的 PDF 报告,包括图表、表格和文本。import matplotlib.pyplot as plt
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Table, Image
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Spacer
def create_report(output_file, data):
doc = SimpleDocTemplate(output_file, pagesize=A4)
styles = getSampleStyleSheet()
elements = []
title = Paragraph("Sales report", styles["Title"])
elements.append(title)
elements.append(Spacer(1, 20))
table_data = data
table = Table(table_data)
elements.append(table)
elements.append(Spacer(1, 20))
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()
image = Image("sales_plot.png", width=400, height=300)
elements.append(image)
doc.build(elements)
report_data = [
["date", "Sales revenue"],
["1/1", 100],
["1/2", 200],
["1/3", 150],
["1/4", 300],
]
create_report('sales_report.pdf', report_data)
print("Table generation completed! Now you can view the generated report file.")
最后一块魔法是 OCR(光学字符识别)。想象一下,你有一些扫描的 PDF 文档,需要将文本转换为可搜索和可编辑的文本。好消息是,Python 可以帮助你实现这一点!让我们一起体验这个神奇的咒语吧!import pdf2image
import pytesseract
def pdf_to_image(input_file):
images = pdf2image.convert_from_path(input_file)
return images
def image_to_text(image):
text = pytesseract.image_to_string(image)
return text
def save_text_to_file(text, output_file):
with open(output_file, 'w', encoding='utf-8') as file:
file.write(text)
def extract_text_from_pdf(input_file, output_file):
images = pdf_to_image(input_file)
extracted_text = ""
for image in images:
text = image_to_text(image)
extracted_text += text + "\n"
save_text_to_file(extracted_text, output_file)
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!")
🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!回复“Python视觉实战项目”,解锁31个超有趣的视觉项目大礼包!🎁