2 điểm bởi GN⁺ 2025-02-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

  • Có thể cài đặt từ PyPI
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

 
GN⁺ 2025-02-11
Ý 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

    • Phân tích dữ liệu từ PDF bất kỳ gần như là một nhiệm vụ bị nguyền rủa. PDF cũng có thể chứa hình ảnh, nên cũng giống như nhắm thẳng vào JPEG 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
    • LLM có thể giúp sắp xếp đúng thứ tự các ký tự trích xuất từ trang, nhưng việc lấy được nội dung thực tế vẫn khó
      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
    • Ở công ty cũ tôi cũng từng gặp việc tương tự; cách phân tích dựa trên quy tắc thật sự rất khó làm cho đúng và thường thất bại ở các edge case
      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ả
    • Từ lâu trước đây tôi từng làm việc trích xuất bản vẽ CAD 2D từ PDF rồi chuyển thành 3D hoàn chỉnh; khá thú vị
    • pdfjs làm được tất cả những việc đó và khá vững. Gần đây tôi đã dùng nó để trích xuất dữ liệu bảng từ 10 năm sao kê ngân hàng
  • 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

    • Có thể là https://kaitai.io/ chăng?
      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
    • HexFiend cũng có cú pháp template để trực quan hóa dữ liệu nhị phân. Dựa trên Tcl
      https://github.com/HexFiend/HexFiend/blob/master/templates/T...
    • Trong ngữ cảnh này cần cẩn thận với từ “bất kỳ”
      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 thú vị. Tôi không rành lắm, nhưng có thể dùng nó để phát hiện watermark như thế nào? Có thể phát hiện chữ ký bằng cùng cách đó không?
  • Trông ổn
    Sẽ tốt hơn nếu mọi byte của PDF đều được hiển thị. Có vẻ như endobjxref không xuất hiện

    • Đúng vậy, tôi sẽ sửa sớm
  • Sẽ 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

    • Ý bạn là tiện ích mở rộng trình duyệt à? Tôi không có ý thô lỗ, chỉ muốn chắc là mình hiểu đú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_...

    • Đúng vậy. Tôi coi trọng sự đơn giản, và mức tương tác mà HTML và CSS cơ bản cung cấp là đủ cho use case của tôi :)
  • 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

    • Tôi không nghĩ lý do PDF trở thành một định dạng “bất hạnh” cho việc chỉnh sửa, đọc trên thiết bị, và trích xuất thông tin ngữ nghĩa thay vì thông tin trình bày là do lỗi hay sự cồng kềnh của Adobe
      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
    • Use case khác nhau
      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
    • Một điểm thú vị về PDF mà mãi gần đây tôi mới biết là PDF là tập con của PostScript, và điều đó phần nào là nguyên nhân khiến nó nặng nề
      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 đủ
    • Cứ cuộc trò chuyện kiểu này bắt đầu là phe LaTeX xuất hiện, rồi tất cả những ai có thể đóng góp có ý nghĩa cho tiêu chuẩn đều bị mắc kẹt trong cuộc tranh luận đó
    • Một lý do là trong các định dạng khác, không định dạng nào tự thân phù hợp với in ấn thương mại