数据原语和 XMP 元数据

数据原语和 XMP 元数据

数据原语和 XMP 元数据

Aspose.PDF FOSS for Python 在 aspose_pdf.engine.data 中定义的一小套原始数据类型之上,构建其更高层的 API —— Document、Page 以及注释和表单类。您很少会直接构造其中的大多数,但它们会不断出现为属性类型和返回值:页面的资源字典以 PdfName 值为键,颜色是 Color 实例,而 Document.xmp_metadata 返回一个 XmpPacket。本指南将介绍对象标识原语、原始值包装器、Color、文本编码枚举以及 XMP 元数据模型。


对象标识和对象注册表

PdfObjectID 通过其 object_number 和 generation_number 来标识 PDF 文件中的间接对象。PdfObjectRegistry 在对象序列化时分配并跟踪这些标识符,而 PdfTrailerable 则是能够生成写入 PDF 尾部的字典的对象的共享契约。

import aspose_pdf
from aspose_pdf.engine.data import PdfObjectRegistry

registry = PdfObjectRegistry()

# register() assigns a PdfObjectID to a serializable object
object_id = registry.register(some_pdf_object)
print(object_id.object_number, object_id.generation_number)

# get() resolves an object back from its PdfObjectID
resolved = registry.get(object_id)

原始值包装器

PdfNumber 和 PdfName 将原始 PDF 值包装为类型化的 Python 对象。PdfNumber 将其数值 value 以本机 Python int 或 float 的形式保存;PdfName 保存一个 name 字符串,并且是低层对象模型中用于字典键的类型——例如页面资源字典上的 Font 和 Resources 键。PdfNull 表示 PDF 的 null 对象。

import aspose_pdf
from aspose_pdf.engine.data.number import PdfNumber
from aspose_pdf.engine.data.types import PdfName

number = PdfNumber(3.14)
raw_value = number.value  # already the native int/float you passed in

resources_key = PdfName("Resources")
font_key = PdfName("Font")

颜色值

Color 表示具有 r、g、b 和 a 浮点属性的 RGBA 颜色。除了两个参数加 alpha 的构造函数外,它还提供了一整套具名颜色工厂——小写形式(aqua()、blue()、azure()、red()、green()、yellow()、black()、white()、gray())以及 PascalCase 别名(Aqua()、Blue()、Azure()、Red()、Green()、Yellow()、Black()、White()、Gray())。

import aspose_pdf
from aspose_pdf.engine.data.types import Color

custom = Color(r=0.2, g=0.4, b=0.8, a=1.0)

# Named factories return ready-made Color instances
highlight = Color.yellow()
border = Color.Black()

文本编码和流过滤器

EncodingType(WIN_ANSI、MAC_ROMAN、MAC_EXPERT、PDF_DOC、UNICODE)用于标识一种文本编码,Encoding 则公开匹配的编码常量(UTF8、UTF16、LATIN1、WIN_ANSI),并提供一个 encode(text, encoding_type) 方法返回已编码的 bytes。FilterType(NONE、FLATE_DECODE、LZW_DECODE、DCT_DECODE、JPX_DECODE、CCITT_FAX_DECODE、JBIG2_DECODE)用于标识应用于压缩 PDF 内容的流过滤器。

import aspose_pdf
from aspose_pdf.engine.data import Encoding, EncodingType, FilterType

encoded = Encoding.encode("Hello, world", EncodingType.WIN_ANSI)

# FilterType values identify how a content or image stream is compressed
current_filter = FilterType.FLATE_DECODE

XMP 元数据

XmpPacket 是文档 XMP 元数据包的内存模型——它是由 Document.xmp_metadata 返回的类型。它持有一个有序的 fields 集合(每个都是 XmpField、XmpArray 或 XmpProperty),并通过 XmpNamespaceProvider 解析命名空间前缀。类型化的 getter 和 setter(如 get_value 风格的访问器,包括 get_bool、get_int、get_real、get_date、get_localized_text、get_array,以及它们的 set_* 对应项)可按命名空间前缀或 URI 以及属性名读取和写入单个属性。

import aspose_pdf

doc = aspose_pdf.Document()
doc.load_from("input.pdf")

xmp = doc.xmp_metadata  # XmpPacket

title = xmp.get_localized_text("dc", "title", lang="x-default")
xmp.set_value("dc", "creator", "Jane Doe")

