从命令行生成 PDF 并用尽可能多的图像副本填满页面?

从命令行生成 PDF 并用尽可能多的图像副本填满页面?

我对此进行了大量的搜索,但未能找到解决方案。

我如何生成具有任意纸张格式(例如 A4)的 PDF 并在其页面上填充尽可能多的图像副本?

我正在寻找一个 CLI 解决方案,使用像 ImageMagick、Poppler、Ghostscript 之类的程序。

我的用例:更改办公室客人的 Wi-Fi 密码,想要发送一个由紧密网格组成的漂亮 A4 PDF,每个单元格包含网络 SSID 和 WPA-Key,然后打印出来,剪成碎片分发给来访的客人。

找不到解决方法,只能使用 MS Word 手动将小图像粘贴到页面中。

编辑:这些小图像看起来是什么样的。只需在文本编辑器中输入文本并截取文本的屏幕截图即可。

在此处输入图片描述

我将每 3 个月更改一次此密码,因此我想要一个自动化/可编写脚本的解决方案。不需要完美,但需要快速。

答案1

根据图像尺寸等您在问题中发布的示例 JPG 文件,当我右键单击它并选择将图像另存为...,保存的文件图像属性列表为...

  • 方面: 2850 x 1237
  • 宽度: 2850 pixels
  • 高度: 1237 pixels

在此处输入图片描述

我能够使用下面的方法/命令将 24 张图像压缩成一个图像文件图像魔术师我将在下面概述。虽然我不会提供复制“x”个原始图像以获得预期结果的逻辑,但这些任务很简单,我假设您不需要这部分的帮助或示例——如果需要,请告诉我。


详细步骤...

提醒:我没有提供复制或删除文件的逻辑,我提到需要这些类型的操作,并假设您可以解决这个问题,但否则请告诉我。

  1. 您需要复制多份SSID 和 WPA-key 图像文件/folder某个地方,所以你总共有 6 张图片来运行第一个图像魔术师命令反对。

  2. 当这 6 个图像文件位于 中时/folder,您将对它们运行此命令以创建一个名为out.jpg我的示例中的新输出文件:

    convert /folder/*.jpg -gravity center -append /output/out.jpg
    
  3. 现在,您将删除 6 个原始“SSID 和 WPA 密钥图像”文件,然后将新文件复制到out.jpg/folder然后复制它,直到文件中总共有 4 个文件/folder,然后运行此命令:

    convert /folder/*.jpg -gravity center +append /output/nout.jpg
    
  4. /output然后,您可以删除按照 #3 复制的这些文件的 4 个副本,然后对nout.jpg使用上述命令创建的新文件运行此命令,以获取 a4 页格式的文件:

    convert /output/nout.jpg -page a4 /output/print.jpg
    
  5. 现在打印print.jpg图像文件并验证它看起来不错,剪切、分发等。

    在此处输入图片描述

笔记:如果您的起始图像的尺寸等与最终结果不同,并且无法正确缩放,则您需要在每个步骤中使用我引用的“x”个图像,然后一旦对这些图像运行命令,您将需要打开相关的输出文件并检查是否可以找出每个步骤应该有的“x”个。测试这个可能需要一些时间,但这是另一项很容易弄清楚的琐碎任务。


更多资源

答案2

您可以在 Pandoc 的帮助下做到这一点并输出 PDF。

第一种方法:将一行文本粘贴到 Markdown 中,而不是将图像粘贴到 MS Word 中

除了将图像粘贴到 MS Word 文档中,您还可以将此行粘贴到文本文件中,并将其命名为my-markdown.md

![](https://i.stack.imgur.com/l9TLd.jpg) { width="33%" }

这样每行就会放 3 张图片。当然,你可以将宽度修改为你想要的任何值。我猜,使用以下方法时,你可以用 60 条相同的线条来做width="33%"并且使用时有 112 条相同的行width="24%"(每行 4 张图片)。

因为你想要“任意纸张格式(例如 A4)”,我会给你一个几乎是 A4例如。您必须将其转换为 PDF,如下所示:

pandoc          \
  -o images.pdf \
  -V geometry="paperwidth=580pt, paperheight=848pt, margin=10pt" \
     images.md 

截屏:

在此处输入图片描述

第二种方法:在一个命令行中完成所有操作

由于我目前没有可用的 Windows 系统,因此我可以使用Powershell或进行确认和测试cmd.exe,我为您提供了一个 Linux/macOS Bash 示例:

for i in {1..112} ; do
    echo '![](https://i.stack.imgur.com/l9TLd.jpg){ width="24%" }' ;
done \
|    \
pandoc -V geometry="paperwidth=580pt, paperheight=848pt, margin=10pt" \
       -o images2.pdf \
       -

上面的第一部分将同一行写入 112 次<stdout>,但将其传输到 Pandoc 的<stdin>进行进一步处理,而无需写出 Markdown 文件。

在此处输入图片描述

相关内容