按任务挑工具,别找一个万能软件

任务工具命令要点
抽文字poppler pdftotext-layout 保住表格排版
合并 / 拆分 / 解密qpdf--pages 指定页范围
压缩Ghostscript-dPDFSETTINGS=/ebook
扫描件 OCRocrmypdf-l chi_sim+eng
程序化处理PyMuPDF / pdfplumberfitz 逐页取文本块

GUI 侧:SumatraPDF 轻量看文档,PDF-XChange Editor 做标注,Okular 跨平台,Acrobat 只在需要复杂表单和印前检查时才值得开。命令行工具的价值在批量和自动化,装一次就能写进脚本反复用。Windows 用 scoop 装 poppler、qpdf、ghostscript 最省事,ocrmypdf 还要额外装 tesseract 及中文语言包。

scoop install poppler qpdf ghostscript tesseract
choco install poppler qpdf
winget install --id OCR-D.ocrmypdf -e

具体命令

pdftotext -layout -enc UTF-8 in.pdf out.txt
pdfinfo in.pdf
pdfimages -list in.pdf
pdftoppm -f 1 -l 3 -png -r 150 in.pdf page

qpdf --empty --pages a.pdf 1-3 b.pdf 5-9 -- merged.pdf
qpdf --decrypt locked.pdf out.pdf
qpdf --linearize in.pdf optimized.pdf

gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH 
   -sOutputFile=small.pdf in.pdf

ocrmypdf -l chi_sim+eng --rotate-pages --deskew scan.pdf searchable.pdf

qpdf 的 --pages 能混用多个文件和页范围,比先拆后合干净得多,而且它做结构级操作不重编码内容,画质无损;--linearize 把文件重排成支持线性化(边下边看)的形式,给网页里嵌的大 PDF 用。Ghostscript 的 /screen、/ebook、/printer、/prepress 四档从狠到轻,日常选 /ebook。

程序化处理与踩坑

import fitz
doc = fitz.open("in.pdf")
for i, page in enumerate(doc):
    text = page.get_text("text")
    print(i, len(text))
doc.close()
  • 扫描件没文字层:pdftotext 出来是空的,必须先 ocrmypdf;中文要装 tesseract 的 chi_sim 语言包,只装 eng 会把汉字识别成乱码。
  • 中文乱码:老 PDF 用内嵌子集字体且缺 ToUnicode 映射,pdftotext 加 -enc UTF-8 也不一定救得回来,换 pdfplumber 或干脆先转图片再 OCR。
  • 压缩副作用:Ghostscript 会重新编码字体和图片,字体 subset 丢失后文字可能变糊、行距变化,合同类文档别用 /screen 档,先用 /ebook 试并肉眼比对关键页。
  • 表格抽取:pdftotext -layout 遇到合并单元格会错列,改用 pdfplumber 的 extract_table 或 camelot,复杂表格最后仍要人工核。
  • 加密 PDF:先 qpdf --decrypt,否则下游工具全部报权限错误;有密码的用 --password= 传,别把它写进会提交到仓库的脚本。