Bỏ qua để đến nội dung
getnextpdf.com

Một tệp PDF biết gì về chính nó: metadata và gói XMP

Spec: ISO 16684-1:2019Spec: ISO 32000-2

Mở một tệp PDF hiện đại và nó có thể kể cho bạn về chính mình tới hai lần. Có một danh sách khóa/giá trị nhỏ, cũ, gọi là Document Information dictionary, và có thể có một khối XML — gói XMP — nói gần như y hệt điều đó dưới một dạng phong phú hơn, có cấu trúc hơn. Trang này nói về hai hệ thống song song đó, vì sao cả hai vẫn tồn tại, và vì sao các đường ống lưu trữ và tìm kiếm khăng khăng đòi chúng phải nhất quán.

Câu trả lời ngắn cho tiêu đề: một tệp PDF biết tiêu đề, tác giả, chủ đề, từ khóa, công cụ đã tạo ra nó, và thời điểm. Nó lưu hiểu biết đó ở hai nơi cùng một lúc, và phần kỹ thuật thú vị nằm ở việc giữ cho chúng trung thực.

Metadata là phần của một tài liệu mà con người hiếm khi thấy còn máy thì gần như luôn luôn đọc. Bản xem trước tệp của hệ điều hành, một trình quản lý tài sản số, một danh mục thư viện, một chỉ mục tìm kiếm, một công cụ điều tra pháp lý — nhiều trong số đó đọc metadata trước, hoặc song song với, văn bản tài liệu, và tin vào những gì nó nói.

Vậy nên khi hai hệ thống bất đồng — Info dictionary nói một tác giả còn gói XMP nói một tác giả khác — một thứ gì đó ở hạ nguồn chọn một cái, và bạn không được quyết định nó chọn cái nào. Một chỉ mục tìm kiếm có thể đưa lên nhầm tiêu đề. Một validator lưu trữ có thể từ chối thẳng tệp. Sự trôi dạt vô hình cho tới khi một đường ống vấp phải nó, đúng vào thời điểm tệ nhất để phát hiện ra nó.

  • Một tệp PDF có thể mang metadata trong hai hệ thống song song: Document Information dictionary kế thừa và gói XMP RDF/XML hiện đại.
  • Gói XMP được bọc trong một processing instruction xpacket — một header begin và một trailer end — nhờ vậy một công cụ có thể tìm và, tại chỗ, thậm chí ghi lại nó mà không cần phân tích lại cả tệp.
  • Các property sống trong các namespace: dc (Dublin Core) cho tiêu đề và tác giả, xmp cho ngày tạo và ngày sửa đổi, pdf cho công cụ tạo, xmpMM cho định danh và lịch sử tài liệu.
  • PDF/A yêu cầu metadata XMP, và các mục DocInfo có giá trị tương đương trong XMP phải khớp với nó — một sự bất đồng là một thất bại xác nhận.
  • NextPDF coi cả hai là một công việc duy nhất: nó ghi cả hai, đọc XMP trở lại, và canh giữ kích thước của gói, fail closed thay vì phát ra một tệp sai định dạng.

Cách diễn đạt trung thực là đây là một bài toán đồng bộ hóa được khoác áo một bài toán định dạng. Document Information dictionary (Spec: ISO 32000-2, §14.3.3), được tham chiếu từ trailer bởi mục /Info, là một danh sách phẳng gồm các chuỗi: Title, Author, Subject, Keywords, Creator, Producer, và một vài mốc ngày. Nó đơn giản, nó có trước XML, và nó vẫn đi kèm trong gần như mọi tệp vì rất nhiều công cụ vẫn đọc nó trước.

Gói XMP (Spec: ISO 16684-1:2019, §7) là nửa hiện đại. Nó là một tài liệu XML — RDF/XML, để nói cho chính xác — mô hình hóa tệp như một tập các property có tên được gom thành các schema, mỗi schema được gắn vào một namespace (Spec: ISO 16684-1:2019, §6). Cấu trúc đó là thứ mà dictionary phẳng không làm được: một giá trị có thể là một danh sách có thứ tự, một biểu diễn thay thế gắn-thẻ-ngôn-ngữ (“tiêu đề bằng tiếng Anh, tiêu đề bằng tiếng Pháp”), hoặc một bản ghi có cấu trúc. Trong một tệp PDF, cái XML đó sống trong một metadata stream gắn vào document catalog (Spec: ISO 32000-2, §14.3.2), đó là nơi điển hình mà một trình đọc hiện thời tìm tới.

Có ba chi tiết đáng mổ xẻ, vì chúng là nơi các công cụ làm sai gói.

