MAGAZINE

ルーターマガジン

データ/フォーマット

inkscapeコマンドでDOM構造解析が可能なSVGにPDFを変換する

2025.08.29
Pocket

クラウド化が叫ばれるようになって久しい昨今ですが、クラウド化が進めば進むほど改竄が困難なPDFファイルが抜擢されるシチュエーションが浮き彫りになっています。 rooterはそのようなPDF内の情報を対象としたスクレイピングも提供しております。今回は、PDF内の情報を解析、取得するための前処理として、DOMの構造解析が可能なSVGにPDFを変換する方法を紹介します。

CLIのPDFからのSVG変換だとpopplerのライブラリに含まれるpdf2svgコマンドがありますが、これはPDF内のテキストを保持してくれず図形に変換してしまいます。今回は、PDF内のテキストを保持した状態でSVGに変換してくれるinkscapeコマンドを紹介します。

本記事の執筆にあたっては、Ubuntu 24.04, inkscape version 1.4.2で検証しています。

▼目次

  1. inkscapeコマンドとは
  2. inkscapeコマンドのインストールの仕方
  3. --export-filename, --export-typeで指定のファイル形式に変換する
  4. inscapeを用いたpdf2svgのデフォルトの挙動
  5. --pdf-font-strategy=keepで文字列をテキストノードとして保持する
  6. --pdf-font-strategyのオプション一覧

inkscapeコマンドとは

inkscapeとはオープンソースで開発されているベクター画像編集ソフトウェアです。ベクター画像の作成、編集、PDFファイルのPNG,SVGファイルへの変換が可能です。このソフトウェアはGUIで動作するものですが、CLIで動くコマンドも公開されています。今回はこれを用いてPDFをSVGに変換します。

inkscapeコマンドのインストールの仕方

基本的には 公式の手順 にしたがってインストールすればOKです。OSごとのインストールと実行の手順を以下に書きます。

MacOSの場合

  1. https://inkscape.org/release/ から.dmgファイルをダウンロード、インストールする
  2. インストールしたInkscape.app内の、Contents/MacOS/inkscapeを実行する
    % /Applications/Inkscape.app/Contents/MacOS/inkscape --version
    Inkscape 1.4.2 (ebf0e940, 2025-05-08)

Windowsの場合

  1. https://inkscape.org/release/ から.msiファイルをダウンロード、インストールする
  2. inkscape.exeと同じフォルダに同梱されているinkscape.comを実行する
    PS> & 'C:\Program Files\Inkscape\bin\inkscape.com' --version
    Inkscape 1.4.2 (f4327f4, 2025-05-13)

Ubuntuの場合

  1. 以下を実行して、aptのリポジトリ追加、インストールをする
    sudo add-apt-repository universe
    sudo add-apt-repository ppa:inkscape.dev/stable
    sudo apt-get update
    sudo apt install inkscape
  2. aptによってPATHまで通されるため、コマンドとして実行可能
    # inkscape --version
    Inkscape 1.3.2 (1:1.3.2+202311252150+091e20ef0f)

Ubuntuの場合は、aptのリポジトリ追加をしないと古いバージョンのinkscapeがインストールされます。古いinkscapeだと一部変換できないPDFがあったりするので、新しいバージョンにしておくのが無難です。

--export-filename, --export-typeで指定のファイル形式に変換する

--export-typeオプションは出力先のファイル形式を指定します。指定できるものはsvg、 png、pdf、emf、などがあります。

inkscape sample.pdf --export-type=svg

--export-filenameオプションは出力先のファイル名を指定します。ファイル名の拡張子から出力先のファイル形式を判別してくれます。

inkscape sample.pdf --export-filename=sample.svg

inscapeを用いたpdf2svgのデフォルトの挙動

ここからは以下のような1つの表からなるシンプルなpdfを使用して進めます。これをsimple.pdfとします。

このpdfを以下のコマンドでsvg画像に変更します。

inkscape simple.pdf --export-filename=simple_font_default.svg

ファイルへ出力されたsvgのコードを確認してみると、文字列は以下のようなpathタグでd属性を用いて描画する図形として表現されています。

