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

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

【问题讨论】:

    标签: c# asp.net pdf-generation


    【解决方案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 才能使用这些库。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-09
              相关资源
              最近更新 更多