使用 XSL-FO 在 .NET 中生成 PDF

Posted

技术标签:

【中文标题】使用 XSL-FO 在 .NET 中生成 PDF【英文标题】:Generating PDF in .NET using XSL-FO 【发布时间】:2010-11-09 03:03:01 【问题描述】:

我需要使用 XSL-FO 在 .NET 中生成 pdf。不乏图书馆可以做到这一点。你会建议我使用什么库,为什么?

【问题讨论】:

【参考方案1】:

这是一个老问题,我知道,但迄今为止没有一个答案真正解决了 OP QUESTION。她询问使用 XSL-FO 的选项,而不是“如何使用代码生成 PDF?”。

关于实际问题的主要非商业性答案是:

Apache.org 项目的 FOP

格式化对象处理器。它采用符合 XSL-FO 的 xsl 代码和 xml,并根据 XSL-FO 规范生成 PDF 文件。还有其他几种商业选择:

Ibex PDF 创建器 天线屋 RenderX

如果您正在寻找一个可行的开源选项,FOP 就是它。 FOP 本身是一个 Java 库,但它已通过 nFOP project 中的 J# 移植到 .NET(我知道这有它自己的问题)。

【讨论】:

【参考方案2】:

我过去使用过Ibex PDF generator。我被投入到一个已经获得许可的项目中,所以我真的别无选择。起初我认为它很麻烦,但最终我习惯了它的工作方式。

我建议您也使用一些好的 XML/XSL 编辑器来测试 XSL/XPath。 XML Copy Editor 是一个不错的免费开源软件。

【讨论】:

【参考方案3】:

几年前我研究了一些选项。以下是候选名单:iTextSharp、SharpPDF、Report.NET、NFop 和 Siberix Report Writer。最终我选择了 Siberix,但我现在认为 iTextSharp 会是更好的选择。如果对您有帮助,您可以了解更多here。

【讨论】:

【参考方案4】:

http://fonet.codeplex.com/

FO.NET 是您的图书馆

【讨论】:

【参考方案5】:

嗯,我在大约 2 年前使用了几次 iText(开源),但我不推荐这个。主要原因是缺乏文档,我真的不喜欢 API,它只是觉得在调用函数之前设置全局变量已经过时了。

您需要使用 XSL-FO 的原因是什么?我还使用了 ABC-pdf(commercial),它允许用户将 html 页面(包括样式表)转换为 pdf 文档,或者您可以使用简单且文档化的 API。

【讨论】:

我正在尝试为一所大学生成信件。我怀疑我能否获得购买商业产品的资金,因此必须提供免费解决方案。至于使用 XSL-FO,我可以使用不同的东西。你有什么建议吗?使用 XSL-FO 似乎是生成 pdf 的标准方式,但我可能错了。【参考方案6】:

如果您可以使用不同的东西,您可以尝试使用适用于 .NET 的 PdfSharp + MigraDoc.DocumentObjectModel 库(请参阅http://www.pdfsharp.net/)。两者都有 MIT 许可证,可以在商业项目中免费使用。

您可以从一个 nuget 包 (https://www.nuget.org/packages/PDFsharp-MigraDoc/) 安装此库。

然后,您可以使用MigraDoc.DocumentObjectModel.Document 类定义您的PDF DOM,并使用PdfDocumentRenderer 类打印它。这是示例代码:

using System;
using System.IO;
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

namespace MigraDocTest

    class Program
    
        static void Main(string[] args)
        
            var document = new Document();

            // initial page setup and declare the styles
            document.DefaultPageSetup.Orientation = Orientation.Landscape;

            var mainStyle = document.Styles[StyleNames.Normal];
            mainStyle.Font.Name = "Arial";

            const string TitleStyleName = "Title";

            var titleStyle = document.Styles.AddStyle(TitleStyleName, StyleNames.Normal);
            titleStyle.ParagraphFormat.Font.Size = 12;
            titleStyle.ParagraphFormat.SpaceAfter = "0";
            titleStyle.Font.Bold = true;

            // main page section setup
            var section = document.AddSection();
            section.PageSetup.PageFormat = PageFormat.A4;
            section.PageSetup.Orientation = Orientation.Landscape;
            section.PageSetup.LeftMargin = "15mm";
            section.PageSetup.RightMargin = "15mm";
            section.PageSetup.TopMargin = "12mm";
            section.PageSetup.BottomMargin = "20mm";

            // add content to DOM here
            section.AddParagraph("Hello, world!").Style = TitleStyleName;

            // actually print document to PDF
            var pdfRenderer = new PdfDocumentRenderer(unicode: true)  Document = document ;
            pdfRenderer.RenderDocument();
            using (var stream = new MemoryStream())
            
                pdfRenderer.Save(stream, closeStream: false);
                File.WriteAllBytes(@"_output.pdf", stream.ToArray());
            
        
    

注意,MigraDoc nuget 支持 .NET Framework 2+,不支持 .NETStandard。因此,您需要定位到完整的 .NET Framework 才能使用这些库。

【讨论】:

以上是关于使用 XSL-FO 在 .NET 中生成 PDF的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSL-FO 在 PDF 中添加分页符?

使用 XSL-FO 在 PDF 中添加换行符?

如何在 PHP 中生成 PDF/A-1a pdf?

如何在 node.js 中生成 PDF

未在 laravel 中生成 PDF

在 Swift Playground 中生成 PDF