【问题标题】:Render DOT script with multiple graphs to PDF one graph per page将具有多个图形的 DOT 脚本渲染为 PDF 每页一个图形
【发布时间】:2021-12-28 08:32:10
【问题描述】:

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

digraph Tree0 {
  ...
}

digraph Tree1 {
  ...
{
...

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

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

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

【问题讨论】:

    标签: pdf graphviz dot


    【解决方案1】:

    这个呢:dot -Tps2 forest.gv -o forest.ps | ps2pdf forest.ps

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

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

    【讨论】:

    • 这是有效的,比我丑陋的解决方法更好的解决方案。非常感谢。
    【解决方案2】:

    我自己找到了一个解决方案,使用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. 将此输出传送到csplit 并使用 %%EOF 令牌将其拆分为单独的文件
    3. 使用pdftk将pdf文件合并为一个
    4. 删除临时文件

    有点难看,但它正在工作。

    【讨论】:

    • 这个解决方案解决了一个额外的问题,即让每个图表的页面大小与其图表正确。另一种方法系统地裁剪了我的一个数据集。
    【解决方案3】:

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

    我最终使用 imagick 来简单地并排粘贴组件 PNG 图像。

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

    【讨论】:

      【解决方案4】:

      (1) GraphViz 似乎改变了驱动程序的命名方式,所以-Tps2(来自@Augustin 的回答)对我不起作用。但是,-Tps:cairo:cairo 确实有效。 (可以使用dot -Tps: 获取ps 驱动程序列表。)

      (2) 通过将- 传递给ps2pdf,可以直接将dot 的输出通过管道传递给ps2pdf,而无需中间的forest.ps 文件。

      这两个导致以下命令,这对我有用。

      dot -Tps:cairo:cairo forest.gv | ps2pdf - >forest.pdf
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        相关资源
        最近更新 更多