← 返回首页

8 种基本对象类型

Boolean true / false
Integer 42, -17
Real 3.14, -0.001
String (Text) / <48656C6C6F>
Name /Type, /Length
Array [1 2 3]
Dictionary <</Key value>>
Stream stream...endstream

PDF 文件结构

Header %PDF
Body Objects
XRef Table
Trailer startxref
EOF %%EOF
文件头 %PDF-2.0 + 二进制标记
对象 1 0 obj ... endobj
XRef 对象偏移量索引
Trailer /Root 引用

文档结构对象

/Catalog 文档根对象
/Pages 页面树节点
/Page 单页对象
/Contents 内容流
/Resources 资源字典
/Font 字体资源
/XObject 图像/表单

内容流操作符

BT Begin Text(开始文本)
ET End Text(结束文本)
Tf 设置字体
Td 移动文本位置
Tj 显示文本
TJ 显示文本(带间距)
Tm 文本矩阵
q 保存状态
Q 恢复状态

页面框尺寸

/MediaBox 页面物理尺寸
/CropBox 可见区域
/BleedBox 出血区域(印刷)
/TrimBox 裁切后尺寸
/ArtBox 内容区域

默认单位:1/72 英寸(约 0.35mm)
A4 尺寸:[0 0 595 842]

流过滤器

/FlateDecode DEFLATE 压缩(最常用)
/DCTDecode JPEG 图像
/JPXDecode JPEG2000 图像
/CCITTFaxDecode 黑白图像(传真)
/RunLengthDecode 游程编码
/ASCIIHexDecode 十六进制解码

最小 PDF 文件模板

%PDF-1.4
%âãÏÓ

1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj

2 0 obj
<</Type/Pages/Kids[3 0 R]/Count 1>>
endobj

3 0 obj
<</Type/Page/Parent 2 0 R/MediaBox[0 0 612 792]/Contents 4 0 R/Resources<</Font<</F1 5 0 R>>>>>
endobj

4 0 obj
<</Length 44>>
stream
BT/F1 12 Tf 100 700 Td(Hello, World!)Tj ET
endstream
endobj

5 0 obj
<</Type/Font/Subtype/Type1/BaseFont/Helvetica>>
endobj

xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000052 00000 n
0000000101 00000 n
0000000198 00000 n
0000000293 00000 n
trailer
<</Size 6/Root 1 0 R>>
startxref
370
%%EOF

Python 库速查

pypdf 读取/合并/提取
reportlab 创建 PDF
PyMuPDF 高性能处理
pdfplumber 表格提取
pikepdf 底层操作

JavaScript 库速查

pdf.js PDF 渲染(Mozilla)
pdf-lib 创建/修改 PDF
pdfkit 生成 PDF
jspdf 客户端生成

Golang 库速查

unipdf 完整功能(商业)
gofpdf 简单生成
pdfcpu 开源工具包

常用命令行工具

qpdf(无损操作)

# 查看结构
qpdf --show-structure file.pdf

# 线性化(Web 优化)
qpdf --linearize in.pdf out.pdf

# 解密
qpdf --decrypt in.pdf out.pdf

# 合并
qpdf --empty --pages a.pdf 1-z b.pdf 1-z -- out.pdf

pdftk(多功能)

# 拆分
pdftk in.pdf burst

# 合并
pdftk *.pdf cat output out.pdf

# 旋转
pdftk in.pdf cat 1-endright output out.pdf

# 提取页面
pdftk in.pdf cat 1-3 output out.pdf

pdfinfo(信息查看)

# 查看元数据
pdfinfo file.pdf

# 查看结构
pdfinfo -box file.pdf

# 提取文本
pdftotext file.pdf output.txt