![在单个 PDF 页面上剪辑多个 PDF 图像并按彼此的尺寸缩放?](https://linux22.com/image/273037/%E5%9C%A8%E5%8D%95%E4%B8%AA%20PDF%20%E9%A1%B5%E9%9D%A2%E4%B8%8A%E5%89%AA%E8%BE%91%E5%A4%9A%E4%B8%AA%20PDF%20%E5%9B%BE%E5%83%8F%E5%B9%B6%E6%8C%89%E5%BD%BC%E6%AD%A4%E7%9A%84%E5%B0%BA%E5%AF%B8%E7%BC%A9%E6%94%BE%EF%BC%9F.png)
我认为“montage”在这里是最合适的术语,因为在 Latex 中我们主要处理多页文档(我担心“连接”、“附加”、“收集”等术语在这种情况下可能会被误解)。我想做一些类似于 选项nup
的事情,只是单独旋转和缩放。无论如何,让我通过一个使用 ImageMagick和命令pdfpages
的纯图像示例向您展示我想要的东西。convert
montage
假设我有一个输入图像文件,testred.png
大小为 350x250 像素,生成方式如下:
convert -size 350x250 xc:red -pointsize 40 -draw "text 0,40 'testRED'" testred.png
然后,我有第二个图像文件:testgreen.png
,大小为 300x200 像素:
convert -size 300x200 xc:green -pointsize 40 -draw "text 0,40 'testGREEN'" testgreen.png
我想要做的是:旋转第二幅图像;缩放/调整大小,使第二幅图像的旋转宽度(原始高度)与第一幅图像的宽度相匹配;将第二幅图像放置在第一幅图像下方,没有任何填充;并输出该蒙太奇的文档,没有任何边距。使用 ImageMagick 的montage
,可以通过以下方式实现(注意,左括号和文件名之间必须有一个空格!\(
testgreen.png
):
montage testred.png \( testgreen.png -rotate 90 -resize $(identify -ping -format "%w" testred.png)x \) -geometry +0+0 -tile 1x testmontage.png
# ... or as single line:
montage testred.png \( testgreen.png -rotate 90 -resize $(identify -ping -format "%w" testred.png)x \) -geometry +0+0 -tile 1x testmontage.png
输出文件testmontage.png
的大小为 350x775 像素:
$ file testmontage.png
testmontage.png: PNG image data, 350 x 775, 16-bit/color RGB, non-interlaced
...看起来像这样:
...这就是我想要的。
请注意,这里对我来说重要的一点是,我无需在任何地方明确地用数字方式计算第二个文件的新大小(尽管我需要调用identify
一个子 shell 来获取这些信息)。
现在,我想做同样的事情 - 但使用 PDF 文件。ImageMagick 的转换可以再次用于生成相同的输入文件,但作为 PDF:
convert -size 350x250 xc:red -pointsize 40 -draw "text 0,40 'testRED'" testred.pdf
convert -size 300x200 xc:green -pointsize 40 -draw "text 0,40 'testGREEN'" testgreen.pdf
虽然尺寸以像素单位指定,但在 PDF 中被解释为点单位:
$ pdfinfo testred.pdf | grep 'Page size'
Page size: 350 x 250 pts
$ pdfinfo testgreen.pdf | grep 'Page size'
Page size: 300 x 200 pts
我知道如果我将该standalone
类用于单个 PDF 图像,即使没有任何明确的尺寸规范:
% file: montager.tex
\documentclass{standalone}
\usepackage{graphicx}
\begin{document}
\includegraphics{testred.pdf}
\end{document}
...输出 PDF 文件将被调整大小,因此它与输入 PDF 大小(几乎完全)匹配:
$ pdflatex montager.tex
...
Output written on montager.pdf (1 page, 262127 bytes).
Transcript written on montager.log.
$ pdfinfo montager.pdf | grep 'Page size'
Page size: 349.999 x 249.999 pts
...这很好。
但是,我不确定如何从这里继续,因为最简单的方式是定位和获取要缩放的长度。请注意\paperwidth
,\linewidth
等在\begin
/\end
部分内不会发生变化(我不知道我还能在哪里获取宽度信息); 和\par
等\\
打开新行(所以我在下面定位)要么被忽略,要么崩溃pdflatex
。
我很确定tikz
它可以用于此 - 但已经有一段时间了,我已经忘记了大部分内容......所以我想,让我问一个问题:)
答案1
好吧,我想我解决了它——tikz
确实是可行的方法:
% file: montager.tex
\documentclass{standalone}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}
\node[inner sep=0] (testred) at (0,0){
\includegraphics{testred.pdf}
};
\draw let \p1 = (testred.west), \p2 = (testred.east) in
node[inner sep=0,below=0mm of testred,text width={\x2-\x1}] (testgreen) {
\includegraphics[height=\linewidth,angle=-90,origin=c]{testgreen.pdf}
};
\end{tikzpicture}
\end{document}
笔记:
- 应该使用
positioning
Tikz 库,以便能够使用below=<optional length> of ...
语法,因此节点之间的可选空间可以设置为零(参见TikZ:什么影响放置节点之间的空间below of=
?) - 应该使用
calc
Tikz 库,以便计算第一个节点的宽度,并将其应用为text width
第二个节点(参见TikZ:以编程方式将宽度应用于节点,以及“未定义的控制序列 pgf”)- 一旦
text width
设置了节点;内部\includegraphics
便会将其视为\linewidth
; - 还要注意,旋转是作为
\includegraphics
命令的一部分完成的 - 而不是在封闭节点的上下文中完成的
- 一旦
结果是:
$ pdflatex montager.tex
...
$ pdfinfo montager.pdf | grep 'Page size'
Page size: 350.398 x 776.074 pts
... 一点也不差!下面是生成的 PDF 图像(与 OP 中的图像几乎相同):
...我通过以下方式获得:
convert -density 72 montager.pdf montager-pdf.png
看起来和我想要的差不多 - 所以我又恢复快乐了,:)
干杯!