Cái vỏ bọc. Một gói XMP được kẹp giữa một processing instruction để, trong các định dạng mà gói được lưu dưới dạng các byte tìm-kiếm-trực-tiếp-được, một chương trình có thể định vị metadata mà không cần một lượt phân tích đầy đủ; riêng trong PDF, catalog metadata stream là bộ định vị điển hình. Header begin mang theo một byte-order mark khai báo mã hóa văn bản; trailer end mang theo một cờ cho biết gói là chỉ-đọc hay có thể được sửa tại chỗ. Khi nó ghi được, bộ serialize để lại một dải khoảng trắng đệm sau phần XML để một trình biên tập có thể làm nội dung lớn lên một chút mà không phải dịch chuyển từng byte theo sau. Phần đệm đó không phải để trang trí — nó là thứ làm cho việc biên tập metadata tại chỗ trở nên khả thi.

Các namespace. Một property chỉ có nghĩa khi đặt cạnh namespace của nó, và một nhóm nhỏ thì gần như phổ quát. Dublin Core (dc) giữ tiêu đề và tác giả. XMP basic schema (xmp) giữ ngày tạo và ngày sửa đổi cùng công cụ soạn thảo. PDF schema (pdf) giữ chuỗi producer và các từ khóa. Media-management schema (xmpMM) giữ định danh của tài liệu và lịch sử dẫn xuất của nó — dấu vết nói rằng “tệp này đến từ tệp kia.” Thống nhất về các namespace URI và tên property đó — thường được hiển thị với các tiền tố quy ước — chính là toàn bộ điểm mấu chốt của các core schema (Spec: ISO 16684-1:2019, Annex B); hai công cụ cùng nói property title của Dublin Core thì tương tác được với nhau mà không cần thỏa thuận trước.

Quy tắc nhất quán. Vì cả hai hệ thống đều có thể đặt tên cho cùng một property, chúng có thể bất đồng. Các profile lưu trữ từ chối cho phép điều đó. Một tệp PDF/A phải mang một metadata stream XMP, và bất kỳ mục Document Information nào có giá trị tương đương trong XMP đều phải khớp với nó; một sự bất đồng là một thất bại xác nhận. Điều rút ra thực tế là thẳng thắn: trong một đường ống lưu trữ, hai cái không phải là những trường độc lập mà là một sự thật được viết hai lần, và chúng phải đi cùng nhịp.

NextPDF xử lý cả ba như một mối quan tâm duy nhất. Luồng metadata là một đường đi, không phải hai đường cạnh tranh nhau.

  1. Collect the values onceTitle, author, subject, keywords, creator, producer and dates are set on the document a single time, so there is one source of truth, not two.
  2. Write the Info dictionaryThe DocInfo writer emits the legacy Title, Author, Subject, Keywords, Creator, Producer and date entries that older tools read first.
  3. Build the XMP packetThe XMP builder serializes the same values as RDF/XML under dc, xmp, pdf and xmpMM, wrapped in the xpacket header and trailer with writable padding.
  4. Guard the packet sizeBefore serialization is accepted, the engine checks the packet against a size bound and fails closed with a typed exception rather than emit a malformed or oversized stream.
  5. Read XMP back to verifyThe XMP reader parses the packet so a pipeline can confirm the engine wrote the metadata it was given — the kind of check an archival validator builds on.
How NextPDF keeps a document's two metadata systems consistent: one set of values is written to both the Info dictionary and the XMP packet, the packet is size-guarded before it is serialized, and the same packet can be read back so a pipeline can confirm the metadata serialized as intended.

Hình mẫu bên dưới đặt metadata một lần và để engine tỏa nó ra cả hai hệ thống, rồi đọc tiêu đề XMP trở lại để một đường ống có thể kiểm tra nó. Bộ canh giữ kích thước là dòng biến “chắc là ổn” thành “chứng minh được là bị từ chối nếu không ổn”.

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Metadata\Exception\XmpPacketTooLargeException;
$document = Document::createStandalone();
// Set the values ONCE. The engine writes them to both the Info dictionary
// and the XMP packet, so the two systems cannot drift apart at the source.
$document->setTitle('Annual Report 2026');
$document->setAuthor('Records Office');
$document->setSubject('Statutory annual filing');
$document->setKeywords('annual report, statutory, 2026');
try {
// Building the document serializes the XMP packet. The engine guards the
// packet size and fails closed: a packet that exceeds the bound is a
// typed exception, never a silently truncated or malformed stream.
$bytes = $document->getPdfData();
} catch (XmpPacketTooLargeException $e) {
// Decide deliberately: trim the metadata, not the guarantees.
error_log('XMP packet exceeded the size bound: ' . $e->getMessage());
throw $e;
}
// Read the packet back. This confirms the XMP the engine serialized carries the
// value you set — the kind of integrity check an archival pipeline runs before
// it trusts the file. (Both systems are written from one source, so they agree
// by construction; reading the XMP back proves it serialized as intended.)
$xmp = $document->readXmpMetadata($bytes);
$xmpTitle = $xmp->get('dc', 'title'); // 'Annual Report 2026'
if ($xmpTitle !== $document->getTitle()) {
throw new \RuntimeException('XMP title does not match the value that was set.');
}

Ở đây không có đường đi nào mà hai hệ thống lặng lẽ phân kỳ: các giá trị nhập vào một lần, cả hai bộ ghi tiêu thụ cùng một nguồn, và bộ đọc cho phép một đường ống kiểm tra kết quả.

Niềm tin hay gặp là Info dictionary đã lỗi thời và bạn có thể bỏ qua nó. Bạn không thể — chưa thể. Rất nhiều phần mềm đã được cài đặt, bao gồm một số bản xem trước tệp của hệ điều hành và các công cụ lưu trữ cũ hơn, vẫn đọc Info dictionary trước hoặc chỉ đọc nó. Bỏ nó đi không hiện đại hóa một tệp; nó làm cho tệp trông như không-có-tiêu-đề đối với bất cứ thứ gì chưa áp dụng XMP.

Cái sai phản chiếu lại là coi hai thứ như những trường độc lập mà bạn điền vào riêng rẽ. Đó chính xác là cách chúng trôi dạt. Chúng là hai cách serialize của một sự thật. Hãy ghi chúng từ một nguồn, hoặc chấp nhận rằng một thứ gì đó ở hạ nguồn sẽ chọn cái phiên bản mà bạn không hề muốn.

  • NextPDF ghi cả hai hệ thống và đọc XMP trở lại. Phạm vi của nó là bộ dựng metadata XMP, bộ ghi DocInfo, và một bộ đọc XMP. Nó không hứa hẹn là một engine truy vấn RDF/XML đa-dụng.
  • Gói XMP được canh giữ kích thước và fail closed. Một gói vượt quá biên của engine sẽ ném một typed exception. Engine sẽ không phát ra một gói bị cắt cụt, đệm-quá-giới-hạn, hay sai định dạng theo cách khác để làm một yêu cầu quá khổ “vừa khít”.
  • Tính nhất quán được cưỡng thực tại thời điểm ghi từ một nguồn; nó không phải phép thuật hòa giải một tệp bạn không tạo ra. Nếu bạn nhập một tài liệu mà hai hệ thống đã bất đồng sẵn, giải quyết điều đó là quyết định của bạn, không phải một lần ghi lại ngầm.
  • Các yêu cầu metadata của PDF/A là một phần của profile lưu trữ. Trang này giải thích quy tắc; phán quyết tuân thủ thuộc về một validator, như nó vẫn luôn vậy với công việc lưu trữ. Xem trang lưu trữ để biết ranh giới đó.

Bộ dựng metadata, bộ ghi DocInfo, và bộ đọc XMP là các năng lực Core. Cái định tính trung thực nằm cùng với bộ canh giữ kích thước, bên dưới.

Metadata: Info dictionary and XMP packet — edition availability
EditionAvailability
Core

The XMP metadata builder, the Document Information dictionary writer, and the XMP reader ship in Core, with the size guard that fails closed on an oversized packet — including the PDF/A conformance output and validation that make the XMP metadata stream mandatory and require DocInfo to match it.

Pro

Adds batch and templated metadata workflows over the same Core writer and reader.

Enterprise

Adds the broader conformance policy and reporting surface across a document estate.

  • Archival and PDF/A — nơi gói XMP thôi không còn là tùy chọn và quy tắc nhất quán DocInfo-tới-XMP trở thành một yêu cầu đậu-hoặc-trượt.
  • Compliance you can hand to an auditor — vì sao metadata round-trip được và đồng thuận với chính nó là một phần của một sản phẩm có-thể-kiểm-toán.
  • The anatomy of a PDF file — nơi trailer, catalog, và metadata stream nằm trong cấu trúc tệp.
  • Streams and filters — metadata stream là một stream; đây là cách các PDF stream được mã hóa và giữ cho có tính tất định.
  • Document Information dictionary — metadata khóa/giá trị phẳng, kế thừa, được tham chiếu từ trailer bởi mục /Info: Title, Author, Subject, Keywords, Creator, Producer, và các mốc ngày. Có trước XMP; vẫn được đọc rộng rãi.
  • XMP — Extensible Metadata Platform, một định dạng XML (RDF/XML) để mô tả một tài nguyên bằng các property có tên được gom thành các schema. Được chuẩn hóa thành ISO 16684-1.
  • xpacket — processing instruction bọc một gói XMP, với một header begin (dấu hiệu mã hóa) và một trailer end (cờ chỉ-đọc hay ghi-được), nhờ vậy một công cụ có thể định vị và biên tập gói mà không cần một lượt phân tích đầy đủ.
  • Namespace / schema — một bộ từ vựng property có tên được gắn vào một URI. Các tiền tố thường gặp: dc (Dublin Core), xmp (XMP basic), pdf (PDF-specific), xmpMM (media management / định danh tài liệu).
  • Metadata stream — đối tượng PDF, gắn vào document catalog, mang theo gói XMP. Vị trí điển hình mà một trình đọc hiện đại kiểm tra trước tiên.
  • PDF/A — họ profile PDF lưu trữ (ISO 19005). Nó yêu cầu một metadata stream XMP và đòi hỏi bất kỳ mục Document Information nào có giá trị tương đương trong XMP phải khớp với nó, nếu không xác nhận sẽ thất bại.