2 ポイント 投稿者 GN⁺ 2025-02-11 | 1件のコメント | WhatsAppで共有
  • PDFSyntaxはPDF Specificationの第7章「Syntax」に焦点を当てたPythonライブラリで、PDFファイルの内部ドキュメント構造をバイト単位まで検査・変換するために使われる
  • 純粋なPythonでゼロから書かれた依存関係のない軽量ライブラリであり、シンプルさと不変性を重視している
  • 基本的な編集方式は、PDF仕様が許容する非破壊のインクリメンタルアップデートで、元ファイルの末尾に変更セクションを追加し、巻き戻しや単一リビジョンへの統合が可能
  • CLIはoverviewdisasmtextfontsbrowseなどを提供し、browseはPDFソースを見やすく出力し、ハイパーリンク付きの静的HTMLで内部構造を探索できるようにする
  • 現在はベータ品質の作業中プロジェクトで、APIはいつでも変更される可能性があり、MITライセンスだがまだ外部からの貢献は受け付けていない

PDF内部構造の検査と変換

  • PDFSyntaxはPDFファイルの内部構造を検査・変換するためのPythonライブラリ
  • Portable Document Format(PDF)Specificationの第7章「Syntax」に焦点を当てている
  • ドキュメント構造の管理をバイトレベルまで実装しており、次のような用途に使われる
    • メタデータへのアクセス
    • ページの回転
    • PDFの読み書き操作
    • 内部オブジェクトへのアクセスと操作

設計方針

  • 内部関数はPDFの読み書き操作向けのAPIツールキットとして公開される
  • 一部の機能はターミナルやブラウザで使えるようにCLIとしても提供される
  • ライブラリは純粋なPythonで書かれており、外部依存関係はない
  • シンプルさと不変性を重視している
  • 基本的な編集方式は、元ファイルを直接上書きせず、元ファイルの末尾に変更内容を追加するインクリメンタルアップデート
    • 必要に応じてリビジョンを巻き戻せる
    • すべてのリビジョンを1つにまとめることもできる

インストールとCLIの使用

  • PyPIからインストールできる
pip install pdfsyntax
  • CLIの基本的な使用形式は次のとおり
pdfsyntax COMMAND FILE
  • ソースからインストールした場合は、より長い形式で実行できる
python3 -m pdfsyntax COMMAND FILE
  • 迅速なPDF解析のための主なコマンドは次のとおり
    • overview: 構造とメタデータに関するテキスト情報を出力
    • disasm: ファイル構造のダンプをターミナルに出力
    • text: スキャンのように空間配置を保った抽出テキストを出力
    • fonts: 使用されているフォント一覧を出力
    • browse: PDFソースを見やすく出力し、ハイパーリンクを追加した静的HTMLを生成して内部構造の探索を支援

APIの使い方

  • PDFSyntaxは大部分がシンプルな関数で構成されている
  • readfileでPDFを読み込み、metadataでメタデータをPythonのdict形式で取得できる
>>> from pdfsyntax import readfile, metadata
>>> doc = readfile("samples/simple_text_string.pdf")
>>> metadata(doc)
  • Docオブジェクトは、ドキュメントの内部状態を保存するほぼ唯一の専用クラス
    • 元ファイルからキャッシュまたはメモ化されたコンテンツ
    • コンテンツの追加・修正・削除の変更内容
    • インクリメンタルアップデートとして追跡される修正履歴
  • 同じmetadata関数はDocオブジェクトのメソッドとしても使用できる
>>> doc.metadata()
  • get_objectupdate_objectのような低レベル関数で、ドキュメント内部オブジェクトに直接アクセスして操作できる
  • rotateのような高レベル関数も提供される
>>> from pdfsyntax import rotate, writefile
>>> doc180 = rotate(doc, 180)
  • 回転の例では元のオブジェクトは変更されず、進行中の向き変更を含む新しいオブジェクトが作られる
  • 修正されたPDFはwritefileでディスクに書き込める
>>> writefile(doc180, "rotated_doc.pdf")
  • 結果ファイルは元のコンテンツの後ろに新しいセクションが追加された形で、このセクションを切り取れば変更を元に戻せる