...中略
<path
   id="path7"
   d="m 1.7799413,-0.8575595 h 9.4843747 v 0.984375 H 1.7799413 Z m 0.03125,-4.640625 h 9.4531247 v 0.96875 H 1.8111913 Z M 1.2643163,-10.01381 H 11.795566 V 0.9236905 h -1 v -10 H 2.2174413 v 10 h -0.953125 z m 4.65625,0.4375005 h 1 v 9.234375 h -1 z m 8.3281247,0.984375 h 10.46875 v 6.109375 h -1 v -5.15625 h -8.5 v 5.21875 h -0.96875 z m 0.515625,4.40625 h 9.546875 v 0.96875 h -9.546875 z m 4.1875,-6.7343755 h 1.03125 V 1.0330655 h -1.03125 z m 0,0"
   style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
   aria-label="⽥中"
   transform="translate(514.33334,89.255997)"
   clip-path="url(#clipPath8)" />
...後略

aria-label属性に"田中"という文字はありますが、これはSVGとしての描画には関係ないため、実際にこのSVGを画像として開いてもこの文字を選択したりコピーすることは出来ません。inkscapeのバージョンによっては文字は画像として描画されて、SVGファイル内でテキストとして保持されない場合もあります。

これらを丸っと解決するオプションが --pdf-font-strategy=keep です。

--pdf-font-strategy=keepで文字列をテキストノードとして保持する

ここでsvgファイルへ出力の際に、--pdf-font-strategy=keep オプションをつけて変換します。

inkscape --pdf-font-strategy=keep simple.pdf --export-filename=simple_font_keep.svg

文字列は以下のようなタグのテキストノードとして表現されています。

<text
   id="text5"
   xml:space="preserve"
   transform="translate(514.33334,89.255997)"
   clip-path="url(#clipPath6)"><tspan
   id="tspan5"
   style="font-variant:normal;font-weight:normal;font-size:13px;font-family:NotoSansJP-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
   x="0"
   y="0">⽥中</tspan></text>

textタグで描写されており、フォントのサイズ、フォントの種類が明示されています。実際にこのテキストノードを参照してSVG画像が描画されるので、SVG画像からのテキストの選択、コピーができるようになっています。

--pdf-font-strategyのオプション一覧

--pdf-font-strategyは、pdfのフォントを解析し出力におけるテキストの扱い方を指定できるオプションです。

ヘルプによると↓のように6つのオプションを指定できるようです。

# inkscape --help | grep font
--pdf-font-strategy=STRATEGY               How fonts are parsed in the internal PDF importer [draw-missing|draw-all|delete-missing|delete-all|substitute|keep]

しかし各オプションの仕様の記載がどこにも無かったため、gitlabのコード や、実際に実行した時に挙動を試しつつ、下記表にまとめました。

各オプションにおけるテキストの扱い

オプションの値 実行環境内にPDFと同一のフォントが有るか無いか
有る場合 無い場合
keep PDFのフォントで出力 PDFのフォントで出力
substitute PDFのフォントで出力 実行環境内の最も近いフォントで出力
draw-missing
(default ※)
PDFのフォントで出力 pathタグを用いた図形として出力
draw-all pathタグを用いた図形として出力 pathタグを用いた図形として出力
delete-missing PDFのフォントで出力 削除
delete-all 削除 削除

※ defaultについて、gitlabのコードよりデフォルトではdraw-missingのオプションと同じ出力であると考えられます。実際に実行した際に変換後のsvg画像も、デフォルトとdraw-missingで一致していました。

画像としての見え方を気にせずSVG内のDOMを解析したい場合は、最大限PDFの情報が保持されるkeepオプションが適切です。

終わりに

PDFファイルに対するアプローチの仕方は、今回紹介したSVG変換以外にもpopplerや画像処理、PDFのバイナリ解析など様々な選択肢があります。弊社では、PDFも対象コンテンツとして情報収集するAIクローラーや、弊社独自のPDF解析エンジンを用いたPDFスクレイピングを提供しております。

PDFのデータ収集にお困りの方は、問い合わせフォームよりお気軽にご相談ください。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから