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

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

[1]: https://qiita.com/Yarakashi_Kikohshi/items/8a46d2d16cf770b0259e
[2]: https://qiita.com/Yarakashi_Kikohshi/items/fdd0bf140b1deb0c8448

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

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

> - [PDF PNG 変換 \- オンラインで PDF を PNG に](https://pdf2png.com/ja/)
> - [オンラインで PDF から SVG に変換](https://www.idrsolutions.com/ja/online-pdf-to-svg-converter)

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

> - [Poppler](https://poppler.freedesktop.org/)
> - [Poppler \- TeX Wiki](https://texwiki.texjp.org/?Poppler)

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

----------

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

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


# ○ 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](https://gist.github.com/Yarakashi-Kikohshi/3cb8d19bc6a5c75826ec667912bf4f3a)

<!--
▽ ファイル名

そのままで行うと test-1.png となる．また，複数ページの PDF であれば test-1.png, test-2.png, ... と数字が増えていく．

`-singlefile` オプションを有効にすると test.png となる．ただし，PDF が複数ページの場合，1 ページ目のみしか生成されないことに注意が必要．

`"%DOC%-image"` を有効にすると，test.pdf を test-image-1.png とすることが出来る．`-image` の部分は任意に変更しても良いだろう．(ただし，SVG では `.svg` まで含める必要があるようだ)
-->

## ■ VSCode で変換

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

```jsonc
    "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 に書き込むことをオススメしておく．

<details><summary>settings.json まとめ (折りたたみ)</summary>
<div>

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

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

```jsonc
    "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",
        ]
      },
      ],
```

</div>
</details>

上の 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"` で以下のようにファイルを指定している箇所を変更する．(拡張子は変更しないように注意)

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

↓

```jsonc
"%DOC%.<ext>"
```


<!--
■ markdown/ HTML への埋め込み

> > **markdown**

```html
![alternative](./path/to/image.png)
```

```html
![alternative](./path/to/image.svg)
```

> > **HTML**

```html
<img src="./path/to/image.png" width=300pt >
```

```html
<img src="./path/to/image.svg" width=300pt >
```
-->

# まとめ

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

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

----------

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

- [TeX2img Website](https://tex2img.tech/index.en.html)
  - [TeX2img \- TeX Wiki](https://texwiki.texjp.org/?TeX2img)

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

- [IguanaTex \- A Free Latex Add\-In for PowerPoint on Windows](http://www.jonathanleroux.org/software/iguanatex/)
- [ray851107/IguanaTexMac: IguanaTex for mac](https://github.com/ray851107/IguanaTexMac)
  - [IguanaTex \- TeX Wiki](https://texwiki.texjp.org/?IguanaTex)

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

```
%TEXLIVE%/20**/bin/win32
```