![PDF 输出在代码示例中具有正确的空格](https://linux22.com/image/6854/PDF%20%E8%BE%93%E5%87%BA%E5%9C%A8%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B%E4%B8%AD%E5%85%B7%E6%9C%89%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%A9%BA%E6%A0%BC.png)
我一直在使用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 输出的以下要求:
- 可以用空格正确选择代码片段
- 结果与布局类似
rst2pdf
或readthedocs
.rst
是否有任何命令行工具可以从文件或其他标记格式开始生成 PDF 文件?
答案1
您可以使用以下管道
txttopdf.sh:
enscript -B -p- | ps2pdf -dCompressPages=false - -
生成保留源文件前导间距的 PDF。特殊ps2pdf
选项使其逐字使用中间 PostScript 的内容部分,在 PDF 中留下缩进的文本对象。您可以通过使用纯文本编辑器打开它来验证;内容部分接近尾声。
但是,这仍然取决于 PDF 查看器是否丢弃这些前导空格。例如,evince
和以前一样acroread
,他们不允许我选择查看器中的前导空白。如果我用不间断空格(ISO-8859-1)替换空格,情况也是如此。
因此,管道可以对 PDF 文件执行尽可能多的操作,然后您需要找到一个支持间距的查看器。