Hatena::ブログ(Diary)

アセトアミノフェンの気ままな日常

2015-10-26

dvipdfmx は /Rotate に対応していないという話、への対処法(補足編1)

先日の記事のあと、何人かの方が追試を行ってくださったようだ。あそこでは「pdfcrop を使って前処理する方法」と「簡単な (plain) pdfTeX ソースを作って前処理する方法」を検討したが、追加すべき方法が出てきた。ありがたい。

対処法2:pdfLaTeX で pdfpages パッケージを使う

2015年10月24日 にっき♪では、pdfpages パッケージを使っている。

% pdflatex
\documentclass{article}
\usepackage{pdfpages}
\begin{document}
\includepdf[pages=-,fitpaper]{test.pdf}
\end{document}

この fitpaper オプションがポイント。ただし、複数ページ PDF の場合は「最初のページのサイズ」が毎回使われる。したがって、ページサイズがそれぞれ異なる場合は2ページ目以降が1ページ目のサイズに fit するように拡大縮小されてしまう(縦横比は保つので余白もできる)。まあ複数ページを扱う必要性は少ないだろうから、これも有効な解決策の一つである。

対処法3:pdfjam を使う

先日の記事でチラッと触れた pdfjam も使えるらしい。というのも、実はヘルプメッセージにも表れない --fitpaper というオプションがあるらしい

 $ pdfjam --fitpaper true hoge.pdf

こうすれば hoge-pdfjam.pdf が得られる。pdfjam の実体は「pdfLaTeX で pdfpages パッケージを処理するシェルスクリプト」なので、すぐ上に書いたものと本質的には同じ。ただ Unix 系では pdfjam のほうが手間は若干減るだろうし、Windows ならシェルスクリプトが(Cygwin 以外で)動かないはずなので自分で pdfpages を使って書くことになろう。

対処法4:TeX2img(別名:イロイロ2イロイロ)を使う

「クロップしない pdfcrop」的なものを使って PDF をクロップしない話では、TeX2img を使って PDF → PDF 変換を行っている。TeX2img は実は PDF も入力として受け付けて(気まぐれでやめるかもしれない機能)、その場合

  • アウトライン化(デフォルト):gs を使って eps(2)write → pdfwrite
  • テキスト保持(--with-text):pdfTeX を使って新しい PDF に取り込む

という処理を行う。いずれの場合もデフォルトでは余白をクロップするが、--keep-page-size オプションを付ければ余白を残した元のサイズを保持する。したがって

 $ tex2img(c) --with-text --keep-page-size hoge.pdf hoge-out.pdf

とすれば元のページサイズを保持した /Rotate を持たない PDF を作成し

 $ tex2img(c) --with-text hoge.pdf hoge-out.pdf

とすれば余白をクロップした /Rotate を持たない PDF を作成する(コマンド名の tex2img(c) というのは Mac では tex2img、Windows では tex2imgc のことを意味する)。もし入力 PDF が複数ページの場合はデフォルトでバラバラに出力するのだが、--merge-output-files をつければ単一ファイルにまとまった出力が得られる。

まとめ:結局 pdfTeX スゴイ

先日の記事と今回の記事で挙げたすべての方法は、結局「pdfTeX を使って新しい PDF に取り込む」にすぎない。これで PDF の回転情報である /Rotate が“確定”するわけだが、にっき♪にあるとおり当然ながら PDF のファイルサイズは微妙に大きくなる。pdfTeX を使わない方法は後日考えよう

PDF の /Rotate 対策の意義

元はといえば、gs の "majority decision" が /Rotate [angle] という命令を書き込むことだった。しかし、このように「PDF の回転」を /Rotate で実現する PDF 編集ソフトウェアは gs 以外にもあるらしい。今分かっているものを挙げておこう:

OS X (Mac) 標準の Preview.app

このように、Mac の Preview.app は簡易 PDF 編集ソフトウェアとして有用であるが、「PDF を回転して保存」する際には /Rotate 命令を使用する。したがって、回転後の PDF を dvipdfmx で取り込もうとすると「あれ、回ってないぞ?」になる。

Adobe Acrobat Pro / Acrobat Distiller(追加:2015-10-27)

下のコメント欄も参照してほしいが、Adobe Acrobat の「ページを回転」という機能を使うと同じく /Rotate 命令が入る。gs の AutoRotatePages はおそらく Adobe Distiller に存在する機能に追随したのだろうと推測している。というのも、Distiller で先日の dnorm.eps を PDF 変換すると当然のように回転する。Distiller の設定メニューには「ページの自動回転」として「オフ・ファイルごとに一括・ページごと」のいずれかを選択する仕様で、デフォルトはどうやら「ファイルごとに一括」のようだ。

f:id:acetaminophen:20151027173027p:image

PostScript も PDF も Adobe が策定した仕様だが、次々と新しい feature が追加される(たとえば DecodeParms にも dvipdfmx は最近まで非対応だった)ので追随は大変…

doraTeXdoraTeX 2015/10/27 08:54 Adobe Acrobat でページを回転した場合も,やはり /Rotate が付きますね。

acetaminophenacetaminophen 2015/10/27 09:27 やはりそうでしたか。実は gs の AutoRotatePages サポートが追加されたコミット(2000年)を見ると "Implements the AutoRotatePages distiller parameter." とあるんですよね。
http://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=d536e8535c8ab1d1241a2f53c5db130aeee8908b
ということは、すべての源流は Distiller にあるのだろうと思っています。全く同じ実装にするため /Rotate を使っているのでしょうし。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証