我有数百个 pdf 文件,代表纸牌游戏的纸牌。它们是使用 LaTeX 构建的标准 2.5"x3.5" 文件。为了打印它们,我想将它们连接成一个 pdf 文件,每页 9 张卡片(最多可以容纳)。目前我使用
montage -density 300 -tile 3x3 -geometry 750x1050+50+25 a.pdf b.pdf ...
来做到这一点
不幸的是,这个解决方案存在一些问题:
细节丢失——
-density
选项对于获得良好的质量是必要的,并且结果取决于所需的质量。我的打印机可以以 600dpi 打印,所以我应该使用 -density 600
,但有些打印机无法正确处理。慢——我不使用 600 的另一个原因是,即使在 300 下,imagemagick 也非常慢,因为我认为它将 pdf 转换为图像,然后将它们连接成 pdf。
有限——此外,当输入文件的数量变得足够大时,蒙太奇将崩溃而无法创建结果pdf。
损失福利——最后,生成的 pdf 不会保留原始文件的元数据。最重要的是,文本不再可选。这意味着我无法在 pdf 中搜索特定卡片。
为了解决这个问题,我目前正在使用 pdfunite 制作一个长 pdf,每页 1 张卡片,然后告诉我的打印机每页打印 9 张卡片。结果相当接近预期的效果,但是卡片的尺寸略有变形,这是一个问题。
有什么方法可以将 pdf 连接到特定大小的网格中吗?
如果您的所有卡片都是额外 pdf 文件中的单页,那么您可以使用
foreach
循环遍历页面,并将它们放入新文件中的网格中,调用 includegraphics
并使用单个页码。
为了使网格居中,我在单页之间使用
hfill
,在下面的示例中,在 3 页之后我添加了 vspace
。
下面的示例代码会将
cards.pdf
的前 6 页重新排列为网格。如果您想调整原始页面的大小,可以使用 size
参数。
\documentclass[a4paper, 11pt]{scrartcl}
\usepackage{pgffor}
\usepackage{ifthen}
\usepackage{graphicx}
\usepackage{intcalc}
\usepackage[margin=1.25cm]{geometry}
\begin{document}
\foreach \i in {1, ..., 6}{
\ifthenelse{\equal{\intcalcMod{\i}{3}}{1}}{
\hfill
}{}
\includegraphics[scale=1, page=\i]{cards.pdf} \hfill
\ifthenelse{\equal{\intcalcMod{\i}{3}}{0}}{
% important blank line for line break
\vspace{0.5cm}
% important blank line for line break
}{}
}
\end{document}
对于上面的示例,这是没有循环的等效代码。
\documentclass[a4paper, 11pt]{scrartcl}
\usepackage{graphicx}
\usepackage[margin=1.25cm]{geometry}
\begin{document}
\hfill \includegraphics[scale=1, page=1]{cards.pdf} \hfill \includegraphics[scale=1, page=2]{cards.pdf} \hfill \includegraphics[scale=1, page=3]{cards.pdf} \hfill
\vspace{0.5cm}
\hfill \includegraphics[scale=1, page=4]{cards.pdf} \hfill \includegraphics[scale=1, page=5]{cards.pdf} \hfill \includegraphics[scale=1, page=6]{cards.pdf} \hfill
\end{document}
在我的项目中,这段代码非常有效。