使用多个图形将DOT脚本渲染为PDF每页一个图形

时间:2014-11-19 14:10:54

标签: pdf graphviz dot

我有一个大型DOT脚本,其中定义了多个图形:

digraph Tree0 {
  ...
}

digraph Tree1 {
  ...
{
...

我可以将其呈现为postscript文件,其中每个图表都通过调用dot -Tps forest.dot -o forest.ps在单独的页面上。但是,出于性能原因,我更喜欢PDF而不是postscript(滚动和缩放更加平滑)。但是如果我使用PDF而不是PS使用相同的命令,则生成的文件只包含其中一个图形,看起来其余部分写入stdout。

使用ps2pdf将PS转换为PDF不起作用,因为图形以及PS文件的页面具有不同的大小,但生成的PDF文件将具有固定的页面大小,从而切掉部分图形。

有没有一种简单的方法可以从dot获取多图PDF,就像它可以与PS文件一起使用?如果没有,我如何将PS转换为PDF并保持不同的页面大小?

3 个答案:

答案 0 :(得分:5)

这个怎么样:dot -Tps2 forest.gv -o forest.ps | ps2pdf forest.ps

主要区别在于它使用-Tps2。根据文件:

  

ps2 使用PDF表示法生成PostScript输出。假设输出将直接转换为PDF格式。符号包括PDF边界框信息,因此生成的PDF文件可以正确地与pdf工具一起使用,例如pdflatex。此外,如果节点具有URL属性,则将其转换为PDF代码,使得当在PDF查看器(例如,acroread)中查看时,节点是到给定URL的链接。如果URL附加到图形,则将其作为基础,以便节点上的相对URL从中派生。

答案 1 :(得分:4)

我自己找到了一个解决方案,使用csplitpdftk

dot -Tpdf forest.dot | csplit --quiet --elide-empty-files --prefix=tmpforestfile - "/%%EOF/+1" "{*}" && pdftk tmpforestfile* cat output forest.pdf && rm -f tmpforestfile*
  1. dot将所有单独的pdf文件写入一个输出
  2. 使用%% EOF令牌将此输出传输到csplit并将其拆分为单独的文件
  3. 使用pdftk
  4. 将pdf文件连接到一个文件
  5. 删除临时文件
  6. 有点难看,但它正在发挥作用。

答案 2 :(得分:1)

我有一个类似的问题,要将多个图形导出为单个图像(PNG或SVG或......)。使用PS / PS2输出并转换为PDF并不令人满意,因为它有时会错误地放置组件图像(或裁剪它们),并且没有简单的方法来查看整个结果。

我最终将imagick与简单的胶水组件PNG图像并排使用。

这是一个简单的解决方案: https://gist.github.com/drmalex07/1088544cfc121acab0463691f71fef0a