Tạo một PDF lớn hơn nước Đức
(alexwlchan.net)- Thông tin lan truyền trên Internet rằng “kích thước tối đa của PDF là 381 km × 381 km” không phải giới hạn của chính định dạng PDF, mà là giá trị xuất phát từ giới hạn triển khai của Adobe Acrobat 7.0
- Từ PDF 1.6, có thể dùng
/UserUnitđể tăng đơn vị cơ bản 1/72 inch, và giá trị tối đa75,000của Acrobat 7.0 tạo ra giới hạn trên15,000,000 inch - Một PDF tạo thủ công gồm
%PDF-1.6, danh sách object,xref,trailer,startxref,%%EOF; kích thước trang được quyết định bởi tổ hợp/MediaBoxvà/UserUnit - Acrobat hiển thị thành 15,000,000 inch ngay cả khi
/MediaBoxvượt 14,400 hoặc/UserUnitvượt 75,000; trường hợp vượt/UserUnitbị bỏ qua mà không cảnh báo - macOS Preview.app bỏ qua
/UserUnit, nhưng không đặt giới hạn trên như Acrobat đối với/MediaBox, nên cũng có thể tạo file hiển thị như một PDF lớn hơn cả vũ trụ
Giới hạn 381 km đến từ đâu
- Tuyên bố rằng kích thước tối đa của tài liệu PDF là 381 km × 381 km đã được lặp đi lặp lại trên Internet từ lâu
- Con số này không phải giới hạn của định dạng PDF, mà bắt nguồn từ giới hạn triển khai của Adobe Acrobat
- Theo đặc tả PDF 1.7, giới hạn kích thước trang được tóm tắt như sau
- Trước PDF 1.6, đơn vị không gian người dùng mặc định được cố định là 1/72 inch
- Từ Acrobat 5.0 trở đi, giá trị tối đa của kích thước trang mặc định là
14,400 × 14,400đơn vị, tức 200 × 200 inch - Từ PDF 1.6, có thể đặt kích thước đơn vị không gian người dùng mặc định bằng
/UserUnittrong page dictionary - Acrobat 7.0 hỗ trợ giá trị tối đa
75,000cho/UserUnit, cho phép tạo kích thước trang tối đa 15,000,000 inch
15,000,000 inchxấp xỉ 381 km, và cách diễn đạt “PDF version 7” có vẻ không phải là phiên bản PDF mà xuất phát từ Adobe Acrobat 7.0
Cấu trúc cơ bản của PDF viết thủ công
- File PDF có số phiên bản ở phần đầu và dấu EOF ở phần cuối
- Ví dụ:
%PDF-1.6 - Dấu kết thúc:
%%EOF
- Ví dụ:
- Sau số phiên bản là danh sách object biểu diễn trang, văn bản, đồ họa, v.v.
xreflà bảng tham chiếu chéo cho biết vị trí của object- Trình đọc PDF kiểm tra mỗi object cách điểm bắt đầu file bao nhiêu byte
trailerchứa metadata của toàn bộ tài liệu- Số trang
- Có mã hóa hay không
- Object gốc của tài liệu
startxreftrỏ đến vị trí bắt đầu của bảngxref- Trình đọc PDF tìm giá trị
startxrefở cuối file rồi di chuyển đến bảngxref
- Trình đọc PDF tìm giá trị
- Tham khảo bài viết về cách tạo một file PDF đơn giản, bạn có thể tự tay tạo một PDF có hình chữ nhật màu đỏ
Định nghĩa object và trang
- PDF ví dụ gồm bốn object cốt lõi
- Object 1: stream object vẽ hình chữ nhật màu đỏ
- Object 2: object
Pageđịnh nghĩa một trang đơn - Object 3: object
Pageschứa thông tin nhiều trang - Object 4: object
Catalogcung cấp cấu trúc chính của tài liệu
- Object
Pageliên kết nội dung trang bằng tham chiếu đến object khác1 0 Rtham chiếu object số 1, generation number 03 0 Rtham chiếu objectPages, tức tập hợp trang
- Khi viết PDF thủ công, mỗi lần vị trí object thay đổi lại phải chỉnh lại các giá trị trong bảng
xref, nên rất phiền phức - Trong bản cập nhật ngày 16/4/2025, giá trị
xref 0 4trong mã ví dụ đã được sửa vì là giá trị sai- Vì bảng tham chiếu chéo thực tế có 5 mục,
xref 0 5mới đúng
- Vì bảng tham chiếu chéo thực tế có 5 mục,
Phóng to trang bằng /MediaBox và /UserUnit
- Kích thước trang của PDF được thiết lập trong từng object
Page /MediaBox [0 0 300 300]tạo một trang có chiều rộng và chiều cao đều là 300 đơn vị- Đơn vị mặc định là 1/72 inch
- 300 đơn vị xấp xỉ 4,17 inch
- Nếu đổi
/MediaBoxthành600 600, Acrobat hiển thị trang là8.33 x 8.33 in - Giá trị tối đa
/MediaBoxmà Acrobat cho phép,14400 14400, được hiển thị là 200 × 200 inch- Nếu vượt giá trị này, Acrobat sẽ phát cảnh báo
- Khi thêm
/UserUnit, có thể tăng đơn vị không gian người dùng mặc định/UserUnit 2làm gấp đôi kích thước theo cả hai chiều của trang- Nếu dùng
/MediaBox [0 0 14400 14400]cùng với/UserUnit 2, Acrobat hiển thị là400.00 x 400.00 in
- Khi áp dụng
/UserUnit 75000, Acrobat hiển thị trang là 15,000,000.00 × 15,000,000.00 inch- Con số này xấp xỉ 381 km × 381 km và khớp với tuyên bố ban đầu
- File ví dụ: biggest.pdf
Khác biệt trong cách Acrobat và Preview xử lý
- Acrobat vẫn tiếp tục hiển thị kích thước trang là 15,000,000 inch dù đặt
/MediaBoxhoặc/UserUnitlớn hơn - Nếu đặt giá trị
/UserUnitlớn hơn75000, giá trị này bị giới hạn mà không có cảnh báo hay lỗi - Có vẻ
/UserUnitkhông có nhiều trường hợp sử dụng thực tế- Câu trả lời trên Stack Overflow cũng nói rằng giá trị này không được dùng rộng rãi
- Rất khó tìm ví dụ trên mạng
- macOS Preview.app không hỗ trợ
/UserUnit- Nó xử lý mọi PDF bằng đơn vị mặc định 1/72 inch
- Thay vào đó, khác với Acrobat, Preview.app không đặt giới hạn trên lớn cho
/MediaBox- Nó chấp nhận cả chiều rộng là số
1theo sau bởi 12 số 0 - Chiều rộng này xấp xỉ khoảng cách giữa Trái Đất và Mặt Trăng
- Nó chấp nhận cả chiều rộng là số
- Nếu đưa vào giá trị
/MediaBoxlớn hơn nữa, cũng có thể tạo file mà Preview hiển thị như một PDF có kích thước khoảng 37 nghìn tỷ năm ánh sáng vuông- File ví dụ: universe.pdf
- Phần lớn tài liệu là khoảng trống, kèm cảnh báo không nên in ra
1 bình luận
Các ý kiến trên Hacker News
Về mặt kỹ thuật, PDF rất tệ ở nhiều khía cạnh, nhưng việc nó là một tệp tĩnh tự chứa mà ta có thể giữ trong tay thì thật tuyệt, nhất là khi so với các website động/SaaS thù địch với người dùng có thể biến mất bất cứ lúc nào
PDF/A gần với PDF “thật” hơn, và loại bỏ phần lớn những thứ linh tinh nguy hiểm
Nếu thích những trò nghịch PDF kỳ quặc, có một tệp polyglot vừa là PDF/A, vừa là CSV, đồng thời cũng là soundtrack Amiga soundtracker mod: https://www.lab6.com/6
https://www.nytimes.com/2009/07/18/technology/companies/18am...
Nhiều người lo lắng về việc chạy JavaScript nhưng lại dùng tệp PDF mà không mấy bận tâm
Nếu muốn chuyển một PDF bất kỳ sang PDF/A bằng phần mềm mã nguồn mở, có vẻ cách duy nhất là đi qua PostScript bằng Ghostscript rồi quay lại, nhưng Ghostscript dùng giấy phép Affero nên có thể kéo theo nhiều vấn đề
Cũng có các bản GPL cũ hơn và chúng hoạt động với phần lớn PDF, nhưng đã khoảng 15 năm tuổi
Ở công ty cũ tôi từng phải xử lý PDF/A, và trải nghiệm đó chẳng vui chút nào
Chỉ riêng việc dựng lại các đoạn văn đã tốn rất nhiều công sức, chưa nói đến phân tích bảng
Với một thứ gần như là tiêu chuẩn thực tế, nó lẽ ra phải tốt hơn; tài liệu hướng dẫn PDF cũng thật sự rất tệ
Để so sánh, nếu phân tích PNG, chiều rộng và chiều cao tối đa là 2147483647, tức 2^31 - 1
Mật độ thấp nhất có thể chỉ định bằng chunk pHYs là 1 pixel trên mét, nên 2 tỷ mét còn lớn hơn đường kính Mặt Trời 1,39 gigamét: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
Chunk sCAL dùng số thực dấu phẩy động ASCII, nên có thể biểu diễn kích thước vật lý còn lớn hơn nhiều
Một bản đồ thế giới tỷ lệ 1:10.000.000 theo pHYs thì rộng dưới 10m, nhưng theo sCAL thì rộng khoảng 40.000km
Khoảnh khắc bạn đo chiều rộng PDF bằng đơn vị kilômét, bạn biết mình đang đọc một bài kỹ thuật hay
Tôi nhớ đến một PDF được tạo bằng bản triển khai PostScript của Game of Life hơn 10 năm trước
Có vẻ nó vẫn chạy, nhưng làm macOS Preview bị crash: https://andrewcutler.net/docs/joke/life.pdf
Tuy nhiên không thấy hoạt ảnh mà chỉ thấy trạng thái cuối; trong trình xem PDF của Firefox thì thấy một chút hoạt ảnh
Skim cũng giống Preview nhưng không hiển thị lưới
Bài này làm tôi nhớ đến trò chơi trí tuệ của Umberto Eco
Đặc biệt là “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
https://en.wikipedia.org/wiki/On_Exactitude_in_Science
Preview, khác với Acrobat, không có giới hạn trên cho giá trị có thể đưa vào MediaBox, và chấp nhận cả chiều rộng là số 1 theo sau bởi 12 số 0
Trình kiểm tra tài liệu hiển thị kích thước trang là 352777777777.78 x 10.59cm, và chiều rộng này xấp xỉ khoảng cách giữa Trái Đất và Mặt Trăng
Dù đặt tất cả các hành tinh trong Hệ Mặt Trời thành một hàng, chúng vẫn nằm gọn thoải mái trong tài liệu này
Rốt cuộc vẫn cần đến thước đo
352777777777.78cm là 3.527.777,7777778km
Một thử nghiệm thú vị, alexwlchan
Trong bài có hai lỗi nhỏ: chỗ viết “15,000,000,000.00 in” và “kích thước trang là 15 tỷ inch” đúng ra phải là 15 triệu inch
Bạn nói việc định dạng văn bản khó, nhưng với ví dụ PDF chỉ có hai từ “Hello World”, chỉ cần định nghĩa đối tượng phông chữ, rồi trong stream dùng
Tfđể dùng phông chữ,Tdđể đặt vị trí vàTjđể viết văn bản là đượcCảm ơn cả ví dụ văn bản; trông giống với thứ tôi đã thử, nhưng chắc chắn tôi đã sai ở đâu đó
Theo đặc tả thì có vẻ là cần
Đến đoạn này tôi muốn diễn đạt lại câu của Steven Wright
“Tôi có một tấm bản đồ nước Mỹ. Nó có kích thước thật”
Tôi không biết phía trên của bản đồ là hướng tôi đang di chuyển hay là hướng bắc; bản đồ ngày xưa thì luôn đặt hướng bắc ở phía trên, còn Google Maps trông có vẻ không như vậy nên tôi thấy rối
Khi quay 90 độ thì bản đồ cũng quay theo, nhưng tôi cũng không rõ là bản đồ quay hay chính tôi quay
Nếu tôi đứng yên thì bản đồ không thể biết tôi đang đi về đâu, nên có vẻ phải di chuyển trước thì mới biết được phương hướng
Khi giơ điện thoại trước mắt, phía trên của bản đồ hướng lên trời, nhưng tôi cũng không biết có phải mình nên nhìn bản đồ từ trên xuống hay không
Tôi muốn biết mẹo dùng Google Maps tốt trên điện thoại
https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
https://scomedy.com/quotes/10779
“Đừng in ra” nghe như một câu đã sẵn sàng trở thành bom in
Lần cuối tôi dùng máy in, việc hủy lệnh in trên Windows gần như là bất khả thi
Thời Wi-Fi printer để mở hoặc bảo mật lỏng lẻo thật là vui
Cách đáng tin cậy duy nhất tôi tìm được là tắt nguồn máy in rồi xóa lệnh in khỏi hàng đợi
Nếu máy in không ở ngay bên cạnh thì không làm được, và tôi không hiểu sao chuyện này lại khó đến vậy
Khoảng 30 năm trước, trong một buổi phỏng vấn thực tập mùa hè ở Microsoft, người phỏng vấn đã hỏi một câu rất giống như thế này về Excel
Những chủ đề kiểu này luôn là chất liệu tốt để xem sự tò mò của một người và khả năng phân rã các vấn đề tiềm ẩn