\includegraphicsで挿入するPDFファイルのページ数取得

\includegraphicsで挿入するPDFファイルのページ数取得

- 平岩 良之 の投稿
返信数: 7
初めて投稿させていただきます.
TeXやりだして3ヶ月,初心者の平岩です.
TeXWorks2014の環境で使用しています.

<やっていること>

作成書類の途中の部分に,既に作成済みの
【モデル図.pdf】というPDFファイルを
\includegraphicsで読み込もうと思っております.

今のことろ以下のソースにあるように複数枚数あるPDFを
\loopを使って指示回数だけ繰り返しています.
その際,取り込むファイルが既にA4にトリム済なので,
ページマージンなど調整して取り込んでいます.

<やりたいこと>
ただし,この【モデル図.pdf】というPDFは
作成する書類によってページ数が異なるので,

\ifnum\cntI<10 \repeat で指示しているページ数を
毎回指定するのは面倒だなぁと思ってまして,
指定した【モデル図.pdf】のページ数を
自動で取得できないかなぁと思っております.

<該当箇所のソース>
%モデル図挿入

\newpage


%既にA4サイズになっているPDFのためにページマージン調整

\setlength{\hoffset}{-1in}

\setlength{\textwidth}{\paperwidth}

\setlength{\topmargin}{-1in}

\setlength{\textheight}{\paperheight}


\ifnum \pdfinput=1 { %\pdfinput=1の場合は最終版としてPDFを取り込み

\newcount\cntI

\cntI=1

\loop

{\noindent{\includegraphics[page=\the\cntI,trim=0 0 0 0,width=\textwidth]{./link/モデル図.pdf}}}

\advance\cntI1

\ifnum\cntI<10 \repeat

\clearpage

}

\else { %pdfinput=1以外の場合はページマージンを戻して注釈を表示しておく

\setlength{\hoffset}{0pt}

\setlength{\textwidth}{510pt}

\setlength{\topmargin}{0pt}

\setlength{\textheight}{781pt}

\vspace*{5zh}

\begin{center}

{\LARGE \textgt{【注】後ほどモデル図挿入}}

\end{center}

\clearpage

}\fi


<別の方法?>

別個にPDFファイルを作成しておき,最後に

本体PDFの指示した箇所を別のPDFデータで置換

(上の例だと【注】後ほどモデル図挿入と書かれているページを

【モデル図.pdf】で置換)するのでもいいかなぁと思っていたのですが,

それだと章ごとのページ番号をTeXでふることができないかと思い,

今のところ上に書いたような方法で模索しております.

平岩 良之 への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- KUROKI Yusuke の投稿
やりたいことは,PDFをマージして,(英数字の)ページ番号を振るということだけですか?
それであれば,pdfpages パッケージの includepdf を使うほうが楽だと思います.
(texconf09, 10, 11 あたりの予稿集はその方法でPDFをマージしました.)
KUROKI Yusuke への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- 平岩 良之 の投稿
ご提案いただいた,pdfpagesパッケージのincludepdfでマージをする場合ですが,
例えば全40ページの【A.pdf】に対して,23ページ目と24ページ目の間に
【B.pdf】を入れたい場合
\includepdf[pages=1-23]{A.pdf}
\includepdf[pages=-]{B.pdf}
\includepdf[pages=24-40]{A.pdf}

となるかと思うのですが,この場合ですと,
この23/24という箇所を自動で処理してくれる方法がないか模索しております.
挿入するPDFファイルが一つの書類に対して10種類近くあるので,
挿入位置を自動で取得したいと,考えた次第です.

現状としては,【A.pdf】自体をpLaTeX環境で作成しているため,
pdfpagesパッケージが使えず,pLaTeX環境の中で(A.texの中でincludegraphicsを
使って)何とかPDFをゴロっと入れられないかと考えておりました.
平岩 良之 への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- KUROKI Yusuke の投稿
必要十分な情報をすぐに返信いただいてありがとうございます.
残念ながらよりよい回答を思いつきません.

どなたか思いつかれた方はいらっしゃいませんか?
平岩 良之 への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- Dora TeX の投稿
やりたいことは,「既存PDFの全ページにわたって,各ページをバラバラに \includegraphics したい」という理解で合っていますでしょうか。

それであれば,ちょっとトリッキーな方法ですが,次のような方法はいかがでしょう。

\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\makeatletter

\newcount\currentPage
\newcount\@numOfPages
\newif\if@pagenumread

% \forEachPage{#1}{#2} : PDFの全ページに対し与えられた処理を繰り返す
% #1 : PDFのファイル名
% #2 : 繰り返す処理。現在のページ番号は \currentPage というカウンタとして利用できる。
\def\forEachPage#1#2{%
  \@getNumOfPages{#1}%
  \@tempcnta=0
  \currentPage=1
  \loop
    #2%
    \advance\@tempcnta1
    \advance\currentPage1
  \ifnum\@tempcnta<\@numOfPages
  \repeat
}

% \includeAllPages{#1} : \forEachPage を利用して,#1に指定されたPDFの全ページを取り込む
\def\includeAllPages#1{%
  \forEachPage{#1}{%
    % 各ページの出力書式はここで適宜変更
    \fbox{\includegraphics[page=\the\currentPage]{#1}}%
    \clearpage
  }%
}

\def\@getNumOfPages#1{%
  \immediate\openin\@inputcheck="|extractbb -O #1"%
    \@pagenumreadtrue
    \loop
      \catcode`\%=11
      \read\@inputcheck to\@tempa
      \catcode`\%=14
      \ifeof\@inputcheck
        \@pagenumreadfalse
      \else
        \expandafter\@@getNumOfPages\expandafter{\@tempa}%
      \fi
      \if@pagenumread
    \repeat
  \immediate\closein\@inputcheck
}

\catcode`\%=11
\def\@@getNumOfPages#1{\@@@getNumOfPages #1%%Pages:\relax}
\def\@@@getNumOfPages #1%%Pages:#2\relax{\def\@tempb{#1}\relax
  \ifx\@tempb\@empty
    \@@@@getNumOfPages#2\relax
    \@pagenumreadfalse
  \fi
}
\def\@@@@getNumOfPages#1 %%Pages:\relax{\@numOfPages=#1\relax}
\catcode`\%=14

\makeatletter

\begin{document}

あいうえお

\newpage

\includeAllPages{hoge.pdf} % hoge.pdf の全ページにわたってバラバラに \includegraphics を繰り返す

かきくけこ
\end{document}
Dora TeX への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- 平岩 良之 の投稿
Kuroki さま Dora TeXさま

お返事ありがとうございます.
Dora TeXさまに示していただいたマクロを
組み込んで試させていただきます.
まさにやりたかったのはこのことです!

(また,同時にマクロを理解すべく勉強させていただきます.)

試させていただき,結果ご報告させていただきます.
平岩 良之 への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- 若 雲 の投稿
ぜんぶTeXでやらずとも、PDFtkなどで先にPDFを分割して、連番を振っておけばよいように思いますが、そういうものではないのでしょうか。

LinuxでPDFファイルを分割/結合するには - @IT
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/928splitpdf.html

PDFtkはWindows版もあります。
GUI版: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
CUI版: https://www.pdflabs.com/tools/pdftk-server/
若 雲 への返信

Re: \includegraphicsで挿入するPDFファイルのページ数取得

- 平岩 良之 の投稿
若 雲さま

おっしゃる通りで,これまではご提示いただいたように

1.TeXで作成している部分をPDFとして組版して
2.その親PDFを各章(全16章)ごとに分割
3.その各章PDFに対して,別ソフトで作成したPDFをマージ(挿入)し,
4.最後に章ごとにページ番号を振る

ということをしていたのですが,この1-4の流れ自体は
案件ごとに作業内容がほとんど変わることがないので,
それらをTeXで一括処理できるようにできないかなぁと思案していた次第です.

ご紹介いただいたPDFtkはコマンドラインからの操作も可能なのですね.
これまでAcrobatでしていたので,それだけでも十分に効率化できそうですので,
試してみたいと思います.ご紹介ありがとうございます.