我有一个项目涉及将大量多页 PDF 转换为单页 PDF。
每个 PDF 文件都有 1 到 16 页,并且页面高度各不相同。例如,我有一个两页的 PDF,如下所示 - 我的目标是将两页垂直拼接或拼版在一起以形成单个 PDF 页面:
What I want to happen:
Before After
┌─────┐ ┌─────┐
│ A │ │ A │
│ A │ │ A │
│ A │ -----> │ A │
└─────┘ │ │
┌─────┐ │ B │
│ B │ └─────┘
└─────┘
我设置了一个 Bash 脚本,循环遍历目录中的所有 PDF 文件,并针对每个文件运行一个pdflatex
命令:
pdflatex "\def\pdfpath{Example.pdf} \input{stitch_pages.tex}"
运行这个 LaTeX 脚本:
\documentclass{article}
\usepackage{pdfpages}
\usepackage[paperwidth=12in, paperheight=200in]{geometry} % Bigger than the combined width/height of the PDF pages (will be cropped after)
\pagestyle{plain}
\begin{document}
\includepdfmerge[nup=1x16, % Assuming there are no PDFs with more than 16 pages
noautoscale=true,
delta=0 0,
frame=true]
{\pdfpath, -} % Path is passed in when running from the command line
\end{document}
如上所示,我设置了较大的纸张宽度和高度,以避免调整 PDF 页面的大小。我使用 Python 工具在附加步骤中修剪了边缘周围的多余边距pdfCropMargins
。
不幸的是,LaTeX 脚本运行后,我得到了一个如下所示的单页 PDF – 两页之间有很大的边距,无法裁剪:
What actually happens:
Before After
┌─────┐ ┌─────┐
│ A │ │ A │
│ A │ │ A │
│ A │ -----> │ A │
└─────┘ │ │
┌─────┐ │ │
│ B │ │ │
└─────┘ │ B │
└─────┘
我在这里发现了类似的问题 –将不同大小的页面缝合在一起– 但建议的解决方案(使用delta
)似乎要求页面是已知的、固定大小的。就我而言,我事先不知道给定 PDF 的任何页面有多高。是否可以首先防止在页面之间添加边距,或者动态计算边距并减去它,或者在合并页面时将页面垂直对齐到其“框”的顶部(这会导致 B 页上方的大边距移到下方)?
这是我第一次使用pdflatex
、pdfpages
和LaTeX
一般,所以我可能遗漏了一些简单的东西。如果有人有任何专业知识,也欢迎提供关于如何做到这一点的非 LaTeX 建议(LaTeX 是我迄今为止发现的最有前途的命令行选项)。
答案1
以下是建议的解决方案:
使用与当前相同的输入:
pdflatex \def\pdfpath{Example.pdf} \input{stitch_pages.tex}
现在,
stitch_pages.tex
将执行多项任务:
这是stitch_pages.tex
:
\documentclass{article}
\usepackage{graphicx,pgffor}
% Retrieve input page width
\newlength{\inputpagewidth}
\settowidth{\inputpagewidth}{\includegraphics[page=1]{\pdfpath}}
% Set geometry according to document page width
\usepackage{geometry}
\geometry{
paperwidth=\inputpagewidth,
paperheight=200in,
margin=0pt
}
% Retrieve number of pages in document
% https://tex.stackexchange.com/a/198117/5764
\pdfximage{\pdfpath}
\edef\numberofpages{\the\pdflastximagepages}
\setlength{\parindent}{0pt}% Remove paragraph indentation
\begin{document}
\foreach \curpage in {1,...,\numberofpages} {
\includegraphics[page=\curpage]{\pdfpath}
}
\end{document}
然后你可以使用以下方法裁剪周围的空白pdfcrop
或其他类似的软件作为批处理脚本的一部分。
答案2
默认情况下,pdfpages 确定第一的页面和尺度全部进一步的页面,使它们适合这个宽度和高度的矩形。使用选项,pagetemplate
您可以告诉 pdfpages 取另一页的宽度和高度。使用选项,templatesize
您甚至可以明确定义宽度和高度。但最后全部页面缩放以适合相同的给出的矩形一(且只有一个)宽度/高度对。它是不是可以为每一页指定单独的宽度/高度对。
恐怕您必须使用它\includegraphics
来完成您的任务并手动进行页面拼版。
\noindent
\parbox{\linewidth}{%
\includegraphics[page=1, scale=.6]{file.pdf}}\\
\includegraphics[page=2, scale=.6]{file.pdf}}\\
\includegraphics[page=3, scale=.6]{file.pdf}}}