【问题标题】:A simple way to insert a table of contents in a multiple page pdf generated using PdfPages在使用 PdfPages 生成的多页 pdf 中插入目录的简单方法
【发布时间】:2017-07-01 14:59:44
【问题描述】:

我正在使用 Pandas 从一些数据文件中读取数据并使用 PdfPages 生成多页 pdf,其中每一页都包含来自一个数据文件的 matplotlib 图形。如果能够在每个页面上获得链接的目录或书签,那就太好了,这样我就可以轻松找到与给定数据文件相对应的数字。有没有一种简单的方法可以在 python 3.5 中实现这一点(例如通过某种方式插入数据文件的名称)?

【问题讨论】:

  • 也对答案感兴趣。
  • 我只知道一种解决方法 - 使用 TeX。能直接在matplotlib中做书签就好了。

标签: python python-3.x pandas pdf matplotlib


【解决方案1】:

使用 Pandoc 的简单解决方法。

  1. 首先导入几个必要的库。
import os
import numpy as np
import matplotlib.pyplot as plt
  1. 画一些图。
def draw_fig():
    # a simple case of plotting matplotlib figures.
    if not os.path.exists('fig'):
        os.mkdir('fig')
    x = np.linspace(0, 5, 100)
    for i in range(1, 6):
        y = x + i
        plt.figure()
        plt.plot(x, y)
        plt.savefig(f'fig/fig{i}.png')
  1. 创建一个 Markdown 模板。在这个玩具示例中,每一页都包含一个由 matplotlib 导出的图形。您可以根据自己的需求定制render函数。
class PdfTemplate():
    def __init__(self, figs, filename="output", toc=True):
        self.figs = figs
        self.toc = toc
        self.filename = filename
        self.text = []
        
    def render(self):
        self._pagebreak()
        for fig in self.figs:
            self._h1(fig.split(".")[0])
            self._img(os.path.join("fig", fig))
            self._pagebreak()
        self.text = "\n\n".join(self.text)
        
    def export(self):
        md_file = f"{self.filename}.md"
        pdf_file = f"{self.filename}.pdf"
        pandoc = ["pandoc", f"{md_file}", f"-o {pdf_file}"]
        with open(md_file, "w") as f:
            f.write(self.text)
        if self.toc:
            pandoc.append("--toc")
        os.system(" ".join(pandoc))
        
    def _pagebreak(self):
        self.text.append("\pagebreak")
        
    def _h1(self, text):
        self.text.append(f"# {text}")
        
    def _img(self, img):
        self.text.append(f"![]({img})")
  1. 最后,运行代码并导出 pdf。
draw_fig()
pdf = PdfTemplate(figs=os.listdir("fig"))
pdf.render()
pdf.export()

内容页面:

图页:

【讨论】:

    【解决方案2】:

    听起来您想生成 fig{1, 2, ..., N}.pdf,然后生成一个 LaTeX 源文件,其中提到每个文件的 \includegraphics,并生成一个 ToC。如果您确实遇到了这种特殊的痒,请考虑将其打包以供其他人使用,因为它是一个非常通用的用例。

    【讨论】:

      【解决方案3】:

      我有时会根据需要在转换为 PDF 文件后生成带有表格的 HTML 文件。我知道这有点困难,但我可以控制文档中的任何元素。从逻辑上讲,如果您想写入许多文件,这不是一个好的解决方案。另一个好的解决方案是从 Jupyter Notebook 制作 PDF。

      【讨论】:

        【解决方案4】:

        如果您为每个图形创建一个 PDF,则可以使用 PyPDF2 将它们与书签合并。

        这里是文档的链接:PdfFileMerger.addBookmark

        【讨论】:

          猜你喜欢
          • 2015-11-16
          • 2012-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-04
          • 1970-01-01
          相关资源
          最近更新 更多