任意宽度的PDF表格

2 投票
3 回答
625 浏览
提问于 2025-04-15 11:26

我知道关于PDF生成的讨论很多,但我还没找到我需要的东西。

我想从Python生成PDF报告(主要是表格)。是的,我试过ReportLab和Pisa。这两个工具在一些我认为在实际应用中并不算过分的情况下,表格的内容出现了“断裂”。

我说的“合理”是指8到12列,宽度各不相同。不是80到1200列那种。

我不需要一个原生的Python解决方案,因为我可以通过Linux命令行来运行我的脚本。

我已经在XHTML中做出了这些报告,效果差不多完美……我更希望能利用这些报告。

我想问的是:有没有人知道有什么工具可以用来在PDF中渲染任意(不过要在合理范围内)大小的表格,效果接近XHTML浏览器的渲染?

我想使用像PrinceXML这样的工具,但这个项目的规模不值得花那么多钱去买这个工具。

另外,我也尝试过用LaTeX来实现我需要的功能,我对这个不反对,但如果这是个好主意,我希望能看到一个例子。

谢谢大家,提前感谢!

3 个回答

2

使用TeX可能会给你带来不错的效果。说实话,我自己会倾向于避免使用LaTeX,因为它是一个非常复杂的宏包,我在尝试使用时从来没有真正理解过;而且,至少在我当时的审美看来,它在标记文本时显得非常啰嗦,相比我习惯使用的普通TeX来说。

真正的难点在于如何处理你数据中可能包含的所有特殊字符,这样你创建的TeX源文件就不会因为某个地方使用了&符号而出错,因为TeX会把它当成一个不合适的命令。为了让引用功能完美运行,我可能需要坐下来花半个小时研究一下TeXBook。

不过,如果你的数据只是普通字符串,那我们可以尝试不使用TeX来打印一个表格。这里有个例子:

#!/usr/bin/env python

import os

# Create a 2x3 PDF table of items, using TeX.

format = r"# \hfil & \hfil #"
data = [['Hydrogen', 1],
        ['Silicon', 14],
        ['Mercury', 80]]

table_data = r'\cr '.join('&'.join(str(i) for i in row) for row in data)

f = open('table.tex', 'w')
f.write(r"\halign{" + format + r"\cr " + table_data + r"\cr}\end")
f.close()

os.system("tex table.tex")
os.system("dvipdf table.dvi")

从这个生成的PDF中你可以看到一个大问题,就是表格没有边框。如果你查看TeXBook,你会发现虽然生成边框是可能的,但这并不是最自然或明显的操作。

想想看,也许LaTeX确实会有一些用处,特别是如果它有宏可以让创建带边框的表格变得简单的话。:-)

顺便问一下,你有没有查看过WebKit或其他浏览器后端是否可以直接从HTML生成PDF,甚至是通过命令行?它们在打印时以某种方式生成PDF;肯定有办法利用这个功能将你的HTML直接转换成PDF。

3

我完全同意Brandon Craig Rhodes的回答。如果你需要高质量的输出,TeX(无论是普通的还是带有宏包的,比如LaTeX或ConTeXt)都是一个不错的选择。不过,TeX的依赖性比较重。

如果你想找一个更轻便的替代方案,可以尝试:

  • 生成xsl-fo,然后用apache-fop来渲染,或者

  • iText周围写一个Python的封装。

这两种方法都可以制作带边框的任意宽度表格。xsl-fo学起来并不太难,如果你对XML比较熟悉,生成起来比LaTeX代码要简单。

iText是一个强大的PDF库,使用MPL和LGPL许可证。它有Java和C#版本,但遗憾的是目前还没有Python版本。

1

这个独立程序:wkhtmltopdf 正是我需要的。它把XHTML转换成PDF的效果是我见过的免费工具中最好的。

撰写回答