現在の状況と貢献ポリシー

  • プロジェクトは作業中で、ベータ品質のソフトウェア
  • APIはいつでも変更される可能性がある
  • 今後の作業リストには以下の項目が含まれる
    • ページの切り抜きと結合
    • ロスレス圧縮
    • より多くのフィルター
    • テキスト抽出の改善
    • レイアウト検出によるテキスト抽出の強化
  • PDFSyntaxはMITライセンス
  • 現在は外部からの貢献を受け付けていない
    • 個人プロジェクトであり、時間が限られている
    • 新機能とリファクタリングのロードマップにまず集中し、安定化した後に貢献を受け付ける予定

1件のコメント

 
GN⁺ 2025-02-11
Hacker Newsのコメント
  • かなり前に複数のPDFからデータを抽出する仕事を任されて、ページ上の文字配置とすべての要素のバウンディングボックスを可視化するツールを作ったことがある
    結局そのプロジェクトは完全に失敗で、期待した結果が出ず、何人かを怒らせることになった
    今ならPDFからデータを取り出すのにLLMの能力を使う方向へ100%振ると思う。当時はそんな選択肢がなかった

    • 任意のPDFからデータをパースするのは、呪われた任務に近い。PDFには画像も入れられるので、むしろJPEGを直接相手にするのに近い
      期待値次第ではOCRでかなりのところまで行けるが、私の経験ではいつも必要なところにほんの少し届かない
    • LLMはページから抽出した文字の順序を整えるのには役立つかもしれないが、実際の内容を取り出すのは依然として難しい
      何度も見た例として、テキストの文字がASCIIのような対応表を持たないカスタムフォントのグリフになっていたり、CADの出力物で特によくあるように文字の形が線で描かれていたりする
      そうなると抽出できる識別可能なテキストがなく、結局ページをOCRで再確認するしかない
    • 前の職場でも似たようなことをやったが、ルールベースのパース方式はちゃんと作るのが本当に難しく、エッジケースで頻繁に失敗した
      私たちは https://runtrellis.com/ で、LLMと視覚言語モデルをベースにしたPDF処理パイプラインをゼロから構築しており、厄介なPDFでもほぼ100%に近い精度を確認している
      核心は、ルールベースのエンジンと参照データを組み合わせて結果をクロスチェックすることだ
    • かなり前にPDFから2D CAD図面を抽出して完全な3Dに変換する仕事をしたことがあるが、かなり面白かった
    • pdfjsがそうした作業を一通りやってくれて、かなり堅牢だ。最近、10年分の銀行明細から表データを抽出するのに使った
  • かなりクールだ。前の職場にこれがあったらかなり使っていたと思う
    理想を言えば、https://lapo.it/asn1js/ のようにファイルをドロップすればすべての処理をローカルでやってくれる形だとうれしい

  • PDFからデータを抽出するコードを扱うという「特権」のおかげで、しばらくの間、PDFのデバッグにはiText RUPSの無料版を使ってきた
    ここの内部検査機能のほうがより強力そうなので、とてもよさそうだ。試してみるつもり

  • GitHubに似たようなプロジェクトがあったのを覚えている。与えられたスキーマで任意のバイナリデータを可視化できて、TCP/IPの例があった気がする

    • https://kaitai.io/ かもしれない?
      その用途にはとても良さそうだったが、前回のプロジェクトではシリアライズも必要だったので使わなかった
    • HexFiendにもバイナリデータ可視化用のテンプレート文法がある。Tclベースだ
      https://github.com/HexFiend/HexFiend/blob/master/templates/T...
    • この文脈で「任意の」という言葉は注意が必要だ
      面白いことに、私はそういうファイル形式記述子を試すとき、PDFを「Hello World」にしている。PDF仕様があまりにも奇妙だからだ
      記述言語がPDFのレイアウトを正確に表現できるなら、間違いなくうまく設計されていると言える
      これまでのところ、宣言的モードから抜け出して「次にこのコードを実行する」とできるもの以外では、あまりうまくいった試しがない
  • これはフォレンジックや透かし探しにも便利そうだ

    • 面白そう。詳しくないので教えてほしいのだけれど、これをどうやって透かし検出に使えるの? 同じ方法で署名も検出できるだろうか?
  • よさそうだ
    PDFのすべてのバイトが表示されるとさらにいい。endobjxref が見えていないようだ

    • その通り、すぐ直します
  • これがブラウザライブラリとして出てくれたら本当にうれしい。ファイルをドラッグ&ドロップして中を見られれば十分。それでも十分に印象的だ

    • ブラウザ拡張のことですか? 失礼に聞こえないといいのだけれど、きちんと理解できているか確認したいだけです
  • よくできている。とても有用なセキュリティプレビュー用ツールだ。PDFは厄介だ

  • 可視化を担当しているUIツールがライブラリなのか気になる
    UIの形式が本当に気に入ったので、動画のバイトストリームを分解してデバッグするのにも使いたい
    修正: 実際にはかなりシンプルなんだね。CSSをうまく活用している! https://github.com/desgeeko/pdfsyntax/blob/main/docs/simple_...

    • その通り。私はシンプルさを重視していて、基本的なHTMLとCSSが提供するインタラクションで自分のユースケースには十分なんだ :)
  • 似た文脈で、なぜPDFはいまだに置き換えられていないのだろう? XPS、DjVu、XHTML(EPUB)があるが、どれも別々のユースケース、たとえばパッケージ化されたHTMLファイルのようなものを狙っているように見える
    私が欲しいのは、Adobeの重たさなしに他のファイルやメタデータを埋め込めるシンプルな文書形式
    ページ内でハイパーリンクを張れ、文字サイズを変えてもテキストがあふれず、一貫して印刷できるべきだ

    • PDFが編集、デバイス上での読書、表現情報ではなく意味情報の抽出にとって「不幸な」形式になったのは、Adobeの罪や重厚長大さのせいではないと思う
      PDFはデータ形式ではなくページ記述形式であり、異なるOS・ソフトウェア・プリンタ・正確な用紙サイズを使っても同じ「ページ」を印刷できるようにする必要性から、あらゆる決定が生まれている
      PDFが長く生き残っている主な理由は、多くのものが文書パラダイム、つまり「文書」を「何枚かの紙の束」とみなす考え方の上で成り立っているからだろう
      病院の診療後サマリーから自動車登録書類まで、すでに紙の上でもっともらしく正確に収まるよう選ばれた特定の視覚表現を持っている
      HTML、たとえば画像やCSSをデータURLとして埋め込んで自己完結させた形式やePubのほうが、多くの点で優れているかもしれない
      しかし目指しているものがあまりに違うので、今日PDFを作っている人たちにそうした移行を勧めに行けば、デバイスごとに見え方が少しずつ違い、設定次第では改ページまで変わるという不満を聞くことになるだろう
      関連して興味深いのは、Google Docsでさえ印刷やPDF化されるケースは半分よりずっと少なそうなのに、デフォルトがページなしモードではなくページモードだということだ
      「ページなし」モードは通常のウェブページのようにウィンドウに合わせて、ひとつの連続した面を無限にスクロールしていく形なので、ずっと便利だ
    • ユースケースが違う
      「テキストがあふれないように」という要件には多くの細部がついてくる
      PDFではテキストのすべての文字・キャラクタ・グリフがページ上、時にはページ外の正確なx,y位置を持てる
      だから周囲に何があってもコンテンツを精密配置できる。PDFを使うアプリケーション側が項目を正しく配置し、文字または単語の折り返しを実装しなければならない
      XPSはPDFの再実装にもっとも近かったが、Microsoftが他の主体から十分な支持を得られず、静かに消えていった
    • 最近まで知らなかったPDFの面白い点は、PDFがPostScriptの部分集合で、それがある程度重さの原因になっているということだ
      PostScriptは風変わりではあっても完全なプログラミング言語だが、PDFはそうではない。つまりチューリング完全ではない
      PDFは制御フローをサポートしないので、PostScriptなら単純なループで表現できるものでも、PDFでは展開して単純な宣言や式の並びとして保存しなければならない
      利点は、PDFをレンダリングするのに完全なプログラムインタプリタが不要なことだ
    • こういう話が始まるとすぐにLaTeX陣営が現れて、標準に意味のある形で貢献できる人たちの議論がそれに阻まれてしまう
    • ひとつの理由は、他の形式はどれもそのままでは商業印刷に向いていないことだ