LoginSignup
3
4

More than 1 year has passed since last update.

LaTeX de 余白のないPDF を作って画像に変換 (2)

Last updated at Posted at 2021-05-17

LaTeX de 余白のない PDF を作って画像に変換 (2)

今回は PDF を画像に変換したい.

PDF からこれらの画像を生成するもっとも安直な方法は,以下のようなコンバータを利用して変換することにだが,いちいちアクセスしたりするのは面倒だ.出来るだけローカルで完成させたい.
また,複数の画像を作りたい場合にはスクリーンショットも面倒くさい.

pdftocairo を利用しよう.これは Poppler という PDF ライブラリの一つになる.TeX Live (Windows) にも収録されている.

このコマンドラインツールは macOS 用の TeX Live では利用できないようだ.上の TeX Wiki を参照して導入すると良いだろう.


お知らせ
: 本記事は以下の記事の続きに相当している.下の記事では余白のない PDF を TeX で作成する方法を解説している.

LaTeX de 余白のない PDF を作って画像に変換 (1) - Qiita

○ pdftocairo を使う

詳しい使い方は $ texdoc pdftocairo とするか $ pdftocairo --help とすれば見ることが出来る.

今回はラスターの PNG (Portable Network Graphics) とベクターの SVG (Scalable Vector Graphics) に変換することを想定したい.

■ PNG に変換

コマンドラインでは以下のように利用する.PNG に変換してみる.

$ pdftocairo -png -r 300 test.pdf

デフォルトでは縦横の 1 インチ当たりのピクセル数 (PPI) が 150 となっている.
これは比較的荒いように感じる.そのため,オプション -r に続けて PPI 値 を与えれば良い.上の例では 300PPI (デフォルトの倍) としている.

また,デフォルトで PNG の背景は白になっているが,透明にしたい場合には -transp オプションを付与する.

$ pdftocairo -png -r 300 -transp test.pdf

■ SVG に変換

SVG に変換する場合は以下のようにする.

$ pdftocairo -svg test.pdf

ただし,複数ページの PDF を SVG に変換する場合,SVG がうまく表示されなくなる.単数ページのみで利用するようにしよう.

そのため,複数ページの PDF を SVG に変換するにはページを指定しながら変換すると良いだろう.
オプションで -singlefile を使えば,1 ページ目のみを変換することが出来る.あるいは,-f から -l までのページを指定を利用して任意のページを変換することが出来る.
3 ページ目を変換するには以下のようにする.

$ pdftocairo -svg -f 3 -l 3 test.pdf

また,複数ページの PDF を pdftocairo を利用して SVG に変換する方法はないが,適当なスクリプトを組んで自動化させることは出来るだろう.
これについては以下で紹介している.興味があれば.LaTeX Workshop から batch を動かそうとしている.

Convert multi page PDF to SVG with BAT file - Gist

■ VSCode で変換

コマンドラインをいちいち操作するのは面倒なので,VSCode +LaTeX Workshop で LaTeX 環境を構築しているならば,これを recipe から使えるようにしたい.
settings.json で以下のようにする.(TeX をタイプセットする tool や recipe は含めていないので注意.適宜挿入してほしい.)

    "latex-workshop.latex.recipes": [
      // Recipes for compiling TeX to PDF
      // ... ...
      {
        "name": "Convert PDF to PNG",
        "tools": [
          "pdf2png",
        ]
      },
      {
        "name": "Convert PDF to SVG",
        "tools": [
          "pdf2svg",
        ]
      },
    ],
    "latex-workshop.latex.tools": [
      // Tools for compiling TeX to PDF
      // ... ...
      {// Convert PDF to PNG
        "name": "pdf2png",
        "command": "pdftocairo",
        "args": [
          "-png",
          "-r",
          "300",// PPI
          // "-transp",// If use a transparent page color instead of white
          // "-singlefile",// Only convert first page and Remove file number
          "%DOC%.pdf",
          "%DOC%-image",
        ]
      },
      {// Convert PDF to SVG
        "name": "pdf2svg",
        "command": "pdftocairo",
        "args": [
          "-svg",
          "-singlefile",// Only convert first page and Remove file number
          "%DOC%.pdf",
          "%DOC%-image.svg",
        ]
      },
    ],

注意
: PPI を変更するオプション引数は -r 300 などとするが,なぜか分けていないと上手く実行できなかった.別行に分けておこう.
また,SVG では複数ページの PDF を変換しようとすると上手く表示できなくなってしまうので,1 ページ目のみを変換するようにしている.2 ページ目以降は変換されない.

PNG や SVG のファイル名は *-image.png, *-image.svg として出力される.

また,VSCode では PNF ファイルをプレビューすることが出来る.SGV では XML のコードを閲覧することになる.ブラウザを利用すると良いだろう.

○ VSCode で TeX2image

タイプセットからトリミングと変換のための recipes と tools をまとめておこう.

ptex2pdf を利用した upLaTeX+dvipdfmx と LuaLaTeX によるのタイプセットを含めた settings.json を明らかにしておきたい.
これらの設定は,Workspace の settings.json に書き込むことをオススメしておく.

settings.json まとめ (折りたたみ)

それぞれの操作を分けたコマンドと TeX から PNG/ SVG をいっきに生成するコマンドを与えている.適宜調整してほしい.

