创建PDF发票 - 是否有模板解决方案?

19

我们公司正在开发一个新系统,希望将发票整合进去。

我们需要一种解决方案来创建发票的布局,然后将其转换为PDF格式。

我们考虑过使用HTML/CSS进行布局,然后转换为PDF。我们也考虑使用SVG->PDF转换。

这两种解决方案都能很好地融入我们现有的网页应用程序模板语言中。

在历史上,我们是基于Microsoft的业务,并使用Crystal Reports完成此任务,但我们正在寻找一个针对此项目的开源Linux解决方案。

是否有人有任何建议,可供我们用于此任务的方法或技术?

22个回答

10

尝试这样做...使用Word(或者你想用的其他工具)创建一张空白发票,并将其保存为PDF文件。

然后使用PDF库来修改PDF文件(在特定的坐标处插入文本)。我们在Microsoft世界中这样做非常简单。

最大的好处是我们可以使用自己的工具来创建和修改模板。如果我们想添加一些静态文本,我们只需要打开Word,进行更改并将其保存为PDF文件(作为模板使用)。

对于Microsoft,我们使用iTextSharp,它实际上是原始的iText Java版本的C#端口


此外...

您可以使用Adobe Acrobat在PDF中插入字段(地址、电话、发票编号、行项目1、行项目2等),然后在运行时使用iText/iTextSharp填充这些字段。

这就是我们所做的,而且非常容易。


1
修改PDF应用程序将会非常繁琐,因为PDF文件的结构。每个元素都有一个固定的位置,并且没有'重新排版'的东西可以让您在保留布局的同时调整内容。 - Jasper Bekkers
@Jasper - 如果我们在谈论发票,那并不难。你知道可以输入文本的坐标,通常一次只需要一行。顺便说一句...我更新了另一个想法。 - Jason
啊,是的,我可能没有考虑到使用情况。我避免像那样生成PDF文件的原因是因为在合同管理系统中它不会起作用,这将不得不拉出各种花招来获得漂亮的文本。 - Jasper Bekkers
你有如何编辑模板 PDF 的示例代码吗?谢谢。 - Hassen

10

通常的方法是安装(La)TeX(可能已经在Linux上安装),然后运行pdflatex以获得pdf文档。如果您喜欢xslt和xsl-fo,也可以使用Apache FOP。

如果要创建的发票数量较少,则可以使用OpenOffice(直接或作为工具包)。

如果您需要高精度定位和低级别访问,则低级pdf库(我不知道iTextSharp是否适用于mono)可能是您想要的。

我建议首先尝试使用LaTeX,因为它可以用最小的努力获得结果。


1
FOP、XSLT和XSL-FO对此来说过于复杂了,它们是一场噩梦。(在我看来) - Jason

7

我之前是通过模板化PostScript文件并使用Ghostscript的ps2pdf将其转换为PDF来生成发票。


+1 - Postscript并不难生成。如果必要的话,您可以查看DTP或绘图程序的输出。 - ConcernedOfTunbridgeWells
嗯,是的,但我所有的都是手工制作的;-) - Alnitak
我喜欢这条路线。你能推荐一些在线可用的模板,以便了解如何完成吗? - Mig

6
我们使用Python的Reportlab。如果您四处看看,会发现有很多现成的表单/发票等。

它不是免费的,但它非常全面,而且工作做得很好。 - btk
有一个免费的开源版本:http://www.reportlab.com/software/opensource/ - hoju
我使用reportlab创建了这个FedEx发票生成器项目。https://github.com/radzhome/fedex-commercial-invoice 如果有其他通用发票需要添加,我很乐意接受。 - radtek

3

有几个开源报告引擎(Jasper Reports, PentahoBIRT)可以像历史上使用Crystal Reports一样使用。其中一个其他帖子提到了ReportLab,如果您正在使用Python或可以在应用程序中嵌入Python运行时,则可以选择此选项。



2
如果我理解正确,这里有两个步骤:
1)创建具有占位符的PDF模板,以便在程序运行时填充数据
2)在运行时通过编程方式填充PDF模板
对于第一步,OpenOffice可以创建PDF模板,然后可以通过编程方式填充。它足以创建简单的发票,可能不涉及datagrid/table之类的东西。
对于第二步,你已经在这里找到了答案 - iText,iTextSharp。
希望这能帮到你!

我目前正在使用Open Office创建原始的PDF模板,然后使用iTextSharp来以编程方式插入数据到表单字段中。我将字段的边框设置为不可见,这样用户就看不出它是一个文本字段了! - John B

2

最灵活的解决方案可能是创建包含发票数据的XML,然后通过使用XSLT将其转换为PDF、HTML或其他格式。


1
使用XSLT(和XSL-FO)进行精确格式化并不容易。 - Stephan Eggermont

2

这取决于您的环境。如果您可以访问Java,您可以查看iText (http://www.lowagie.com/iText/),这是一个允许您动态生成PDF文件的库。


1

不确定你在这里的目标是什么,但有一个名为fpdf的开源php库,它还有一个扩展可以采用预制pdf作为布局,然后填充更多内容,生成带有该信息的新PDF。

然而,我会选择一个可以很好地集成到您正在构建的平台中的解决方案,但我不会选择HTML-> PDF解决方案,因为在这种环境中,您不会知道什么适合纸张大小,这意味着您不知道何时应将内容拆分为两个单独的模板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接