给纯小白的Python操作 PDF 笔记

一、文件基础

  1. 打开与关闭

    • 推荐用 with open(path, mode, encoding='utf-8') as f:,自动完成 close(),避免泄露文件句柄。
    • 常见模式:'r' 读,'w' 写覆盖,'a' 追加,'rb'/'wb' 二进制。
    • Windows 默认编码为 GBK,Linux/Mac 为 UTF-8;跨平台脚本务必显式指定 encoding。
  2. 文本读写

    • f.read() 一次读全部;f.readline() 逐行;f.readlines() 得列表。
    • 追加写入:with open('test.txt','a',encoding='utf-8') as f: f.write('xxx')
  3. 路径与编码错误

    • 绝对路径:C:/Users/...(正斜杠或双反斜杠)。
    • 相对路径:以脚本所在目录为基准,可用 os.path.join() 拼接。
    • 遇到 UnicodeDecodeError 时,尝试 encoding='utf-8-sig''gbk'

二、PDF 处理(PyPDF2 + pdfplumber 组合拳)

  1. 环境准备

    复制代码
    pip install PyPDF2 pdfplumber pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. 读取文字

python 复制代码
   import pdfplumber
   with pdfplumber.open('demo.pdf') as pdf:
       for page in pdf.pages:
           print(page.extract_text())
  1. 读取表格
python 复制代码
   all_tables = []
   with pdfplumber.open('demo.pdf') as pdf:
       for p in pdf.pages:
           for table in p.extract_tables():
               all_tables.extend([row for row in table if any(row)])
   df = pd.DataFrame(all_tables)
   df.to_excel('pdf_table.xlsx', index=False, header=False)
  1. 合并 PDF(PyPDF2)
python 复制代码
   from PyPDF2 import PdfMerger
   merger = PdfMerger()
   for pdf in ['1.pdf', '2.pdf']:
       merger.append(pdf)
   merger.write('merged.pdf')
   merger.close()
  1. 添加水印(注意层级顺序)
python 复制代码
   from PyPDF2 import PdfFileReader, PdfFileWriter

   base = PdfFileReader('src.pdf')
   watermark = PdfFileReader('water.pdf').getPage(0)
   writer = PdfFileWriter()

   for i in range(base.getNumPages()):
       page = base.getPage(i)
       # 先底层内容,后水印;若水印被文字遮挡,可调整水印透明度或在生成水印 PDF 时放到底层
       page.mergePage(watermark)   # mergePage 会把两页叠加,watermark 在上层
       writer.addPage(page)

   with open('res_watermarked.pdf', 'wb') as f:
       writer.write(f)

课堂踩坑:水印盖字 → 在水印 PDF 里把文字透明度降低或置底后再合并。

  1. Word → PDF(Windows 专用,pypiwin32)
python 复制代码
   import win32com.client as win32
   word = win32.Dispatch('Word.Application')
   doc = word.Documents.Open(r'C:\abs\path\template.docx')
   doc.ExportAsFixedFormat('template.pdf', 17)  # 17=pdf
   doc.Close(); word.Quit()

三、实战小结

  • 文件操作牢记 with+encoding;PDF 处理分清 pdfplumber(读取)与 PyPDF2(编辑)。
  • 合并、加水印前先用小文件调试,避免一次性加载大 PDF 导致内存爆炸。
  • 路径/编码问题优先排查打印 os.getcwd() 与显式 encoding。
相关推荐
小坏讲微服务5 小时前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
Kiri霧5 小时前
Scala 循环控制:掌握 while 和 for 循环
大数据·开发语言·scala
闲人编程5 小时前
Python的抽象基类(ABC):定义接口契约的艺术
开发语言·python·接口·抽象类·基类·abc·codecapsule
qq_172805595 小时前
Go 语言结构型设计模式深度解析
开发语言·设计模式·golang
vx_dmxq2116 小时前
【微信小程序学习交流平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·微信小程序·小程序·idea
无垠的广袤6 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
lkbhua莱克瓦246 小时前
集合进阶8——Stream流
java·开发语言·笔记·github·stream流·学习方法·集合
20岁30年经验的码农6 小时前
Java Elasticsearch 实战指南
java·开发语言·elasticsearch
雾岛听蓝6 小时前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记
CoderYanger6 小时前
优选算法-优先级队列(堆):75.数据流中的第K大元素
java·开发语言·算法·leetcode·职场和发展·1024程序员节