探秘 pdfrw:Python 操作 PDF 的轻量级利器

在 Python 的 PDF 处理工具中,pdfrw是一款轻量级但功能颇为强劲的库。它提供了一系列方法来处理 PDF 文件,如读取、写入、修改和合并等操作。与一些体积较大的 PDF 处理库相比,pdfrw的优势在于其轻量级特性,使得它在处理 PDF 文件时更为灵活和高效。接下来,我们将深入了解pdfrw库的各项功能。

一、安装 pdfrw

在使用pdfrw之前,需要先通过pip进行安装:

bash

pip install pdfrw

二、读取 PDF 信息

1. 读取基本元数据

pdfrw可以轻松获取 PDF 文件的基本元数据,如标题、作者、创建日期等。以下是示例代码:

python

import pdfrw

def get_pdf_metadata(pdf_path):
    pdf = pdfrw.PdfReader(pdf_path)
    metadata = pdf.Info
    for key, value in metadata.items():
        print(f"{key}: {value}")

pdf_path = 'example.pdf'
get_pdf_metadata(pdf_path)

在上述代码中,pdfrw.PdfReader(pdf_path)用于读取指定路径的 PDF 文件,pdf.Info则获取该 PDF 的元数据信息,并通过循环打印出来。

2. 读取页面内容(简单文本提取)

虽然pdfrw不像专门的文本提取库那样功能全面,但它也能进行简单的文本提取。下面是一个简单示例:

python

import pdfrw

def extract_text_from_pdf(pdf_path):
    pdf = pdfrw.PdfReader(pdf_path)
    text = ''
    for page in pdf.pages:
        if '/Annots' in page:
            for annot in page.Annots:
                if annot.get('/Subtype') == '/Text':
                    text += annot.get('/Contents', '')
    return text

pdf_path = 'example.pdf'
extracted_text = extract_text_from_pdf(pdf_path)
print(extracted_text)

此代码通过遍历 PDF 的每一页,检查页面中的注释(Annots),如果注释类型为文本(/Subtype == /Text),则提取其内容。不过要注意,这种方法提取的文本可能不完整或格式与原 PDF 有差异,适用于简单文本提取场景。

三、写入与修改 PDF

1. 添加注释

pdfrw可以在 PDF 页面上添加注释。以下是在第一页添加文本注释的示例:

python

import pdfrw

ANNOT_KEY = '/Annots'
ANNOT_FIELD_KEY = '/T'
ANNOT_TEXT_KEY = '/Contents'
SUBTYPE_KEY = '/Subtype'
WIDGET_SUBTYPE_KEY = '/Widget'

def add_note_to_pdf(pdf_path, output_path, note_text):
    pdf = pdfrw.PdfReader(pdf_path)
    page = pdf.pages[0]
    if not hasattr(page, ANNOT_KEY):
        page[ANNOT_KEY] = pdfrw.PdfArray()

    annot = pdfrw.PdfDict()
    annot[SUBTYPE_KEY] = WIDGET_SUBTYPE_KEY
    annot[ANNOT_FIELD_KEY] = 'My Note'
    annot[ANNOT_TEXT_KEY] = note_text
    annot['/Rect'] = pdfrw.PdfArray([100, 100, 200, 120])
    page.Annots.append(annot)

    pdfrw.PdfWriter().write(output_path, pdf)

pdf_path = 'example.pdf'
output_path = 'annotated_example.pdf'
note_text = '这是一个新添加的注释'
add_note_to_pdf(pdf_path, output_path, note_text)

在这段代码中:

  • 第一读取 PDF 文件并获取第一页。
  • 检查页面是否已有注释,如果没有则创建一个空的注释数组。
  • 创建一个新的注释字典,设置注释类型、字段名、文本内容以及注释在页面上的位置(/Rect)。
  • 将新注释添加到页面的注释数组中,并使用pdfrw.PdfWriter().write()将修改后的 PDF 保存到新文件。

2. 修改现有注释

如果要修改 PDF 中已有的注释内容,示例代码如下:

python

import pdfrw

ANNOT_KEY = '/Annots'
ANNOT_FIELD_KEY = '/T'
ANNOT_TEXT_KEY = '/Contents'

def modify_note_in_pdf(pdf_path, output_path, new_note_text):
    pdf = pdfrw.PdfReader(pdf_path)
    for page in pdf.pages:
        if '/Annots' in page:
            for annot in page.Annots:
                if annot.get('/Subtype') == '/Widget' and annot.get(ANNOT_FIELD_KEY) == 'My Note':
                    annot[ANNOT_TEXT_KEY] = new_note_text

    pdfrw.PdfWriter().write(output_path, pdf)

pdf_path = 'annotated_example.pdf'
output_path ='modified_annotated_example.pdf'
new_note_text = '这是修改后的注释内容'
modify_note_in_pdf(pdf_path, output_path, new_note_text)

该代码遍历 PDF 的每一页及其注释,找到特定字段名(My Note)的注释,并修改其文本内容,最后保存修改后的 PDF。

四、合并 PDF

使用pdfrw合并多个 PDF 文件也很方便。以下是实现代码:

python

import pdfrw

def merge_pdfs(pdf_paths, output_path):
    writer = pdfrw.PdfWriter()
    for pdf_path in pdf_paths:
        pdf = pdfrw.PdfReader(pdf_path)
        for page in pdf.pages:
            writer.addpage(page)
    writer.write(output_path)

pdf_paths = ['pdf1.pdf', 'pdf2.pdf']
output_path ='merged.pdf'
merge_pdfs(pdf_paths, output_path)

此代码通过pdfrw.PdfWriter()创建一个写入器对象,然后遍历每个要合并的 PDF 文件,将其每一页添加到写入器中,最后将合并后的内容写入到输出文件。

pdfrw以其轻量级和灵活性,为 Python 开发者提供了一种便捷的 PDF 处理方式。虽然它在功能的全面性上可能不及一些大型 PDF 处理库,但在处理简单的 PDF 读取、写入、修改和合并任务时,pdfrw表现出色。无论是处理日常办公中的 PDF 文件,还是在开发小型应用程序时涉及 PDF 操作,pdfrw都值得一试。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容