hack のためのネタ帳, etc,,,

やりたい事

特に PDFjam 等で nup した handouts 等を想定しているが、
既存の PDF ファイルに、後からページ番号を追加したい。

大まかな手順

  1. TeX でページ番号だけ印字した PDF を作成
  2. 処理したい PDF の各ページに重ね合わせる

使うもの

  • platex, dvipdfmx
    • fancyhdr
    • geometry
  • pdfinfo
  • pdftk

pdfinfo は総ページ数の取得に使う。poppler に入ってる。
pdftk はページの回転とか、重ね合わせに使う。

具体的な手順

空白のページにページ番号だけ振った PDF を生成するには、以下のような TeX ファイルの雛型を用意すればよい。

pagenum.tex.in

\documentclass[a4paper]{article}
\usepackage{fancyhdr}
\usepackage{lastpage}
\usepackage[margin=2em,foot=1.5em]{geometry}

\pagestyle{fancy}
\pagenumbering{arabic}
%\fancyhf{}
\cfoot{\thepage \hspace{1pt} / \pageref{LastPage}}
\renewcommand{\headrulewidth}{0pt}

% Repeat N times to output contents.
% Usage: \repeatntimes{TIMES_TO_REPEAT}{CONTENTS_TO_REPEAT}}
\newcounter{repeatntimesCounter}
\newcommand{\repeatntimes}[2]{\setcounter{repeatntimesCounter}{0}%
\loop\ifnum\value{repeatntimesCounter}<#1#2\stepcounter{repeatntimesCounter}\repeat%
}

\begin{document}
\repeatntimes{@@@PAGES@@@}{\ \newpage}
\end{document}
これの @@@PAGES@@@ に pdfinfo で取得した総ページ数を埋め込んで PDF を生成
sed -re s/@@@PAGES@@@/`pdfinfo input.pdf | awk '/^Pages:/{print $2}'`/g pagenum.tex.in > pagenum.tex \
&& platex pagenum && platex pagenum && dvipdfmx pagenum
最後に目的の PDF の上に今作った pagenum.pdf を重ねる。
pdftk input.pdf multistamp pagenum.pdf output output.pdf
以上。

input.pdf が縦横混在している場合は、pdftk を用いて pagenum.pdf を回転し、各ページの方向を input.pdf と pagenum.pdf で合わせておく。
例えば、
pdftk pagenum.pdf cat 1 2east 3 4east 5-end output pagenum_rotated.pdf
みたいにすれば、1,3,5-end は縦、2,4 が横になった pagenum_rotated.pdf が得られる。

これ、自動で出来ればよいんだけど、各ページの方向調べる方法が分からない。
1ページ毎に分割して pdfinfo でページサイズ調べて回るのもちょっとスマートじゃないし、何か良い方法はない物か?

参考

  • ftp.yz.yamagata-u.ac.jp / pub /CTAN / macros / latex / contrib

あとがき

実は 1 ヶ月半くらい前(2018-08-31)にやった事なんだけど、時間なかったのでバッチ組まずに手動で試行錯誤しながら作業したんだけど、如何せん時間ギリギリに作業してたもんだから、その後のタスクに追われてまとめ損なっていた。
今回、同じようにページ番号を後付けしようとしたのだが、1 ヶ月半も放置してたおかげで、やった作業をほぼ失念。
完全にロストテクノロジー化していて困った。

作成した handouts のタイムスタンプを頼りに作業フォルダに残ってたファイルを探し当て、
Firefox の Ctrl+H に残ってた当時の閲覧履歴を踏んで回って追体験する羽目に。
ところが、肝心の PDF の重ね合わせに用いた multistamp に関するページが履歴には見つからず
自分でもどうやってやったのか分からず途方に暮れてしまった。

幸い、byobu に shell 残ってたのを見つけたため、history 取ることでなんとか手順だけはサルベージできたんだが、
しかし結局、履歴からは参考にしたページを見つけることが出来なかった。

history には man を見た形跡もなかったし、
cat pagenum.pdf | pdftk input.pdf multistamp - output output.pdf
みたいに - で stdin 拾う変なやり方してて、この書き方はどこかのページで見てそのまま書いた覚えがあるので、
確実にどこかのページ参考にしてるんだけど、なぜ見つからないのか?

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます