- PDFSyntax là một thư viện Python tập trung vào Chương 7 “Syntax” của đặc tả PDF, dùng để kiểm tra và chuyển đổi cấu trúc tài liệu nội bộ của tệp PDF xuống tới cấp độ byte
- Được viết hoàn toàn bằng Python từ đầu, đây là một thư viện nhẹ không có phụ thuộc, đề cao tính đơn giản và tính bất biến
- Cách chỉnh sửa mặc định là cập nhật gia tăng không phá hủy được đặc tả PDF cho phép, thêm phần thay đổi vào cuối tệp gốc, đồng thời có thể tua lại hoặc gộp thành một revision duy nhất
- CLI cung cấp
overview, disasm, text, fonts, browse..., trong đó browse xuất mã nguồn PDF theo dạng dễ đọc và cho phép khám phá cấu trúc bên trong bằng HTML tĩnh có kèm siêu liên kết
- Hiện đây là một dự án beta chất lượng đang trong quá trình phát triển, API có thể thay đổi bất cứ lúc nào, dùng giấy phép MIT nhưng hiện chưa nhận đóng góp từ bên ngoài
Kiểm tra và chuyển đổi cấu trúc bên trong PDF
- PDFSyntax là một thư viện Python để kiểm tra và chuyển đổi cấu trúc bên trong của tệp PDF
- Tập trung vào Chương 7 “Syntax” của đặc tả Portable Document Format (PDF)
- Việc quản lý cấu trúc tài liệu được triển khai tới cấp độ byte để dùng cho các mục đích như sau
- truy cập metadata
- xoay trang
- tác vụ đọc/ghi PDF
- truy cập và thao tác các đối tượng nội bộ
Định hướng thiết kế
- Các hàm nội bộ được cung cấp như một bộ công cụ API cho các tác vụ đọc/ghi PDF
- Một số tính năng cũng được cung cấp dưới dạng CLI để dùng trong terminal hoặc trình duyệt
- Thư viện được viết bằng Python thuần và không có phụ thuộc bên ngoài
- Đề cao tính đơn giản và tính bất biến
- Cách chỉnh sửa mặc định là cập nhật gia tăng: không ghi đè trực tiếp lên bản gốc mà thêm nội dung thay đổi vào cuối tệp gốc
- nếu cần có thể tua lại revision
- cũng có thể gộp tất cả revision thành một
Cài đặt và sử dụng CLI
pip install pdfsyntax
- Cú pháp sử dụng cơ bản của CLI như sau
pdfsyntax COMMAND FILE
- Nếu cài từ mã nguồn, có thể chạy bằng cú pháp dài hơn
python3 -m pdfsyntax COMMAND FILE
- Các lệnh chính để phân tích PDF nhanh gồm có
overview: xuất thông tin văn bản về cấu trúc và metadata
disasm: xuất bản dump cấu trúc tệp ra terminal
text: xuất văn bản trích xuất với bố cục không gian được giữ lại như khi quét
fonts: xuất danh sách phông chữ đã dùng
browse: xuất mã nguồn PDF theo dạng dễ đọc và tạo HTML tĩnh có thêm siêu liên kết để hỗ trợ khám phá cấu trúc bên trong
Cách sử dụng API
- PDFSyntax chủ yếu gồm các hàm đơn giản
- Có thể đọc PDF bằng
readfile và lấy metadata ở dạng Python dict bằng metadata
>>> from pdfsyntax import readfile, metadata
>>> doc = readfile("samples/simple_text_string.pdf")
>>> metadata(doc)
- Đối tượng
Doc gần như là lớp chuyên dụng duy nhất lưu trạng thái nội bộ của tài liệu
- nội dung được cache hoặc memoize từ tệp gốc
- các thay đổi thêm, sửa, xóa nội dung
- lịch sử chỉnh sửa được theo dõi bằng cập nhật gia tăng
- Cùng hàm
metadata đó cũng có thể được dùng như phương thức của đối tượng Doc
>>> doc.metadata()
- Có thể truy cập và thao tác trực tiếp các đối tượng nội bộ của tài liệu bằng các hàm mức thấp như
get_object, update_object
- Cũng có các hàm mức cao như
rotate
>>> from pdfsyntax import rotate, writefile
>>> doc180 = rotate(doc, 180)
- Trong ví dụ xoay, đối tượng gốc không bị thay đổi mà một đối tượng mới chứa hướng xoay đang áp dụng sẽ được tạo ra
- Có thể ghi PDF đã sửa ra đĩa bằng
writefile
>>> writefile(doc180, "rotated_doc.pdf")
- Tệp kết quả có dạng một phần mới được thêm vào sau nội dung gốc, và có thể hoàn tác thay đổi bằng cách cắt bỏ phần này
Trạng thái hiện tại và chính sách đóng góp
- Dự án đang trong quá trình phát triển và là phần mềm chất lượng beta
- API có thể thay đổi bất cứ lúc nào
- Danh sách việc cần làm tiếp theo bao gồm các mục sau
- cắt và ghép trang
- nén không mất dữ liệu
- thêm nhiều bộ lọc hơn
- cải thiện trích xuất văn bản
- tăng cường trích xuất văn bản bằng phát hiện bố cục
- PDFSyntax dùng giấy phép MIT
- Hiện tại chưa nhận đóng góp từ bên ngoài
- đây là một dự án cá nhân và thời gian có hạn
- tác giả dự định tập trung trước vào lộ trình tính năng mới và tái cấu trúc, rồi sẽ nhận đóng góp khi đã ổn định
1 bình luận
Ý kiến trên Hacker News
Từ lâu trước đây, tôi từng được giao việc trích xuất dữ liệu từ nhiều tệp PDF và đã tạo một công cụ trực quan hóa cách bố trí ký tự trên trang cùng hộp bao của mọi phần tử
Cuối cùng dự án thất bại hoàn toàn, và một vài người đã nổi giận vì không đạt được kết quả như kỳ vọng
Nếu là bây giờ, tôi chắc chắn 100% sẽ đi theo hướng tận dụng năng lực của LLM để lấy dữ liệu ra khỏi PDF. Khi đó không có lựa chọn như vậy
Tùy kỳ vọng, OCR có thể đưa bạn đi khá xa, nhưng theo kinh nghiệm của tôi thì lúc nào cũng thiếu đúng phần cần thiết
Tôi đã thấy nhiều trường hợp văn bản được tạo từ glyph phông chữ tùy chỉnh không có ánh xạ kiểu ASCII, hoặc như rất thường gặp trong bản xuất từ CAD, hình dạng chữ được vẽ bằng các đường nét
Khi đó không có văn bản nhận diện được để trích xuất, nên rốt cuộc vẫn phải kiểm tra lại trang bằng OCR
Chúng tôi đang xây dựng từ đầu một pipeline xử lý PDF dựa trên LLM và mô hình thị giác-ngôn ngữ tại https://runtrellis.com/, và đã thấy độ chính xác gần 100% ngay cả với các PDF khó
Điểm cốt lõi là dùng engine dựa trên quy tắc cùng dữ liệu tham chiếu để kiểm chứng chéo kết quả
Khá hay. Nếu chỗ làm cũ của tôi có cái này thì chắc tôi đã dùng rất nhiều
Lý tưởng nhất là giống https://lapo.it/asn1js/, chỉ cần thả tệp vào là mọi xử lý đều diễn ra cục bộ
Nhờ “đặc quyền” phải xử lý mã trích xuất dữ liệu từ PDF, tôi đã dùng bản miễn phí của iText RUPS để debug PDF một thời gian
Chức năng soi nội bộ ở đây trông mạnh hơn, nên có lẽ sẽ rất tuyệt. Tôi định thử chạy xem
Tôi nhớ trên GitHub từng có một dự án tương tự. Nó có thể trực quan hóa dữ liệu nhị phân bất kỳ theo một schema cho trước, và hình như có ví dụ TCP/IP
Trông rất phù hợp cho vai trò đó, nhưng ở dự án gần nhất tôi cũng cần serialization, nên đã không dùng
https://github.com/HexFiend/HexFiend/blob/master/templates/T...
Thú vị là khi tôi thử các bộ mô tả định dạng tệp như vậy, tôi lấy PDF làm “Hello World”, vì đặc tả PDF quá kỳ quặc
Nếu ngôn ngữ mô tả có thể biểu diễn chính xác layout của PDF thì có thể xem là nó được thiết kế tốt
Cho đến nay tôi không gặp may lắm, trừ những thứ có thể thoát khỏi chế độ khai báo và “sau đó chạy đoạn mã này”
Cái này hẳn cũng tiện cho forensics và tìm watermark
Trông ổn
Sẽ tốt hơn nếu mọi byte của PDF đều được hiển thị. Có vẻ như
endobjvàxrefkhông xuất hiệnSẽ rất tuyệt nếu cái này ra dưới dạng thư viện cho trình duyệt. Chỉ cần kéo thả tệp vào rồi xem bên trong. Dù sao cũng rất ấn tượng
Làm tốt lắm. Đây là một công cụ xem trước bảo mật rất hữu ích. PDF là thứ phiền toái
Tôi tò mò liệu công cụ UI đảm nhiệm phần trực quan hóa có phải là thư viện không
Tôi rất thích kiểu UI này, và cũng muốn dùng nó để phân rã và debug byte stream video
Sửa: hóa ra thực tế khá đơn giản. Tận dụng CSS rất tốt! https://github.com/desgeeko/pdfsyntax/blob/main/docs/simple_...
Cùng mạch này, tại sao PDF vẫn chưa bị thay thế nhỉ? Có XPS, DjVu, XHTML(EPUB), nhưng tất cả dường như nhắm tới các use case khác nhau, chẳng hạn như tệp HTML được đóng gói
Thứ tôi muốn là một định dạng tài liệu đơn giản có thể nhúng các tệp khác và metadata mà không có sự cồng kềnh của Adobe
Nó phải cho phép đặt hyperlink trong trang, không làm tràn văn bản khi thay đổi cỡ chữ, và có thể in ra một cách nhất quán
PDF không phải là định dạng dữ liệu mà là định dạng mô tả trang, nên mọi quyết định đều xuất phát từ nhu cầu có thể in cùng một “trang” dù dùng hệ điều hành, phần mềm, máy in và kích thước giấy chính xác khác nhau
Lý do chính PDF tồn tại lâu có lẽ là vì nhiều thứ vẫn vận hành trên mô hình tài liệu, tức cách nhìn “tài liệu” như “một tập gồm nhiều tờ giấy”
Từ bản tóm tắt sau khám ở bệnh viện đến giấy đăng ký xe, chúng đều đã có một cách trình bày thị giác cụ thể được chọn để trông hợp lý và khớp chính xác trên giấy
HTML, chẳng hạn một định dạng độc lập có nhúng ảnh và CSS dưới dạng data URL, hoặc ePub, có thể tốt hơn ở hầu hết khía cạnh
Nhưng mục tiêu quá khác nhau, nên nếu hôm nay bạn thuyết phục những người tạo PDF chuyển sang đó, bạn sẽ nghe họ phàn nàn rằng nội dung trông hơi khác trên từng thiết bị, thậm chí ngắt trang cũng khác tùy cấu hình
Một điều thú vị liên quan là ngay cả Google Docs, dù có lẽ chưa đến một nửa tài liệu được in hoặc chuyển thành PDF, vẫn mặc định là chế độ trang chứ không phải chế độ “không trang”
Chế độ “không trang” hữu ích hơn nhiều: giống trang web thông thường, nó vừa theo cửa sổ và cuộn vô hạn trên một bề mặt liên tục
Yêu cầu “không để văn bản bị tràn” kéo theo rất nhiều chi tiết
Trong PDF, mọi chữ cái, ký tự, glyph của văn bản đều có thể có vị trí x,y chính xác trên trang, đôi khi cả ngoài trang
Vì vậy có thể bố trí chính xác nội dung bất kể xung quanh có gì. Ứng dụng dùng PDF phải đặt các mục đúng vị trí và triển khai ngắt dòng theo ký tự hoặc từ
XPS là thứ gần nhất với việc tái triển khai PDF, nhưng Microsoft không nhận được đủ ủng hộ từ các bên khác nên nó lặng lẽ biến mất
PostScript tuy khác thường nhưng là một ngôn ngữ lập trình đầy đủ, còn PDF thì không. Tức là nó không Turing-complete
PDF không hỗ trợ luồng điều khiển, nên cả những thứ có thể biểu diễn bằng một vòng lặp đơn giản trong PostScript cũng phải được trải phẳng trong PDF thành một chuỗi khai báo hoặc biểu thức đơn giản
Ưu điểm là để render PDF không cần một trình thông dịch chương trình đầy đủ