如何合并不同尺寸的多个 pdf 文件?
How do I join multiple pdf files of different dimensions?
我需要将多个 pdf 文件合并成一个单页 pdf。我需要将我生成的一些 PDF 拼接在一起。如果我水平拼接,所有 PDF 的高度相同但宽度不同。当我垂直拼接时,所有 PDF 的宽度相同但高度不同。
我发现很多答案都说要用 pdfjam/pdfnup 来做到这一点。我试过了,但似乎只有当每个要连接的项目都是相同的维度时才适用,否则我无法正常工作。
我真的更喜欢在 ghostscript 中执行此操作,因为我其余的 PDF 操作已经在 ghostscript 中完成。不过我还没有找到解决方案。
举个例子,我拼接在一起的项目看起来很像这样:
┌---------------------------------------┐
┬-┬----------------┬-┬----------------┬-┬
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
┴-┴----------------┴-┴----------------┴-┴
└---------------------------------------┘
我首先尝试水平连接形成中心部分的 5 个框。然后我需要将其与上方和下方的框连接起来。
我的回答 包含一个 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
移动当前点。
这就是您需要的所有操作,将它们组合在一起取决于您。您将需要计算出最终总大小 'page',并使用该设置作为媒体大小启动 Ghostscript(使用 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGHTPOINTS),然后您需要计算出该页面上的位置每个 'sub pages'(请记住原点在 PDF 的左下角)移动到该位置,绘制页面,对每一页重复。
最后你需要执行:
showpage
以便刷新最终绘制的页面,然后理想情况下:
//runpdfend exec %% End the PDF file
所以这是可能的,但如您所见,在当前的实现中并不简单。再次让我指出,这将 NOT 适用于高于 9.26 的 Ghostscript 版本。
我需要将多个 pdf 文件合并成一个单页 pdf。我需要将我生成的一些 PDF 拼接在一起。如果我水平拼接,所有 PDF 的高度相同但宽度不同。当我垂直拼接时,所有 PDF 的宽度相同但高度不同。
我发现很多答案都说要用 pdfjam/pdfnup 来做到这一点。我试过了,但似乎只有当每个要连接的项目都是相同的维度时才适用,否则我无法正常工作。
我真的更喜欢在 ghostscript 中执行此操作,因为我其余的 PDF 操作已经在 ghostscript 中完成。不过我还没有找到解决方案。
举个例子,我拼接在一起的项目看起来很像这样:
┌---------------------------------------┐
┬-┬----------------┬-┬----------------┬-┬
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
┴-┴----------------┴-┴----------------┴-┴
└---------------------------------------┘
我首先尝试水平连接形成中心部分的 5 个框。然后我需要将其与上方和下方的框连接起来。
我的回答
该程序执行大量您不想要的内容,它假设您正在尝试将 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
移动当前点。
这就是您需要的所有操作,将它们组合在一起取决于您。您将需要计算出最终总大小 'page',并使用该设置作为媒体大小启动 Ghostscript(使用 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGHTPOINTS),然后您需要计算出该页面上的位置每个 'sub pages'(请记住原点在 PDF 的左下角)移动到该位置,绘制页面,对每一页重复。
最后你需要执行:
showpage
以便刷新最终绘制的页面,然后理想情况下:
//runpdfend exec %% End the PDF file
所以这是可能的,但如您所见,在当前的实现中并不简单。再次让我指出,这将 NOT 适用于高于 9.26 的 Ghostscript 版本。