我有一个 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 文件)解决了这个问题。如果你想在不访问源文件的情况下实现同样的效果,你该怎么做?
让我试一试。我将使用...
- Ghostscript 用于将输入的 PDF 页面放置并移动到新的媒体尺寸上;
- 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