计算机网络/计算机科学与应用/系统/运维/开发

Python 操作 PDF 最全入门(提取文本 / 合并 / 拆分 / 加水印 / 转图片)

PyPDF2:纯 Python 库,读写、合并、拆分、加水印(首选入门)

pdfplumber:精准提取文本、表格(比 PyPDF2 更准确)

pdf2image:PDF 转图片

一、安装依赖

# 核心:合并、拆分、加水印、读文本

pip install PyPDF2

# 增强:精准提取文本、表格

pip install pdfplumber

# 可选:PDF 转图片

pip install pdf2image

二、文件选择器 弹出窗口选择 PDF 文件

import tkinter as tk
from tkinter import filedialog
import os
# 弹出窗口选择 PDF 文件(通用函数)
def select_pdf_file():
    # 隐藏主窗口
    root = tk.Tk()
    root.withdraw()
    
    # 弹出文件选择框,只显示 PDF
    file_path = filedialog.askopenfilename(
        title="请选择要处理的PDF文件",
        filetypes=[("PDF 文件", "*.pdf")]
    )
    
    # 如果没选择文件,退出程序
    if not file_path:
        print("未选择任何文件!")
        exit()
    return file_path

三、上传 PDF 并提取文本(弹窗选文件)

from PyPDF2 import PdfReader
# 1. 弹窗选择 PDF
pdf_path = select_pdf_file()
print(f"已选择文件:{os.path.basename(pdf_path)}")
# 2. 读取文本
reader = PdfReader(pdf_path)
all_text = ""
for page in reader.pages:
all_text += page.extract_text() + "\n"
# 3. 保存文本到同目录
save_path = os.path.splitext(pdf_path)[0] + "_提取文本.txt"
with open(save_path, "w", encoding="utf-8") as f:
f.write(all_text)
print(f"文本提取完成!已保存到:\n{save_path}")

四、 上传 PDF 并精准提取文本 / 表格

import pdfplumber
pdf_path = select_pdf_file()
print(f"已选择文件:{os.path.basename(pdf_path)}")
with pdfplumber.open(pdf_path) as pdf:
all_text = ""
for page in pdf.pages:
text = page.extract_text()
if text:
all_text += text + "\n\n"
# 保存
save_path = os.path.splitext(pdf_path)[0] + "_精准文本.txt"
with open(save_path, "w", encoding="utf-8") as f:
f.write(all_text)
print(f"精准文本提取完成!已保存到:\n{save_path}")

五、 上传多个 PDF → 合并成一个(弹窗多选)

from PyPDF2 import PdfMerger
def select_multiple_pdf():
root = tk.Tk()
root.withdraw()
files = filedialog.askopenfilenames(
title="请选择要合并的多个PDF文件",
filetypes=[("PDF 文件", "*.pdf")]
)
if not files:
print("未选择文件!")
exit()
return files
# 选择多个 PDF
pdf_files = select_multiple_pdf()
print(f"已选择 {len(pdf_files)} 个文件")
# 合并
merger = PdfMerger()
for file in pdf_files:
merger.append(file)
# 保存
save_path = os.path.join(os.path.dirname(pdf_files[0]), "合并结果.pdf")
merger.write(save_path)
merger.close()
print(f"合并完成!已保存到:\n{save_path}")

六、 上传 PDF → 拆分 PDF

from PyPDF2 import PdfReader, PdfWriter
pdf_path = select_pdf_file()
reader = PdfReader(pdf_path)
total_pages = len(reader.pages)
print(f"PDF 总页数:{total_pages}")
start = int(input("请输入开始页码(从1开始):")) - 1
end = int(input("请输入结束页码:"))
# 执行拆分
writer = PdfWriter()
for i in range(start, end):
writer.add_page(reader.pages[i])
save_path = os.path.splitext(pdf_path)[0] + f"_第{start+1}-{end}页.pdf"
with open(save_path, "wb") as f:
writer.write(f)
print(f"拆分完成!已保存到:\n{save_path}")

七、 上传 PDF + 上传水印 PDF → 加水印

from PyPDF2 import PdfReader, PdfWriter
def add_watermark():
print("=== 选择原PDF文件 ===")
input_pdf = select_pdf_file()
print("=== 选择水印PDF文件 ===")
watermark_pdf = select_pdf_file()
reader = PdfReader(input_pdf)
watermark_page = PdfReader(watermark_pdf).pages[0]
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark_page)
writer.add_page(page)
save_path = os.path.splitext(input_pdf)[0] + "_已加水印.pdf"
with open(save_path, "wb") as f:
writer.write(f)
return save_path
# 执行
result = add_watermark()
print(f"水印添加完成!已保存到:\n{result}")


若无人替你披荆斩棘,那就独自前行栉风沐雨。

评论

^