【问题标题】:How do I join multiple pdf files of different dimensions?如何加入多个不同尺寸的pdf文件?
【发布时间】:2019-04-04 07:04:34
【问题描述】:

我需要将多个 pdf 文件合并成一个单页 pdf。我需要将我生成的一些 PDF 拼接在一起。如果我水平拼接,所有 PDF 的高度相同但宽度不同。当我垂直拼接时,所有 PDF 的宽度相同但高度不同。

我发现很多答案都说用 pdfjam/pdfnup 来做这件事。我试过了,但似乎只适用于每个要加入的项目是相同的维度,否则我无法让它正常工作。

我真的更喜欢在 ghostscript 中执行此操作,因为我的 PDF 操作的其余部分已经在 ghostscript 中完成。不过我还没有找到解决方案。

例如,我正在拼接的项目看起来很像这样:

┌---------------------------------------┐
┬-┬----------------┬-┬----------------┬-┬
| |                | |                | |
| |                | |                | |
| |                | |                | |
| |                | |                | |
| |                | |                | |
| |                | |                | |
| |                | |                | |
┴-┴----------------┴-┴----------------┴-┴
└---------------------------------------┘

我首先尝试水平连接形成中心部分的 5 个框。然后我需要将它与它上方和下方的框连接起来。

【问题讨论】:

  • 您需要对大量文件执行此操作吗?这实际上是 Acrobat Pro 中一个相当简单的自动化练习。对于 10 个文件但不是数百个文件,这是一个很好的解决方案。这对你来说是一个选择吗?
  • 这是一个我必须从命令行重复多次的过程。

标签: pdf ghostscript


【解决方案1】:

我的回答 here 包含一个 PostScript 程序,该程序与 Ghostscript 一起工作,并且仅适用于最高 9.26 的版本,但可以拼版。

该程序会执行大量您不想要的内容,它假定您正在尝试将 2 个输入页面适合特定尺寸的媒体,并缩放和旋转页面以使其最适合。你不会想这样做的。

本质上,您希望将当前点移动到每个页面的开头,绘制页面内容,然后将当前点移动到下一页的开头,绘制该页面的内容,等等。

从广义上讲,这是:

%%
%% First we open the PDF file
%%
File dup (r) file runpdfbegin pop
process_trailer_attrs

然后打开 PDF 文件:

  pdfgetpage                                             %% get the page from the PDF file, stack: -save- -save- loop -dict-
  dup /Page exch store                                   %% save a copy of the page dict inside itself
  pdfshowpage_init                                       %% initialise the page
  draw_page_content                                      %% se above, draws the graphical objects, stack -save- -save- loop

绘制一个页面(pdfgetpage 需要一个从 0 开始的数字,用于从 PDF 文件中绘制页面)。

这个:

PageXTx PageYTx translate                                %% Move to draw page 2

移动当前点。

这就是您需要的所有操作,将它们放在一起由您决定。您需要计算出最终“页面”的总大小,并使用该设置作为媒体大小启动 Ghostscript(使用 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGHTPOINTS),然后您需要计算出每个页面在该页面上的位置“子页面”(请记住,PDF 的原点位于左下角)移动到该位置,绘制页面,对每一页重复。

最后你需要执行:

showpage

以便刷新最终绘制的页面,然后理想情况下:

//runpdfend exec                                             %% End the PDF file

所以它是可能的,但正如您所看到的,在当前的实现中并非微不足道。再次让我指出,这将适用于大于 9.26 的 Ghostscript 版本。

【讨论】:

  • 这太棒了,谢谢!我不知道如何通过 -c switch one liners 运行 postscript 程序,但我相信一些谷歌搜索会帮助我。这将使工作变得更加简单,因为所有 5 个窄条都只是空白条。能够移动光标并绘制下一个文件,这正是我正在寻找的答案类型。我今天会试一试,再次感谢!
  • 显然你会想把修改后的程序写到文件中,然后像 2-up.ps 一样运行文件,所以像:gs -sFile= 2-up.ps
  • 是的,很抱歉。我在我的手机上,还没有去过你的其他链接。看起来这绝对是答案,我现在只是想理解 PostScript。再次感谢!
  • 我试图拼凑一个概念证明,但惨遭失败。我的 POC 和我得到的输出在这里:gist.github.com/brandoncc/8c01c4bcf123f0321e9f1b9a6b23e226 如果你有时间,你介意看看并告诉我问题是否突然出现在你身上吗?如果没有,我理解。谢谢!
  • 干得好!我很高兴它为你工作。恐怕你的额外 cmets 对我来说是在夜间,所以我才看到它们。
猜你喜欢
  • 2017-03-25
  • 2020-12-26
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 2018-03-20
  • 2023-03-06
相关资源
最近更新 更多