PDF 输出在代码示例中具有正确的空格

PDF 输出在代码示例中具有正确的空格

我一直在使用rst2pdf并将pandoc以下 reStructuredText 转换为 PDF:

This is a python example::

  def main():
      print("Hello World!")

  if __name__ == '__main__':
      main()

And one for YAML::

   server:
      name: ts0
      location: paris

尽管这两个程序使用不同的引擎来生成 PDF(pandoc甚至需要您为此安装 TeX),但结果是一个 PDF 文件,您无法从中正确地剪切和粘贴代码示例:

在此输入图像描述

突出显示的代码(绿色背景)缺少空格,因为这些 PDF 文件中会生成带有偏移量的空格。

对于许多语言来说,复制和粘贴会导致格式丑陋的代码,但对于 Occam 和 Python 等编程语言以及 YAML 中的配置文件来说,这实际上改变了含义。如果你幸运的话,实际上会破坏一些东西并且你会注意到,但是 YAML 示例eg也是正确的,没有行首的空格,它只是有不同的含义。

这种代码示例中的空格损坏现象也发生在 readthedocs 站点生成的 PDF 文档中。


如果您从以下位置获取输出:

pandoc example.rst -o example.epub

并查看生成的一页文件,您可以正确复制并粘贴代码。如果您example.epub通过其用户界面使用 calibre(版本 2.55.0)进行转换,您将获得一个 PDF 文件,您可以从中正确复制代码(带空格),但生成的 PDF 由 3 页组成。

尝试从命令行转换:

ebook-convert example.epub example.pdf 

导致渲染异常,添加--old-pdf-engine转换有效的选项,但您仍然拥有 3 页 PDF 而不是单页。

通过 HTML 转换:

rst2html example.rst > example.html; ebook-convert example.html example.pdf
pandoc example.rst -o example.html; ebook-convert example.html example.pdf

为您提供正确的可选代码:

在此输入图像描述

,但是粘贴时没有缩进的空间,甚至Hello和之间的空格也World消失了。除此之外,在较大的文件上,您会在不需要的地方出现分页符,并且布局需要通过样式表进行大量调整。

我尝试通过转换,.odt但结果是 PDF 文件中的文本完全无法选择。


考虑到 PDF 输出的以下要求:

  • 可以用空格正确选择代码片段
  • 结果与布局类似rst2pdfreadthedocs

.rst是否有任何命令行工具可以从文件或其他标记格式开始生成 PDF 文件?

答案1

您可以使用以下管道

txttopdf.sh:

enscript -B -p- | ps2pdf -dCompressPages=false - -

生成保留源文件前导间距的 PDF。特殊ps2pdf选项使其逐字使用中间 PostScript 的内容部分,在 PDF 中留下缩进的文本对象。您可以通过使用纯文本编辑器打开它来验证;内容部分接近尾声。

但是,这仍然取决于 PDF 查看器是否丢弃这些前导空格。例如,evince和以前一样acroread,他们不允许我选择查看器中的前导空白。如果我用不间断空格(ISO-8859-1)替换空格,情况也是如此。

因此,管道可以对 PDF 文件执行尽可能多的操作,然后您需要找到一个支持间距的查看器。

相关内容