スキップしてメイン コンテンツに移動

LaTeXの出力pdfにグリッドラインを引く(自炊pdfの画像位置調整)

普段購入した専門書をスキャンしてpdfファイルにし、ipadやPC画面で読むようにしています。書籍のスキャンにはAvisionのFB2280Eを利用しています(国内の代理店での価格は私が購入した海外の通販サイトの値段の3倍くらいになっているようです)。国内では同じくらいのスペックのブックスキャナーとしてPlustekのOpticBook 4800が手に入りやすく、私もこちらを所持していましたが故障のため買い替えました。FB2280は後発のためスキャン速度はOpticBook 4800より速いです。しかし付属のソフトがよろしくないことと、スキャン位置とボタン位置が離れていてスキャンし辛いなどの短所もあります。

本体付属ソフトは使いづらいため、スキャンソフトはNAPS2を利用しています。

また非破壊のスキャナーであるために、解体・裁断してスキャンするよりもページごとの位置ずれがかなり大きくなります。また、スキャンしたときに本の背に近い部分は光が届かず黒い帯がでます。

黒い帯部分の削除にはBrissというJava製のソフトを利用しています。GUI操作で偶数ページと奇数ページを分けて一度にcrop操作を行えるので便利です。

pdfをcropしてもreaderで表示される部分が変わるだけで、元の画像情報は残っています。表示されない部分を完全に消してしまうには、今の所AdobeのAcrobat PRO DCの「非表示情報を検索して削除」を利用する方法しか寡聞にして知りません。非表示情報の削除と傾き補正、OCR処理にはAcrobat DC Proを利用しています。

自炊したpdfの余白についてwebで検索すると、ipadなどで読むために余白を削りたい人が多いようです。私は適切に余白があるほうが圧迫感が無く読みやすいと感じるので,cropしたpdfをpdfTeXで処理して余白の追加をしていました。

最近はページごとの上下左右の振れが気になってきたので、余白の調整に試行錯誤しています。以下からが本題です。

TeX-LaTeX Stack Exchangeのこの記事を元に、eso-pic, pdfpages, tikzパッケージを利用してpdfファイルの全面にグリッドを表示させるようにしてみました。画像では画像位置の調整のためのガイドラインの表示も行っています。


これらの画像を表示するためのLaTeXソースファイルは以下の通りです。
\documentclass{article}

\usepackage[paperwidth=142mm,paperheight=210mm]{geometry} 

\newif\ifesopic
\esopictrue
%\esopicfalse

\ifesopic
\usepackage[texcoord]{eso-pic} %各ページ前面にグリッドを描くのに利用.texcoordで左上が原点.
\fi

\usepackage{pdfpages} %\includepdfコマンドを利用

\ifesopic
\usepackage{tikz} %グリッドの描画に利用
\usetikzlibrary{calc,math}
\fi

\ifesopic
%eso-picで使う新しい長さのコマンドを設定
\newlength{\myleftmargin}
\newlength{\myrightmargin}
\newlength{\mytopmargin}
\newlength{\mytopmarginii}
\newlength{\mytopmarginiii}
\newlength{\mybottommargin}
\newlength{\mycenterposition}

%margins
\setlength{\myleftmargin}{16mm}
\setlength{\myrightmargin}{16mm}
\setlength{\mytopmargin}{15mm}
\setlength{\mytopmarginii}{20.5mm}
\setlength{\mytopmarginiii}{36mm}
\setlength{\mybottommargin}{18mm}
\setlength{\mycenterposition}{71.00mm}

%グリッドと版面ガイドラインの描画
\AddToShipoutPictureFG{%
\begin{tikzpicture}[remember picture, overlay,
                   help lines/.append style={line width=0.1pt,
                                             color=blue!50},
                   minor divisions/.style={help lines,line width=0.2pt,
                                           color=red!50},
                   major divisions/.style={help lines,line width=0.3pt,
                                           color=red},
                   guide lines/.style={line width=0.5pt,color=blue},
]
 \draw[help lines] (current page.south west) grid[step=1mm]
                   (current page.north east);
 \draw[minor divisions] (current page.south west) grid[step=10mm]
                        (current page.north east);
 \draw[major divisions] (current page.south west) grid[step=50mm]
                        (current page.north east);

\draw[guide lines] ($(current page.north west) + (\myleftmargin,0)$)--($(current page.south west)+ (\myleftmargin,0)$); %left
\draw[guide lines] ($(current page.north east) - (\myrightmargin,0)$)--($(current page.south east)- (\myrightmargin,0)$); %right
\draw[guide lines] ($(current page.north west) - (0,\mytopmargin)$)--($(current page.north east)- (0,\mytopmargin)$); %top
\draw[guide lines] ($(current page.north west) - (0,\mytopmarginii)$)--($(current page.north east)- (0,\mytopmarginii)$); %top2
\draw[guide lines] ($(current page.north west) - (0,\mytopmarginiii)$)--($(current page.north east)- (0,\mytopmarginiii)$); %top3
\draw[guide lines] ($(current page.south west) + (0,\mybottommargin)$)--($(current page.south east)+ (0,\mybottommargin)$); %bottom
\draw[guide lines] ($(current page.north west) + (\mycenterposition,0)$)--($(current page.south west)+ (\mycenterposition,0)$); %center
\end{tikzpicture}%
}
\fi

\def\firstpagenum{1} %開始ページの数字を入れる(pdfの一部を読み込むとき)
\setcounter{page}{\firstpagenum}
\usepackage[pdfstartpage=\firstpagenum]{hyperref}

\def\target{images/hogehoge.pdf} %読み込むpdfのパス

\begin{document}
\includepdf[pages={32},scale=1.0,angle=0,noautoscale,bb=8.18mm 4.93mm 117.45mm 180.86mm,offset=-0.36mm 2.03mm,frame]{\target}
\includepdf[pages={33},scale=1.0,angle=0,noautoscale,bb=8.86mm 10.45mm 118.14mm 185.70mm,offset=0.36mm 2.37mm,frame]{\target}
\end{document}
グリッドの表示にはpdfTeXで2回処理が必要です。includepdfコマンドでpdfファイルを読み込むことができます。offsetの部分で読み込んだpdfの左下端点の座標を調整しています。

以前は1ページごとにこれらを調整していたのですが、流石に時間が掛かり過ぎるため、現在ではOpenCVを利用して画像の版面の枠を検出させて半分自動で位置調整をできるようにしました。それらについては後日記事にしたいと思います。

追記:2021/12/11:位置調整の記事を書きました。

このブログの人気の投稿

OpenCv-PythonとpdfLaTeXで自炊pdfファイルの位置調整

この記事は TeX & LaTeX Advent Calendar 2021 の11日目の記事です. 10日目は t_kemmochi さん,12日目は yukishita さんです.   動機  書籍の自炊にブックエッジスキャナーの AvisionのFB2280E を利用しています。書籍を裁断せずに1ページずつスキャンを行うため、本の開き具合などの要因で本の序盤、中盤、終盤で得られるスキャン画像の位置ずれが大きくなります。以前からpdfLaTeXを利用して位置調整をしていたのですが、OpenCvを利用して自動化できそうだったので試してみました。 やること 本記事では、pdf化した文書画像の版面(文字の印刷された部分の意味で使います)を半自動的に計算してpdfの画像の位置調整をするために、OpenCvとpdfLaTeXを利用する方法を解説します。手順としては Pythonの画像認識用ライブラリであるOpenCvを利用して版面を計算する。 テンプレートエンジンライブラリのJinja2を使って画像のバウンディングボックスなどを記述したLaTeXファイルを作成する。 pdfLaTeXでpdfを読み込み、位置の調整されたpdfを作成する。 という流れになっています。作業環境としては、 Visual Studio CodeをRemove - WSL拡張機能と併用 しています。PythonやそのライブラリはWSL上のUbuntuにインストールし、他にもpdfファイルを他のファイル形式にするためにpoppler-utilsなんかもインストールしました。 参考記事 OpenCvを利用した文書画像のレイアウト解析については ブログSomething Like Programming内の記事 Document Layout Analysis githubリポジトリ rbaguila/document-layout-analysis OpenCv-Pythonチュートリアル を参考にしました。 pdfLaTeXがpdf加工に使えるという話と、pdfpagesパッケージの存在は doraTeXさんのブログTeX Alchemist Onlineの記事 pdfTeX による見開きPDFの結合・分割 で知ったように思います。 画像pdfをpdfpagesで取り込む ま...

定理環境をmdframedからtcolorboxへ乗り換え

追記:2016/05/02 以前に掲載していた定理環境のマクロでは、カウンターが変化しないような記述をしてしまっていたので、全面的に書き換えました。 追記:2016/06/06 tcolorboxのオプションを追加できるように書き直しをしました( tcolorboxを使った定理環境 )。 LaTeXの話です。 これまで定理環境の修飾にmdframed.styを利用してきました。 mdframedを用いた定理環境の修飾(platex+dvipdfmx, tikz) しかし上の投稿で用いた記述をしていると、定理環境がページの下部にきたとき、まれに以下のように環境が新しいページに送られてしまい変なところで改ページが起こります。 TeX-LaTeX Stack Exchangeでも同様の不具合が報告されていて、mdframed.styの作者が回答して解決しているようなのですが、私の場合は上手く行きませんでした。タイトル部分の位置の計算に問題があるようです。 そういう訳で、mdframed.styよりも高い表現力を持つtcolorbox.styには興味を持っていました。今回は、mdframed.styで記述していた部分を、ソースの変更無しにtcolorboxで置き換えてみたので、その紹介をします。 tcolorbox.styで置き換えた結果は次のようになりました。 見た目はほとんど変わっていません。中のboxは別のtcolorbox環境です。 この定理環境のソースコードは次のようになります。 \usepackage{tcolorbox} \usepackage{varwidth} \tcbuselibrary{breakable} \tcbuselibrary{skins} \definecolor{frameinnercolor}{RGB}{49,44,44} \newcounter{theorem} \numberwithin{theorem}{section}% numberwithinはamsmath.styで定義されている \newenvironment{theorem}[2][]{% %#1 = タイトル, #2 = 定理環境名 \refstepcounter{theorem}% \newtcolorbox{...

定理を再掲したときに定理番号も揃える(amsmathのtagと似た挙動の定理環境を作る).

LaTeXの話題です.amsmath.styで定義されているtagコマンドは,数式環境の式番号部分を自由な文字列で置き換えることができるようになっています.下に例を挙げます. この画像を生成するLaTeXのコードは次のようになります. \documentclass[a4paper,dvipdfmx,uplatex]{jsarticle} \usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true,% ,colorlinks=true,linkcolor=blue]{hyperref}% \usepackage{showkeys} \usepackage{amsmath} \numberwithin{equation}{section} Unknown environment 'document' 最初のequation環境にeq:eulerというlabelをつけ,第2のequation環境ではtagコマンドを使って数式番号部分に¥ref{eq:euler}と書くことで,実際に表示される式番号が第1のequation環境のものと同じになっています.この第2のequation環境にはeq:euler2というlabelを付けており,これを¥eqref{eq:euler2}と参照すると表示される番号は第1のequation環境のものであるにも関わらず,リンクをクリックすると第2のequation環境にジャンプします. このような現象が起こるのは,上記のファイルをタイプセット...