Bỏ qua để đến nội dung

PDF 2.0: có gì thay đổi

Evidence: Standard-backed

PDF 2.0 chính là ISO 32000-2. Đây là đặc tả PDF đầu tiên hoàn toàn thuộc sở hữu của ISO, thay vì Adobe. Về cơ bản, đây là một bước củng cố và dọn dẹp cho 1.7, không phải một cuộc tái sáng tạo mạnh mẽ. Trang này trình bày những gì thực sự đã thay đổi, thay đổi nào bạn sẽ cảm nhận được trong thực tế, và cách NextPDF mặc định hướng đến chuẩn nền 2.0 trong khi vẫn có thể ghi cấu trúc tệp cũ hơn khi một hồ sơ yêu cầu.

“PDF 2.0” nghe như thể phải là một định dạng khác. Nhưng không phải vậy. Một tệp 2.0 dùng cùng một mô hình đối tượng, xref và trailer như 1.7, nên những thay đổi thực sự rất dễ bị đánh giá thấp. Những thay đổi gây rắc rối không phải là các tính năng nổi bật. Đó là các quy định được siết chặt: những quy tắc từng là tùy chọn trong 1.7 và nay được kỳ vọng phải tuân thủ, cùng những tính năng đã âm thầm bị loại bỏ. Một tài liệu vốn là tệp 1.7 hoàn toàn hợp lệ có thể trở thành tệp 2.0 không tuân thủ mà không có khác biệt nào nhìn thấy được.

Lý do khác khiến điều này quan trọng nằm ở định hướng. NextPDF là một engine PDF 2.0. Một khi bạn hiểu 2.0 kỳ vọng những gì, và nó cố ý khác 1.7 ở đâu, bạn có thể lý giải vì sao engine từ chối một số thứ, nhúng phông chữ nghiêm ngặt hơn, và mặc định dùng luồng tham chiếu chéo thay cho bảng.

  • PDF 2.0 = ISO 32000-2, do ISO sở hữu, xây dựng trên (chứ không thay thế) 1.7.
  • Header trở thành %PDF-2.0; một bộ ghi tuân thủ sẽ khai báo phiên bản là 2.0 trong header hoặc trong /Version của catalog.
  • Phần lớn cấu trúc tệp không đổi — cùng các đối tượng gián tiếp, cùng trailer, cùng nguyên tắc startxref/%%EOF.
  • Mặc định tự nhiên của 2.0 là luồng tham chiếu chéo; bảng 20 byte cổ điển vẫn hợp lệ và vẫn được một số hồ sơ PDF/A yêu cầu.
  • 2.0 thêm một số thứ (ví dụ: cấu trúc tệp liên kết và phần tài liệu phong phú hơn, mã hóa mạnh hơn qua phần mở rộng AES-256-GCM) và loại bỏ một số thứ (một vài thẻ cấu trúc; kỳ vọng siết chặt hơn về việc nhúng phông chữ; các bộ ký tự CJK bị ngừng dùng).
  • NextPDF hướng đến 2.0 theo mặc định và có thể tuần tự hóa cấu trúc 1.7/1.4 khi một hồ sơ tuân thủ yêu cầu.

Phiên bản là một quyết định, được thể hiện tại một nơi: chiến lược tuần tự hóa.

Pdf20StreamStrategy (src/Writer/Pdf20StreamStrategy.php) ghi header %PDF-2.0, báo cáo /2.0 là phiên bản catalog, và phát ra một luồng tham chiếu chéo đã nén. Nó cũng trực tiếp áp dụng quy định siết chặt về phông chữ của 2.0. Theo hồ sơ 2.0, nó có thể bắt buộc xử lý một phông chữ Type 1 chuẩn không được nhúng, thay vì chỉ cảnh báo, vì chuẩn nay kỳ vọng những phông chữ đó được nhúng. Hai chiến lược bảng (Pdf17TableStrategy, Pdf14TableStrategy) tồn tại chính là vì một số hồ sơ cần dạng cũ hơn. PDF/A-2/-3 bắt buộc dùng bảng tham chiếu chéo truyền thống, và PDF/A-1 còn cấm thêm các luồng đối tượng và tham chiếu chéo. Cả ba chiến lược đều triển khai cùng một interface PdfSerializationStrategy, nên bộ ghi ở tầng phía trên vẫn như nhau. Chỉ có dạng trailer/xref thay đổi.

Mã hóa mạnh hơn cũng được kết nối theo cùng một cách có chủ đích. PdfXrefWriter (src/Writer/PdfXrefWriter.php) truyền lựa chọn bật AES-256-GCM (phần mở rộng ISO/TS 32003 cho 2.0) vào dictionary mã hóa để phiên bản handler và các mục chế độ mã hóa được phát ra khớp với các byte thực sự được tạo. Engine không công bố một thuật toán mã hóa rồi lại ghi một thuật toán khác.

Thiết kế tổng thể là như sau. 2.0 là mặc định. Cấu trúc cũ hơn chỉ có thể được dùng một cách có chủ ý, không bao giờ là hệ quả tình cờ. Và ở nơi 2.0 siết chặt một quy tắc, NextPDF có thể giữ vững mức siết chặt đó thay vì âm thầm nới lỏng.

  1. Step 1 of 3: ISO 32000-1 PDF 1.7 — the Adobe-authored base, adopted by ISO
  2. Step 2 of 3: ISO 32000-2 PDF 2.0 — ISO-owned consolidation, tightening, and additions
  3. Step 3 of 3: ISO/TS 32003 AES-256-GCM (AESV4) — an encryption extension to PDF 2.0
Dòng tiến hóa phiên bản PDF mà NextPDF dựa vào: PDF 1.7 trở thành nền tảng ISO, ISO 32000-2 chính là PDF 2.0, và ISO/TS 32003 mở rộng 2.0 với mã hóa AES-256-GCM.

Khai báo phiên bản là yêu cầu bắt buộc. Spec: ISO 32000-2, §7.5.2 nêu rằng một bộ xử lý ghi tệp tuân thủ phải xác định phiên bản — hoặc trong header hoặc dưới dạng mục /Version của catalog — là 2.0, và rằng header là %PDF-1.n hoặc %PDF-2.n theo sau bởi một dấu kết thúc dòng duy nhất. Spec: ISO 32000-2, §7.7.2 bổ sung rằng /Version của catalog ghi đè một phiên bản header trước đó, và đây chính là điều giúp việc nâng phiên bản theo kiểu gia tăng trở nên khả thi. Evidence: Standard-backed

Việc 2.0 là một bước củng cố, không phải viết lại, thể hiện ở những gì nó giữ lại: luồng tham chiếu chéo (/Type /XRef) chính là cơ chế được giới thiệu trong PDF 1.5 và được tiếp nối thành mặc định của 2.0 ( Spec: ISO 32000-2, §7.5.8 ). Cấu trúc đối tượng gián tiếp, trailer và startxref không thay đổi so với mô tả ở trang trước.

Những thay đổi quan trọng nằm ở các phần loại bỏ và siết chặt. Chuẩn nêu rằng sáu phần tử cấu trúc chuẩn có trong namespace cấu trúc chuẩn của PDF 1.7 không thuộc namespace của PDF 2.0 — Art, BlockQuote, TOC, Reference, BibEntry, và Code ( Spec: ISO 32000-2, Annex L.3 , với các khác biệt namespace được định nghĩa theo Spec: ISO 32000-2, §14.8.6 ). Nó cũng siết chặt mười bốn phông chữ Type 1 chuẩn: trong khi 1.0–1.7 cho phép dictionary của chúng bỏ qua các mục metrics, thì 2.0 không còn cho phép điều đó ( Spec: ISO 32000-2, §9.6.2.1 ). Và nó sửa đổi các bộ ký tự CJK định nghĩa sẵn. Ví dụ, Adobe-Korea1 bị ngừng dùng trong 2.0. Adobe-KR được thêm vào. Không điều nào trong số này thay đổi diện mạo của một trang hiện có. Nhưng tất cả đều có thể thay đổi việc trang đó có tuân thủ hay không.

Hạng mụcVí dụ (2.0 so với 1.7)Nó có làm thay đổi diện mạo không?Vì sao nó quan trọng
Không đổiĐối tượng gián tiếp, trailer, startxref/%%EOF, luồng xref2.0 dùng cùng một mô hình đối tượng; phần lớn công cụ vẫn dùng được
Thêm vàoCấu trúc tệp liên kết / phần tài liệu phong phú hơn; mã hóa AES-256-GCM (ISO/TS 32003)KhôngKhả năng mới mà bạn chủ động bật; được trình đọc cũ hơn bỏ qua một cách an toàn
Siết chặt14 phông chữ chuẩn được kỳ vọng phải nhúng; không còn được bỏ qua metricsKhôngMột tệp 1.7 hợp lệ có thể trở thành tệp 2.0 không tuân thủ
Loại bỏSáu phần tử cấu trúc thuộc namespace 1.7 (Art, BlockQuote, TOC, Reference, BibEntry, Code); các bộ CJK bị ngừng dùng (ví dụ, Adobe-Korea1)KhôngÂm thầm: không có dấu hiệu nhìn thấy nào báo hiệu sự mất tuân thủ

Những thay đổi quan trọng của PDF 2.0 hầu hết đều vô hình: những phần bổ sung mà bạn chủ động bật, và các phần siết chặt/loại bỏ làm thay đổi tính tuân thủ mà không thay đổi một điểm ảnh nào được kết xuất.

Khác biệt nhìn thấy được duy nhất giữa một tệp 2.0 và một tệp 1.7 thường chỉ là hai dòng — header và phiên bản catalog — dù các quy tắc tuân thủ đằng sau chúng khác nhau đáng kể.

%PDF-2.0 % was %PDF-1.7
...
1 0 obj
<< /Type /Catalog /Version /2.0 % catalog states 2.0; overrides header if later
/Pages 2 0 R >>
endobj
...
% Cross-reference STREAM is the 2.0 default (was often a 20-byte table)
99 0 obj
<< /Type /XRef /Size 100 /W [1 2 2] /Filter /FlateDecode /Root 1 0 R >>
stream
<binary xref entries>
endstream
endobj
startxref
12345
%%EOF

Một trình đọc thấy %PDF-2.0 và một /Version /2.0. Điều mà nó không thấy — nhưng một bộ kiểm tra tuân thủ thì thấy — là tệp này nay được kỳ vọng phải nhúng các phông chữ chuẩn của mình và không được dùng các thẻ cấu trúc mà 2.0 đã loại bỏ. Khác biệt về số byte thì ít. Khác biệt về quy tắc thì không.

Cái bẫy nằm ở suy nghĩ “chúng tôi xuất ra PDF 2.0, nên chúng tôi tuân thủ tốt hơn trước.” Ghi %PDF-2.0 là một lời tuyên bố, không phải một sự đảm bảo. Một tệp có thể mang header 2.0 mà vẫn vi phạm 2.0 — bằng cách tham chiếu một phông chữ chuẩn không được nhúng, hoặc dùng một tính năng mà 2.0 đã loại bỏ — đúng theo cách từng được chấp nhận trong 1.7. Dấu hiệu phiên bản chỉ nâng tiêu chuẩn dùng để đánh giá tệp. Nó không nâng tệp vượt qua tiêu chuẩn đó. Sai lầm ngược lại là cho rằng một tệp 1.7 sẽ hoạt động như 2.0 chỉ bằng cách đổi header: thông thường nó kết xuất y hệt và không tuân thủ, vì các quy định siết chặt là thật dù chúng vô hình.

