PDFを変換すると構造が失われる理由と、その対処

最終確認

PDFからMarkdownへの変換ツールは、本ツールも含め、ときに雑に見える結果を出します。見出しが段落に降格し、表が言葉の壁につぶれ、二段組みのページが横一直線に読まれて文が入り混じる。

これは雑さではありません。PDFファイルが実際に何を含んでいるかから導かれる帰結です。そしてそれを知れば、エラーは予測可能になります。つまり、手元のどの文書がきれいに変換され、どれがそうでないかを、事前に見分けられるようになります。

読了 7 分

PDFの中身は実際には何か

ワープロ文書は木構造です。この行は見出しレベル2である、これらの段落はその節に属する、これらのセルは3列の表を成す、と記録しています。見た目は表示時にその構造から導かれます。

PDFはその逆です。描画命令の集合であり、この字形を、このフォントで、この大きさで、このページのこの座標に置け、と指示します。そのレイアウトを生んだ構造は保存されません。座標の計算に使われたあと、破棄されています。

これは形式の欠陥ではありません。PDFは1993年に、どの機器でもどのプリンタでも文書が同一に見えることを保証する目的で設計されました。それを保証する方法は、見た目を厳密に指定し、再計算の余地を残さないことです。目的は完全に達成されました。代償として、PDFはどの文字がどこにあるかを知っており、それが何を意味するかは何も知りません。

したがってPDFをMarkdownに変換することは抽出ではありません。推論です。幾何情報を逆に読み、どんな構造ならこの配置を生んだかを推し量る。優れた変換器はうまく推測します。推測以上のことはどの変換器にもできません。答えが本当にファイルの中にないからです。

唯一の例外: タグ付きPDF

タグ付きPDFは、追加の構造ツリーを持ちます。スクリーンリーダーが見出しを読み上げ、表のセルを順に読めるよう、アクセシビリティのために付与されるものです。これが存在し、かつ正しければ、推測の大半は不要になります。

実際には、その両方が揃うことは稀です。タグ付けは任意であり、大半のPDF生成ソフトは付与しません。付与するものの多くも、見た目のレイアウトと矛盾するタグを出力します。すべての段落が見出しとして印されていたり、表が段落の連なりとしてタグ付けされていたりします。誤ったタグを信じる変換器は、タグを無視する変換器より悪い結果を出すことになります。

PDFの生成過程を自分で制御でき、変換品質を重視するなら、WordやLibreOfficeから正しくタグ付けしたPDFを書き出すことが最も有効な一手です。外部から届く文書を変換するのであれば、タグは無いものと考えてください。

幾何情報から構造をどう推論するか

空間的に処理する変換器の規則はおおむね共通で、知っておく値打ちがあります。規則の一つひとつが、そのまま失敗の形を意味するからです。

まず単位を定めます。本文の文字高 — 文書内で最も頻度の高いフォント高を、その大きさで組まれた文字数で重み付けしたもの — が物差しになります。おかげで、文書が9ptで組まれていても14ptで組まれていても、規則は同じように働きます。

次に、すべてをその単位で測ります。ベースラインを共有する文字列は同一行。わずかな縦の間隔で隔てられた行は同一段落で、間隔が大きければ新しい段落が始まります。本文よりはっきり大きく組まれた文字列は見出しで、どれだけ大きいかがレベルを決めます。断片が共通の水平位置に揃う行が並べば表です。ページ中央付近の縦に長い空白帯は二段組みを意味し、読み順は一方の段を下り、次にもう一方を下る必要があります。

本ツールはおおむね次のしきい値を用います。いずれも本文文字高の倍数です。

H1本文文字高の1.8倍超
H2本文文字高の1.4倍超
H3本文文字高の1.2倍超
同一行ベースラインの差が本文高の±0.35以内
同一段落縦の間隔が本文高の1.5倍まで
2つ以上の共通x座標に揃う行が2行以上連続

あらゆる失敗は規則から導かれる

先の一覧を「前提の一覧」として読み直せば、エラーは不可解ではなくなります。

  • 大きさを変えず太さや色だけで見出しを表す文書は、大きさのしきい値からは見えません。11ptの本文に11ptの太字で見出しを立てた文書には、幾何的には見出しが一つも存在しません。
  • セル結合のある表は共通位置の判定を壊します。結合セルは他のどの行も使わない位置を占めるからです。行が揃わなくなり、そのブロックは表として認識されなくなります。
  • 内容が2行に折り返すセルは、片方に穴の空いた2行のように見えます。
  • 行間が広いと、同じ段落の行が段落区切りのしきい値を越えて分割されることがあります。段落間が詰まっていれば、逆に連結されることがあります。
  • 三段組み、幅の異なる二段組み、全幅の図で分断された段組み — いずれもページ中央の空白による判定を破ります。
  • 画像として置かれた文字 — 文字を含むロゴ、ラベル付きの図、スキャンされたページ — には字形が一切ありません。配置すべきものも、読むべきものもありません。

きれいに変換される文書

共通する特徴は一つです。ワープロで作られた一段組みの文書で、見出しが本文よりはっきり大きく、表は単純な矩形で、文字の画像ではなく本物の文字が入っていること。

これは大半の報告書、論文、マニュアル、学位論文、契約書、議事録、社内文書に当てはまります。つまり人が変換するものの大半です。雑誌、パンフレット、インフォグラフィックを備えた年次報告書、申込書、複雑な表を含む請求書、そしてスキャン文書には当てはまりません。

よく変換できるワープロ製の報告書、論文、マニュアル、契約書、議事録
部分的に変換できる二段組み・脚注・図を含む学術PDF
うまく変換できない雑誌、パンフレット、申込書、請求書、デザインされた紙面
変換できないスキャンと写真。文字認識を通すまでは不可

難しい文書からよい結果を得るには

実際に効くものを、効果の大きい順におおよそ並べます。

  • PDFを作り直せるなら、タグ付きで書き出してください。さらに良いのは、PDFを飛ばして元の文書を変換することです。Wordファイルから作ったPDFの変換は、そのWordファイルの変換より常に劣ります。
  • レイアウトが混在する文書は分割してください。本文10ページと表4ページを別々に変換するほうが、両方をこなす一回の変換と格闘するより確実です。
  • 手強い表は単独で抜き出してください。60ページの文書の中では失敗する表も、ページ上にそれだけしかなければ正しく変換されることがよくあります。
  • 太さで見出しを表す文書では、見出しを手作業で直す前提でいてください。検索と置換の一往復であって、打ち直しの作業ではありません。
  • スキャンにはまず文字認識を掛けてください。近道はありません。文字として符号化されなかったものを見つけられるパーサは存在しません。

結果は必ず読む

本当に時間を奪う失敗は、目に見えて壊れた変換ではありません。脚注、表の最終行、検出された段の外に落ちた一行 — そうしたものを黙って落とし、穴の空いたまま清潔でもっともらしいMarkdownを出すほうです。

頼りにする前に、変換後のMarkdownを原本と突き合わせてざっと通してください。とくに表、数値、各ページの末尾数行に注意を払ってください。静かな欠落はそこに集まります。