TeX Alchemist Online

TeX を使って化学のお仕事をしています。

【改訂版】pdfTeX による見開きPDFの結合・分割

一昨日の記事「pdfTeX による見開きPDFの結合・分割」を執筆した後,あべのりさん (id:abenori) のご指摘により,より改良できることに気づきました。

そこで,このアイデアをもとに改訂版を作成しました。この方法ならば /Rotate による回転情報が付いているPDFにも問題なく対応できますし,TeX ソースもスッキリして読みやすくてよいですね。

前回のソースも,pdfTeX を用いたPDFのバウンディングボックス読み取り処理のサンプルコードとしての価値はあるかもしれないので,前回の記事は残したまま,改訂版を新記事としてアップしておきます。(また,記事末尾の /Rotate 除去法のリンク集も,PDF芸人には存在価値があるかもしれません。)

目次

1. PDFを2-up結合して見開きPDFにする(例:A4x2枚 → A3x1枚)

f:id:doraTeX:20160610205722p:plain

例えば input.pdf を 2-up 結合して見開きPDFにしたい場合,次の pdfLaTeX ソースを作ります。

\def\target{input.pdf}%% 対象PDFファイル名

\documentclass{minimal}
\usepackage{graphicx}

%%% 先頭ページを読んで生成PDFのページサイズを決定(/Rotate も反映)
\setbox0\hbox{\includegraphics{\target}}
\usepackage[papersize={2\wd0,\ht0}]{geometry}
\usepackage{pdfpages}

\begin{document}
\includepdf[nup=2x1,pages=-]{\target}
\end{document}

このソースを 2up.tex というファイルで保存したとすると,次のように pdfLaTeX でコンパイルすれば出来上がりです。

$ pdflatex 2up

2. PDFを裁断する(例:A3x1枚 → A4x2枚)

f:id:doraTeX:20160610204919p:plain

本を裁断せずにスキャナにかけると,次のように,見開き2ページずつのPDFが得られます。これを左右1ページずつに裁断したい状況を考えます。

f:id:doraTeX:20160610195559j:plain

(↑書籍版の「東京防災」をスキャンしたもの。このPDFを左右裁断したい。)

このようなときにも pdfTeX が役立ちます。

2.1 pdfLaTeX ソース

例えば input.pdf を左右裁断したいときは,次のような pdfLaTeX ソースを作成します。

\def\target{input.pdf}%% 対象PDFファイル名
\def\ratio{0}%% 中央を何パーセント切り落とすか。負の数の場合は中央を両側に含める。-99〜99の百分率値を指定。

\documentclass{minimal}
\usepackage{graphicx}

%%% 総ページ数の取得
\pdfximage{\target}
\newcount\pagecount
\pagecount=\pdflastximagepages

%%% 先頭ページを読んで生成PDFのページサイズを決定(/Rotate も反映)
\setbox0\hbox{\includegraphics{\target}}
\newdimen\originalwidth
\originalwidth=\wd0

%%% 生成PDFのページサイズを決定
\usepackage[papersize={\dimexpr\originalwidth*(100-\ratio)/200\relax,\ht0},margin=0pt]{geometry}
\usepackage{pdfpages}

\begin{document}
\parindent=0pt

%%% 画像配置を実行
\newcount\thispage
\loop
\advance\thispage1
%%% 左ページの配置
\ifnum\thispage>1
  \setbox0\hbox{\includegraphics[page=\thispage]{\target}}
\fi
\copy0\newpage
%%% 右ページの配置
\leavevmode\kern\pdfpagewidth\kern-\originalwidth\box0\newpage
\ifnum\thispage<\pagecount\repeat

\end{document}

これを split.tex というファイルで保存したとすると,次のように pdfLaTeX でコンパイルすれば出来上がりです。

$ pdflatex split

なお,ソース中の

\def\ratio{0}%% 中央を何パーセント切り落とすか。負の数の場合は中央を両側に含める。-99〜99の百分率値を指定。

の部分は,ノド部分の影を切り落としたいときに,切り落としたい率(パーセント)を正の値で指定します。

f:id:doraTeX:20160610203031p:plain

逆に,この \ratio に負の値を指定すると,中央部が左右両ページに含まれるようになります。スキャン位置が毎回微妙に左右にぶれる場合,安全のために中央部は裁断時に両方に含めるようにしておくとよいでしょう。

2.2 原理

この「pdfTeX によるPDF裁断」は,本当にPDFを裁断しているわけではありません。同一ページを2回ずつ,左右にずらしてページに配置している感じです。ですから生成PDFのファイルサイズは激増してしまう点にご注意ください。

f:id:doraTeX:20160610205326p:plain:w250

3. 前提条件

いずれの方法も,読み込む PDF (input.pdf) が,全ページが同じページサイズを持つことを前提としています。