serialized = xmp.serialize()

XmpStruct 对结构化的(rdf:parseType="Resource")值进行建模,拥有自己的 get(name) 查找表,XmpArray 对有序数组进行建模,具备 add(item) 和 remove(item),而 XmpProperty 是携带自身 add_qualifier/remove_qualifier 限定符的属性。四者均共享相同的 XmpField 构件来表示单个值。


技巧与最佳实践

  • 读取 Document.xmp_metadata 以获取文档的 XmpPacket,而不是从头构建——它已经从加载的文件中填充完毕。
  • 直接读取 PdfNumber.value — 它已经包含了你在构造函数中传入的本机 Python int 或 float;没有 to_double() 或 to_int() 转换方法。
  • 在常用颜色的情况下,优先使用具名的 Color 工厂(Color.red()、Color.Black() 等)而不是手工编写的 r/g/b/a 元组 — 它们在调用处更易读。
  • 将你传递给 EncodingType 的 Encoding.encode() 与目标(字体、流或查看器)实际期望的编码匹配;PDF 文本编码不匹配是输出乱码的常见原因。
  • 将 PdfObjectRegistry 和 PdfObjectID 视为低层、面向引擎的类型 — 大多数应用代码通过 Document 和 Page 读取文档内容,而不是直接注册对象。

常见问题

问题原因修复
PdfNumber 比较行为异常比较包装器而不是其数值在比较或进行算术运算之前读取 .value
XMP 属性查找返回 None传递了错误的 prefix 或 uri 给 get_value-style 访问器在读取之前,请通过 XmpNamespaceProvider.get_uri() / get_prefix() 确认命名空间前缀
在 Encoding.encode() 之后,编码文本显示为乱码EncodingType 与目标的期望不匹配使用与目标字体或查看器匹配的 EncodingType 值(WIN_ANSI, MAC_ROMAN, MAC_EXPERT, PDF_DOC, UNICODE)
自定义的 PdfObjectRegistry 对象随后无法解析get() 在使用从未在该注册表实例上被 register() 的 PdfObjectID 时被调用在解析之前,请在相同的 PdfObjectRegistry 实例上注册每个对象

FAQ

我需要自行构造 PdfObjectID 或 PdfObjectRegistry 吗?

很少。它们支持引擎的序列化过程;除非在处理低层对象模型,否则大多数应用代码从不直接实例化它们。

在 XmpField、XmpArray、XmpStruct 和 XmpProperty 之间有什么区别?

XmpField 是单个标量值。XmpArray 是有序的值列表,XmpStruct 是结构化的(rdf:parseType="Resource")字段分组,而 XmpProperty 是一个同时携带自身限定符的值。

如何获取文档的 XMP 元数据?

读取已加载的 Document 上的 xmp_metadata 属性——它返回一个可以直接查询和更新的 XmpPacket。

小写的和 PascalCase Color 工厂产生的颜色不同吗?

不——Color.red() 和 Color.Red() 是返回相同颜色的别名;提供两种拼写仅为方便。


API Reference 摘要

类 / 方法描述
PdfObjectID通过对象号和代号识别间接 PDF 对象
PdfObjectRegistry.register为正在序列化的对象分配一个 PdfObjectID
PdfObjectRegistry.get从先前注册的 PdfObjectID 中解析对象
PdfTrailerable.get_dictionary生成写入 PDF trailer 的字典
PdfNumber.value已包装的数值,已经是原生 Python int 或 float
PdfName包装 PDF 名称值,用作低层对象模型中的字典键
PdfNull表示 PDF null 对象
ColorRGBA 颜色值,带有命名工厂(red、blue、Black,等等)
Encoding.encode使用 EncodingType 将文本编码为 bytes
EncodingType文本编码标识符: WIN_ANSI, MAC_ROMAN, MAC_EXPERT, PDF_DOC, UNICODE
FilterType内容流和图像流使用的流压缩过滤器标识符
XmpPacket内存中的 XMP 元数据包,由 Document.xmp_metadata 返回
XmpField单个 XMP 属性值
XmpArray有序的 XMP 数组值
XmpStruct结构化的(rdf:parseType="Resource")XMP 值
XmpProperty带有自身限定符的 XMP 属性
XmpNamespaceProvider解析 XMP 命名空间前缀与 URI 之间的对应关系

另请参阅

 中文