给纯小白的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。
相关推荐
人工干智能3 小时前
科普:Python 中,字典的“动态创建键”特性
开发语言·python
初听于你4 小时前
缓存技术揭秘
java·运维·服务器·开发语言·spring·缓存
长路归期无望6 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
开心-开心急了6 小时前
主窗口(QMainWindow)如何放入文本编辑器(QPlainTextEdit)等继承自QWidget的对象--(重构版)
python·ui·pyqt
是大强6 小时前
stm32摇杆adc数据分析
开发语言
蓝莓味的口香糖7 小时前
【JS】什么是单例模式
开发语言·javascript·单例模式
moshumu17 小时前
局域网访问Win11下的WSL中的jupyter notebook
ide·python·深度学习·神经网络·机器学习·jupyter
linux kernel7 小时前
第二十三讲:特殊类和类型转换
开发语言·c++
笨蛋少年派7 小时前
JAVA基础语法
java·开发语言
渡我白衣8 小时前
深入剖析:boost::intrusive_ptr 与 std::shared_ptr 的性能边界和实现哲学
开发语言·c++·spring