Hướng đến chuẩn nền 2.0 nghĩa là NextPDF mặc định dùng cấu trúc tệp 2.0 và có thể giữ vững các quy tắc đã siết chặt của 2.0. Điều đó không có nghĩa là mọi tính năng tùy chọn của 2.0 đều được triển khai, cũng không có nghĩa là việc phát ra header 2.0 chứng nhận một tài liệu đạt PDF/A, PDF/UA hay bất kỳ hồ sơ nào khác. Đó là những mục tiêu tuân thủ riêng biệt, nghiêm ngặt hơn, được đặt trên đặc tả nền, và mỗi mục tiêu có cơ chế kiểm tra riêng.

Trang này là một định hướng thực dụng về những khác biệt giữa các phiên bản, không phải nhật ký thay đổi đầy đủ của ISO 32000-2 so với 32000-1. Ở nơi một tính năng cụ thể hoặc một phần bị ngừng dùng của 2.0 chi phối hành vi của engine, hành vi đó được gắn với điều khoản riêng của nó. Trang này phác họa bức tranh tổng thể thay vì liệt kê mọi khác biệt ở cấp điều khoản.

PDF 2.0 có tương thích ngược với các trình đọc 1.7 không? Phần lớn là có, xét ở phần cấu trúc không đổi. Các tính năng mới của 2.0 nhìn chung được thiết kế để một trình đọc cũ hơn có thể bỏ qua những gì nó không hiểu. Nhưng một tính năng chỉ có ở 2.0 sẽ không được trình đọc 1.7 hỗ trợ.

Header hay /Version của catalog sẽ thắng? /Version của catalog được ưu tiên khi nó nêu một phiên bản mới hơn so với header. Đây chính là điều cho phép một bản cập nhật gia tăng nâng phiên bản của tệp mà không cần ghi lại header.

Vì sao NextPDF mặc định dùng luồng tham chiếu chéo chứ không phải một bảng? Luồng tham chiếu chéo là cơ chế tự nhiên của PDF 2.0 — gọn nhẹ và có thể lập chỉ mục cho các đối tượng đã nén. Bảng 20 byte vẫn được ghi khi một hồ sơ (đáng chú ý là một số cấp PDF/A) yêu cầu.

  • PDF thực ra là gì — mô hình đối tượng và xref mà PDF 2.0 giữ lại từ 1.7.
  • Bức tranh các tiêu chuẩn — vị trí của ISO 32000-2 giữa các tiêu chuẩn mà NextPDF theo dõi và cách một điều khoản chuyển thành hành vi.
  • Phông chữ: phần khó nhất — việc siết chặt nhúng phông chữ là một trong những thay đổi của 2.0 mà bạn thực sự cảm nhận được.
  • PDF 2.0 — đặc tả PDF được chuẩn hóa thành ISO 32000-2, phiên bản đầu tiên do ISO sở hữu thay vì Adobe.
  • ISO 32000-1 — phiên bản ISO chuẩn hóa PDF 1.7 của Adobe; nền tảng mà PDF 2.0 xây dựng trên đó.
  • ISO/TS 32003 — một đặc tả kỹ thuật mở rộng PDF 2.0 với mã hóa AES-256-GCM (AESV4).
  • /Version của catalog — mục trong catalog tài liệu khai báo phiên bản PDF; ghi đè header khi nó nêu một phiên bản mới hơn.
  • Luồng tham chiếu chéo — cơ chế tham chiếu chéo của PDF 1.5+ / 2.0 (/Type /XRef); là mặc định của NextPDF, với bảng cổ điển vẫn còn dùng được cho các hồ sơ cũ hơn.
  • Siết chặt — một quy tắc từng là tùy chọn hoặc được cho phép trong 1.7 và được kỳ vọng hoặc bắt buộc trong 2.0, làm thay đổi tính tuân thủ mà không thay đổi diện mạo.