PDF 格式(跨平台文档)
PDF(Portable Document Format,便携式文档格式)由 Adobe 公司 1993 年发布(现为 ISO 32000 标准),采用 PostScript 语言子集描述页面布局。通过嵌入字体、矢量图形和压缩算法实现跨平台格式一致性,支持数字签名、注释和权限控制,是电子书、学术论文和官方文件的通用分发格式。
格式简介
PDF 是一种用于呈现文档的独立于应用软件、硬件和操作系统的文件格式。PDF 文件可以包含文本、图形、链接、表单字段、音频、视频和业务逻辑等元素,并且能够保持文档的原始格式和布局,无论使用什么设备或软件查看。
PDF 格式最初由 Adobe 开发,2008 年成为开放标准(ISO 32000),现在由 ISO 委员会维护。PDF 文件扩展名通常为 .pdf,MIME 类型为 application/pdf。
技术特点
核心特性
- 跨平台一致性:在任何设备上显示效果相同
- 字体嵌入:可以嵌入字体,确保文档显示一致
- 压缩支持:支持多种压缩算法(Flate、LZW、JPEG 等)
- 矢量图形:支持矢量图形,缩放不失真
- 安全性:支持密码保护、数字签名、权限控制
- 交互性:支持表单、链接、书签等交互元素
PDF 版本
- PDF 1.0-1.3:早期版本,基础功能
- PDF 1.4:支持透明度、JavaScript
- PDF 1.5:支持对象流、交叉引用流
- PDF 1.6:支持 3D 注释、OpenType 字体
- PDF 1.7:成为 ISO 32000-1:2008 标准
- PDF 2.0:ISO 32000-2:2020,增强安全性和可访问性
文件结构
PDF 文件由以下部分组成:
%PDF-1.7 # PDF 版本标识
[对象] # PDF 对象(页面、字体、图像等)
xref # 交叉引用表
trailer # 文件尾
%%EOF # 文件结束标记
主要对象类型
- 页面对象(Page):定义页面内容和属性
- 字体对象(Font):定义使用的字体
- 图像对象(Image):嵌入的图像数据
- 流对象(Stream):压缩的数据流
- 字典对象(Dictionary):键值对结构
- 数组对象(Array):有序对象列表
使用场景
适用场景
- 电子书:电子出版物、电子杂志
- 学术论文:期刊论文、学位论文
- 官方文档:政府文件、法律文档、合同
- 技术文档:产品手册、技术规范
- 表单:可填写的 PDF 表单
- 演示文稿:幻灯片、报告
优缺点
优点:
- 跨平台显示一致
- 文件体积相对较小(压缩后)
- 支持交互元素和多媒体
- 安全性好,支持加密和签名
- 广泛支持,几乎所有设备都能查看
缺点:
- 编辑相对困难(需要专业工具)
- 某些复杂布局可能在不同查看器中显示略有差异
- 文件结构复杂,解析需要专业知识
代码示例
Python 读取 PDF
import PyPDF2
# 读取 PDF 文件
with open('document.pdf', 'rb') as file:
pdf_reader = PyPDF2.PdfFileReader(file)
# 获取页数
num_pages = pdf_reader.numPages
# 读取文本
for page_num in range(num_pages):
page = pdf_reader.getPage(page_num)
text = page.extractText()
print(text)
Python 创建 PDF
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
# 创建 PDF
c = canvas.Canvas("output.pdf", pagesize=letter)
# 添加文本
c.drawString(100, 750, "Hello, PDF!")
# 保存
c.save()
使用 pdfplumber 提取表格
import pdfplumber
with pdfplumber.open('document.pdf') as pdf:
for page in pdf.pages:
# 提取表格
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
相关工具
- Adobe Acrobat:官方 PDF 编辑器
- PDF Reader:各种 PDF 阅读器(Adobe Reader、Foxit Reader 等)
- 在线工具:PDF 合并、分割、转换等在线服务
- 编程库:
- Python:
PyPDF2、pdfplumber、reportlab、fpdf - Java:
Apache PDFBox、iText - JavaScript:
pdf.js、pdf-lib
- Python: