将不同高度的页面拼接/拼版成一页

将不同高度的页面拼接/拼版成一页

我有一个项目涉及将大量多页 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 页上方的大边距移到下方)?

这是我第一次使用pdflatexpdfpagesLaTeX一般,所以我可能遗漏了一些简单的东西。如果有人有任何专业知识,也欢迎提供关于如何做到这一点的非 LaTeX 建议(LaTeX 是我迄今为止发现的最有前途的命令行选项)。

答案1

以下是建议的解决方案:

  1. 使用与当前相同的输入:

    pdflatex \def\pdfpath{Example.pdf} \input{stitch_pages.tex}
    
  2. 现在,stitch_pages.tex将执行多项任务:

    • 读取第一页\pdfpath以确定整个(结果)文档的页面宽度。假设其中的所有页面\pdfpath都相同。

    • 设置geometry生成的文档与该宽度相匹配,但高度过高(200in比如说)。

    • 删除所有页边距 ( margin=0pt)。

    • \pdfpath加载整个计算页数

    • 删除所有段落缩进 ( \setlength{\parindent}{0pt})。

    • 使用以下方法将一页一页地插入\pdfpath到文档中\foreach(从pgffor

这是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}}}

相关内容