使用 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的主要内容,如果未能解决你的问题,请参考以下文章