python 处理PDF文件

本文介绍了如何使用Python库处理PDF文档,包括将PDF逐页转换为图片,实现PDF复制并加密保护,以及为PDF添加自定义水印。这些技术适用于数据处理和信息安全场景。

python PDF 文档转图片

"""
将PDF文档每一页提取为图片
"""
import fitz
import os


def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)
    else:
        return


def get_filename(file_path):
    """获取不带路径和后缀的文件名
    :param file_path: 文件路径
    """
    _, fullname = os.path.split(file_path)
    filename, _ = os.path.splitext(fullname)
    return filename


def pdf_image(pdfPath, imgPath, zoom_x, zoom_y):
    """
    :param pdfPath: pdf文件的路径
    :param imgPath: 图像要保存的文件夹
    :param zoom_x: 横方向的缩放系数
    :param zoom_y: 纵方向的缩放系数
    :return: None
    """
    # 打开PDF文件
    pdf = fitz.open(pdfPath)
    name = get_filename(pdfPath)
    # 逐页读取PDF
    for page_num in range(0, pdf.pageCount):
        page_obj = pdf[page_num]
        # 设置缩放
        trans = fitz.Matrix(zoom_x, zoom_y)
        pm = page_obj.getPixmap(matrix=trans, alpha=False)
        # 每个PDF文件的图片放在一个文件夹
        mkdir(imgPath + name)
        # 转图片
        pm.writePNG(imgPath + name + '/' + str(page_num + 1) + ".png")
    pdf.close()


def get_all_filepath(file_dir=r'pdfs/'):
    """拿到每个文件的文件路径"""
    for items in os.walk(file_dir, topdown=False):
        return [file_dir+file_name for file_name in items[2]]


def get_image():
    """循环得到每个PDF自己的图片"""
    for file_path in get_all_filepath():
        pdf_image(file_path, r"images/", 3, 3)


if __name__ == '__main__':
    get_image()

复制PDF文档并加密

"""
复制PDF文档 PDF文档加密
"""
import PyPDF2

from PyPDF2.pdf import PageObject

reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()
for page_num in range(reader.getNumPages()):
    page_odj = reader.getPage(page_num)  # type: PageObject
    # page_odj.rotateClockwise(0)  # 设置旋转度数
    writer.addPage(page_odj)
    # writer.addBlankPage()  # 添加空白页
writer.encrypt('123456')  # 添加密码(加密)

with open('resources/new_XGBoost.pdf', 'wb') as file:
    writer.write(file)

为PDF文档添加水印

"""
PDF文档添加水印
"""
import PyPDF2
from PyPDF2.pdf import PageObject

# 读取水印页
reader = PyPDF2.PdfFileReader('resources/watermark.pdf')
wm_page = reader.getPage(0)

reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()
for page_num in range(reader.getNumPages()):
    # 将水印页合并到现有的pdf文件的页面上
    page_obj = reader.getPage(page_num)  # type: PageObject
    page_obj.mergePage(wm_page)
    writer.addPage(page_obj)
with open('resources/XGBoost_watermarked.pdf', 'wb') as file:
    writer.write(file)

创建自定义的PDF水印文件

"""
创建自定义的水印PDF文件
"""
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas

pdf_canvas = canvas.Canvas('demo.pdf', pagesize=A4)
width, height = A4
print(width, height)

# 显示当前页
# pdf_canvas.showPage()

# 注册字体文件 - 可以使用你自己的字体文件
pdfmetrics.registerFont(TTFont('Font1', 'fonts/Action.ttf'))
pdfmetrics.registerFont(TTFont('Font2', 'fonts/青呱石头体.ttf'))

# 写字
pdf_canvas.setFont('Font2', 40)
pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 1)
pdf_canvas.drawString(width // 2 - 120, height // 2, '你好,世界!')
# pdf_canvas.showPage()

pdf_canvas.setFont('Font1', 40)
pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)
pdf_canvas.rotate(18)
pdf_canvas.drawString(250, 250, 'hello, world!')

# 保存
pdf_canvas.save()
Python处理PDF文件可以通过多种库实现,这些库提供了从读取、写入、修改到创建PDF文件的功能。以下是几种常用的方法和库: ### 1. 使用 `pypdf` 进行基本PDF处理 `pypdf` 是一个用于处理 PDF 文件的纯 Python 库,它支持读取、修改、合并、拆分、加密和提取 PDF 文件的文本、元数据及页面内容。`pypdf` 是 PyPDF2 的继任者,提供了更现代化的 API 和更高的性能,适合处理简单的 PDF 操作任务 [^2]。例如,可以使用 `pypdf` 来合并多个 PDF 文件或加密单个 PDF 文件。 ### 2. 使用 `Borb` 创建和修改PDF `Borb` 是一个开源的 Python 库,旨在帮助用户处理 PDF 文件。它提供了各种功能和工具,包括创建 PDF 文件、添加页面、插入文本、绘制图形、修改现有 PDF 文件等。`Borb` 库的设计理念是简单、灵活和易于使用,同时又提供了丰富的功能和扩展性,使得用户可以轻松地实现各种 PDF 文件处理任务 [^3]。 ### 3. 使用 `pdfplumber` 提取PDF中的数据 `pdfplumber` 是一个专注于从 PDF 文件中提取信息的库,特别是对于需要从 PDF 中提取表格和文本的应用场景非常有用。例如,可以通过以下代码片段来打开一个 PDF 文件并提取第一页的文本和表格内容 [^5]: ```python import pdfplumber pdf = r'../data/text.pdf' with pdfplumber.open(pdf) as pdf: pages = pdf.pages for page in pages: text = page.extract_text() tables = page.extract_tables() print(text) print(tables) break ``` ### 4. 使用 `PyPDF2` 进行PDF文件操作 尽管 `pypdf` 已经成为 `PyPDF2` 的继任者,但在一些项目中仍然可以看到 `PyPDF2` 的身影。它可以用来合并 PDF 文件,如下面的代码所示 [^4]: ```python import os from PyPDF2 import PdfFileMerger src_path = 'pdfs' pdf_list = [os.path.join(src_path, filename) for filename in os.listdir(src_path) if filename.endswith('.pdf')] pdf_file_merger = PdfFileMerger() for pdf in pdf_list: pdf_file_merger.append(pdf, import_bookmarks=False) pdf_file_merger.write("merged.pdf") ``` ### 5. 文件加密示例 使用 `PyPDF2` 或 `pypdf` 可以对 PDF 文件进行加密,确保文档的安全性。以下是一个使用 `PyPDF2` 加密 PDF 文件的例子 [^4]: ```python from PyPDF2 import PdfReader, PdfWriter reader = PdfReader("test.pdf") writer = PdfWriter() for page in reader.pages: writer.add_page(page) writer.encrypt("secret-password") with open("encrypted.pdf", "wb") as f: writer.write(f) ``` 这些库和方法展示了 Python处理 PDF 文件方面的强大能力,无论是创建、修改还是提取 PDF 内容,都能找到合适的解决方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

azured_xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值