PDF 操作:“2-Up”页面布局

PDF 操作:“2-Up”页面布局

我有一个 PDF(由 PowerPoint 生成),包含 8.5×5.5 英寸的肖像页面。

我需要将其转换为 8.5×11 英寸的横向页面,其中每个横向页面包含原始(较小)纵向页面的两个并排副本。

在 ASCII 艺术中:

原创 | 期望
           |
  |---| | |---| |---|
  | 1 | | | 1 | | 1 |
  | 1 | | | 1 | | 1 |
  |---| | |---| |---|
           |
  |---| | |---| |---|
  | 2 | | | 2 | | 2 |
  | 2 | | | 2 | | 2 |
  |---| | |---| |---|

有没有免费的方法可以做到这一点,或者我需要用 C# 来做到这一点?

答案1

使用 pdfcreator(开源虚拟打印机驱动程序)“打印”它。

//编辑: 另一个选择是使用 pdftk (http://www.accesspdf.com/pdftk/),但我自己还没有测试过。

答案2

好的,你通过访问 PDF 的源文件(Powerpoint 文件)解决了这个问题。如果你想在不访问源文件的情况下实现同样的效果,你该怎么做?

让我试一试。我将使用...

  1. Ghostscript 用于将输入的 PDF 页面放置并移动到新的媒体尺寸上;
  2. pdftk 将两个不同的 PDF 页面叠加到一个页面上。

第一步:使用 Ghostscript 将图像放置在更大的媒体上

以下是我们希望通过以下方式实现的目标Ghostscript在此步骤中:

+-----------+-----------------------+
| Original  |  Ghostscript-output   |
+===========+=======================+
|  +---+    |  +---+---+  (right    |
|  | p |    |  | p |   |   half     |
|  | 1 |    |  | 1 |   |   of sheet |
|  +---+    |  +---+---+   empty)   |
|           |                       |
|  +---+    |  +---+---+  (left     |
|  | p |    |  |   | p |   half     |
|  | 2 |    |  |   | 2 |   of sheet |
|  +---+    |  +---+---+   empty)   |
+-----------+-----------------------+

这是第一个要使用的命令:

gswin32c.exe ^
 -o left-side-outputs.pdf ^
 -sDEVICE=pdfwrite ^
 -g7920x6120 ^
 -dPDFSETTINGS=/prepress ^
 -c "<</PageOffset [0 0]>>setpagedevice" ^
 -f powerpoint.pdf

我把所有页面图像移动了……什么也没有,只是把它们放在了更大的纸张上。我懒得打字并解释选择奇数页码所需的所有选项,所以现在我只是对所有页面都这样做。——所以这就是我们做过目前实现:

+-----------------------+
|  Ghostscript-output   |
+=======================+
|  +---+---+  (right    |
|  | p |   |   half     |
|  | 1 |   |   of sheet |
|  +---+---+   empty)   |
|                       |
|  +---+---+  (right    |
|  | p |   |   half     |
|  | 2 |   |   of sheet |
|  +---+---+   empty)   |
|                       |
|  +---+---+  (right    |
|  | p |   |   half     |
|  | 3 |   |   of sheet |
|  +---+---+   empty)   |
|  .........            |
+-----------------------+
 (left-side-outputs.pdf)

现在将所有图像放在右边:

gswin32c.exe ^
 -o right-side-outputs.pdf ^
 -sDEVICE=pdfwrite ^
 -g7920x6120 ^
 -dPDFSETTINGS=/prepress ^
 -c "<</PageOffset [396 0]>>setpagedevice" ^
 -f powerpoint.pdf

这是我们通过第二条命令实现的结果:

+-----------------------+
|  Ghostscript-output   |
+=======================+
|  +---+---+  (left     |
|  |   | p |   half     |
|  |   | 1 |   of sheet |
|  +---+---+   empty)   |
|                       |
|  +---+---+  (left     |
|  |   | p |   half     |
|  |   | 2 |   of sheet |
|  +---+---+   empty)   |
|                       |
|  +---+---+  (left     |
|  |   | p |   half     |
|  |   | 3 |   of sheet |
|  +---+---+   empty)   |
|  .........            |
+-----------------------+
 (right-side-outputs.pdf)

第二步:使用 pdftk.exe 叠加页面。

如果你尚未安装,请下载从这里。它不需要真正的安装。它是一个可从任何位置运行的 .exe 文件。我们希望结果看起来像这样:

+---------------------+-------------+
| pdftk input         | pdftk output|
+=====================+=============+
| +---+---+ (right    | +---+---+   |
| | p |   |  half     | | p | p |   |
| | 1 |   |  of sheet | | 1 | 2 |   |
| +---+---+  empty)   | +---+---+   |
|                     |             |
| +---+---+ (left     |             |
| |   | p |  half     |             |
| |   | 2 |  of sheet |             |
| +---+---+  empty)   |             |
+---------------------+-------------+

我们将使用这些命令:

pdftk.exe ^
   A=left-side-outputs.pdf ^
   B=right-side-outputs.pdf ^
   cat A1 B2  ^
   output 2up-powerpoint-page-1.pdf ^
   verbose

pdftk.exe ^
   A=left-side-outputs.pdf ^
   B=right-side-outputs.pdf ^
   cat A3 B4  ^
   output 2up-powerpoint-page-2.pdf ^
   verbose

好的,到目前为止我们只创建了前两个双页...但是,我现在想将这两个双页连接成一个文件:

pdftk.exe ^
  A=2up-powerpoint-page-1.pdf ^
  B=2up-powerpoint-page-2.pdf ^
  cat A B ^
  output 2up-powerpoint-all.pdf

现在您应该有足够的灵感来处理剩下的页面...如果您非常有野心,您甚至可以使用一个命令行编写脚本,使用两个嵌套for /l ...循环;-)

答案3

我通过生成第二个 PowerPoint 演示文稿(每张幻灯片有两份副本)、将其保存为 PDF 并以每张纸两页的形式打印 PDF 来解决这个问题。

答案4

这也可以使用 Python 和 PyPDF2 来完成https://pythonhosted.org/PyPDF2/index.html

您可以在另一篇文章中看到一些示例代码:https://superuser.com/a/1508283/590044

相关内容