点击下方
卡片
,关注“
小白玩转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)