以下の設定で指定しているレシピは,コマンドパレットから LaTeX Workshop: Built with recipe とするか,keybindings.json で "latex-workshop.recipes" にショートカットキーを与えておけば,複数のレシピから自由に選択することが出来るようになる.

    "latex-workshop.latex.outDir": "%DIR%\\%DOCFILE%",
    "latex-workshop.latex.clean.subfolder.enabled": true,
    "latex-workshop.latex.recipes": [
        {
          "name": "LuaLaTeX: 1 time Build",
          "tools": ["lualatex"]
        },
        {
          "name": "ptex2pdf: 1 time Build",
          "tools": ["uptex2pdf"]
        },
        {
          "name": "Trimming PDF",
          "tools": ["pdftrimming"]
        },
        {
          "name": "Convert PDF to PNG",
          "tools": ["pdf2png"]
        },
        {
          "name": "Convert PDF to SVG",
          "tools": ["pdf2svg"]
        },
        // Chains of operations
        // {
        //   "name": "LuaLaTeX: TeX to PNG",
        //   "tools": [
        //     "lualatex",
        //     "pdftrimming",
        //     "pdf2png"
        //   ]
        // },
        // {
        //   "name": "LuaLaTeX: TeX to SVG",
        //   "tools": [
        //     "lualatex",
        //     "pdftrimming",
        //     "pdf2svg"
        //   ]
        // },
        // {
        //   "name": "ptex2pdf: TeX to PNG",
        //   "tools": [
        //     "uptex2pdf",
        //     "pdftrimming",
        //     "pdf2png"
        //   ]
        // },
        // {
        //   "name": "ptex2pdf: TeX to SVG",
        //   "tools": [
        //     "uptex2pdf",
        //     "pdftrimming",
        //     "pdf2svg"
        //   ]
        // },
      ],
      "latex-workshop.latex.tools": [
      {// ptex2pdf
        "name": "uptex2pdf",
        "command": "ptex2pdf",
        "args": [
          "-u",
          "-l",
          "-ot",
          "-kanji=utf8",
          "-interaction=nonstopmode",
          "-file-line-error",
          "-output-directory",
          "%OUTDIR%",
          "%DOC%",
        ]
      },
      {// LuaLaTeX
        "name": "lualatex",
        "command": "lualatex",
        "args": [
          "-interaction=nonstopmode",
          "-file-line-error",
          "--output-directory=%OUTDIR%",
          "%DOC%",
        ]
      },
      {// Trimming PDF
        "name": "pdftrimming",
        "command": "pdfcrop",
        "args": [
          "--margins",
          // margins unit: bp
          "10 5",
          "%OUTDIR%\\%DOCFILE%.pdf",
          "%OUTDIR%\\%DOCFILE%.pdf",
        ]
      },
      {// Convert PDF to PNG
        "name": "pdf2png",
        "command": "pdftocairo",
        "args": [
          "-png",
          "-r",
          // convert resolution unit: PPI(Pixel par Inchi)
          "300",
          // If use a transparent page color instead of white
          // "-transp",
          // Only convert first page and Remove file number
          // "-singlefile",
          "%OUTDIR%\\%DOCFILE%.pdf",
          "%OUTDIR%\\%DOCFILE%-image",
        ]
      },
      {// Convert PDF to SVG
        "name": "pdf2svg",
        "command": "pdftocairo",
        "args": [
          "-svg",
          "-f",
          "1",
          "-l",
          "1",
          "%OUTDIR%\\%DOCFILE%.pdf",
          "%OUTDIR%\\%DOCFILE%-image.svg",
        ]
      },
      ],

上の settings.json を踏まえて以下の 2 つの方法がある.

standalone や preview を使用する

  1. TeX を作成し PDF を生成 (LuaLaTeX がオススメ)
  2. Convert PDF to PNG/ SVG で PNG/ SVG を生成

余白をトリミングする

  1. TeX を作成し A4 サイズ等の PDF を生成 (ページ番号は非表示にしておく)
  2. Trimming PDF で PDF をトリミング
  3. Convert PDF to PNG/ SVG で PNG/ SVG を生成

注意
: これらの recipe は開いている TeX ファイルのディレクトリ名から PDF をトリミング/ PNG に変換するものなので,TeX ファイルを開いていない場合にはもちろん実行できない.


今回,画像を出力するに当たって画像ファイルが多数生成される可能性があるため,ファイルごとにサブファイルを設けることでその中に成果物を出力するようにしている.

これを嫌う場合は,上の "args" で以下のようにファイルを指定している箇所を変更する.(拡張子は変更しないように注意)

"%OUTDIR%\\%DOCFILE%.<ext>"

"%DOC%.<ext>"

まとめ

これでネット上の Converter を利用しなくても自炊できる!!

PowerPoint などのプレゼンに数式や表を PNG や SVG で挿入できる!!!
img タグで PNG や SVG を挿入できるので,ネットにも上げられる!!!


と言いつつ,実は TeX2img を導入したら直で画像に出来るってマ???

あるいは,PowerPoint ならアドオンの IguanaTex を利用する方が簡単という話もある.(あ,あぁ……)

また,今回は pdftocairo を利用して PNG や SVG に変換したが,pdftoppm を利用して PNG に変換することも可能である.
これらの実行ファイルは以下のディレクトリに含まれているので,おもしろそうなものがあれば利用すると良いだろう.

%TEXLIVE%/20**/bin/win32
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4