Một tệp PDF biết gì về chính nó: metadata và gói XMP
Spec: ISO 16684-1:2019ISO 16684-1:2019Spec: ISO 32000-2ISO 32000-2
Tổng quan nhanh
Phần tiêu đề “Tổng quan nhanh”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.
Vì sao điều này quan trọng
Phần tiêu đề “Vì sao điều này quan trọng”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ó.
Tóm tắt ngắn gọn
Phần tiêu đề “Tóm tắt ngắn gọ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
beginvà một trailerend— 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ả,xmpcho ngày tạo và ngày sửa đổi,pdfcho công cụ tạo,xmpMMcho đị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.
NextPDF tiếp cận điều này như thế nào
Phần tiêu đề “NextPDF tiếp cận điều này như thế nào”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.3ISO 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, §7ISO 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, §6ISO 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.2ISO 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 BISO 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.
- 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.
- Write the Info dictionaryThe DocInfo writer emits the legacy Title, Author, Subject, Keywords, Creator, Producer and date entries that older tools read first.
- 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.
- 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.
- 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.
Ví dụ thực tế
Phần tiêu đề “Ví dụ thực tế”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ả.
Hiểu lầm thường gặp
Phần tiêu đề “Hiểu lầm thường gặp”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.
Giới hạn và ranh giới
Phần tiêu đề “Giới hạn và ranh giới”- 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.
| Edition | Availability |
|---|---|
| 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. |
Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- 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.
Bảng thuật ngữ
Phần tiêu đề “Bảng thuật ngữ”- 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 trailerend(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.