Mathematica能创建多页PDF文件吗?

10
当使用以下代码将一个多页的pdf文件(我想到的文件包含艺术品的图像,每个页面一个)导入到Mathematica 8.0.1中时:

book = Import["simple.pdf"]

Mathematica会返回一个图形对象列表,每个页面一个。对于每个页面,您可能需要进行一些操作,并想将更改后的页面保存回单个PDF文件中:

Export["DistortedSimple.pdf", distortedbook]

然而,导出后的文件上所有的图片都在单个页面上。你是否知道一种方便的方法可以将图像列表导出成一个PDF文件,每页一个图像?
3个回答

5

你好 Kevin!

我刚刚进行了评估:

Print[ExampleData[#]] & /@ Take[ExampleData["TestImage"], 6]

Export["Desktop/Kevin.pdf", EvaluationNotebook[]]

使用 V8.0.1 适用于 OS X,生成的 PDF 被拆成了四页。因此,我认为最好的方法是(以编程方式)创建一个包含您修改后的图像的笔记本,并导出该笔记本。

你好 Brett,好久不见了!这将其存入文件中,但生成的文件并不适合课堂(也不适合在 Kindle 上)显示。我需要更多的逐页控制... - Kevin O'Bryant
@Sjoerd,我只是还没有将8.0.4版本的Mathematica设置为我的dock中的版本。 - Brett Champion

5

使用Export似乎不可能实现,无论我如何调整Pages元素(除了其他人提供的基于笔记本的解决方案)。

另一种选择是安装pdftk(一个相对较小的命令行工具,我们将用它来组装页面),并使用以下Mathematica函数:

exportMultipagePDF[name_String, g_List, options___] :=
  Module[
    {fileNames, quote},
    quote[s_] := "\"" <> s <> "\"";
    fileNames = 
      Table[
        FileNameJoin[{$TemporaryDirectory, "mmapage" <> IntegerString[i] <> ".pdf"}],
        {i, Length[g]}
      ];
    Check[
      Export[#1, #2, "PDF", options] & @@@ Thread[{fileNames, g}], 
      Return[$Failed]
    ];
    If[
      Run["pdftk", Sequence @@ (quote /@ fileNames), "cat output", name] =!= 0,
      Return[$Failed]
    ];
    DeleteFile /@ fileNames;
  ]

在Windows中,我需要在将文件名传递给PDFtk之前对其进行引号处理。我不知道其他平台是否需要这样做,希望不会引起任何麻烦。
请尝试使用。
exportMultipagePDF["test.pdf", Table[Graphics[{Hue[x], Disk[]}], {x, 0, 1, .2}]]

从哲学上讲,我最喜欢这种方法,但它返回$Failed(来自Run命令,它本身返回32512)。我使用的是Mac OS X 10.6... - Kevin O'Bryant
@Kevin,它是否仍然创建PDF文件?您是否安装了pdftk,并且可以从命令行运行它? - Szabolcs
如果我将printCommand的输出剪切并粘贴到终端中,所需的pdf文件就会被创建(您的6页测试文件,无论是否使用引号都可以)。但是,如果将其剪切并粘贴到运行命令中,则不会创建任何文件,并返回32512。 - Kevin O'Bryant
@KevinO'Bryant 我认为32512意味着“找不到命令”,因此从Mathematica的角度来看,pdftk不在路径中... - Szabolcs
将“pdftk”更改为“/opt/pdflabs/pdftk/bin/pdftk”,这是pdftk选择安装的位置,可以解决问题!我仍然不完全清楚为什么它可以在命令行的任何目录下工作,但是在运行时需要完整路径,但它可以正常工作。谢谢,Szabolcs。 - Kevin O'Bryant
显示剩余2条评论

3
尝试将笔记本保存为PDF而不是将单元格集导出为PDF。
编辑:
为确保页面间隔设定正确,将屏幕环境设置为Printing(您可以通过菜单命令编程方式进行设置),并使用相关的菜单命令插入页面间隔。这个指南页面可能会有帮助。
从你的评论中听起来,你需要为转换后的图像设置ImageSize选项,以确保在显示屏幕上时大小符合要求。

这个方法可以用,但并不完全令人满意。图片太小了,所以我失去了对分页的控制(我希望每次比较时新旧图片在同一页上)。此外,在全屏查看PDF时,图片没有按照屏幕缩放(就像原始文件中一样),而是整个页面都被缩放了。这使得图像变得非常模糊。 - Kevin O'Bryant
@KevinO'Bryant,您可以通过在需要的位置插入分页符并适当缩放图形来解决这些问题。我会在我的答案中添加更多细节以进行阐述。 - Verbeia
有一件事我现在无法检查(不在附近的Mathematica安装),那就是编程中的NotebookSave命令是否适用于保存为PDF格式。http://reference.wolfram.com/mathematica/ref/NotebookSave.html - Verbeia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接