Wenn man ein PDF erstellen möchte, hat man die Auswahl zwischen vielen kommerziellen Produkten für .NET - mit NFop möchte ich mal eine kostenlose Möglichkeit vorstellen. NFop ist eine Portierung der Open Source Java Anwendung FOP auf .NET und dank J# kann der Quellcode auch direkt unter dem .NET Framework kompiliert werden. NFop wandelt XML Formatting Objects (XML-FO) Dokumente in PDF Dateien um. In der Regel erzeugt man die XML-FO Dokumente mit Hilfe von XSLT aus einem XML.
.NET Anwendung -> XML + XSLT -> XML-FO -> PDF
Durch Austauschen des XSLT’s kann man so einfach die Formatierung ändern, ähnlich wie bei HTML und CSS. Wie man aus seinem Datenbestand ein XML generieren kann finden sie hier.
Weil ich den NFop Code nicht ändern wollte habe ich die DLL einmal erstellt und dann in mein Projekt eingebunden. Für dieses Beispiel muss man zusätzlich noch die vjslib einbinden. Wenn man raus gefunden hat welche Namespaces man einbinden muss geht das Erstellen des PDF’s mit wenigen Zeilen Code. Weil ich das Beispiel übersichtlich halten wollte habe ich auf XSLT verzichtet und nur das XML-FO Beispiel von Wikipedia benutzt.
using java.io; using org.xml.sax; using org.apache.fop.apps; namespace XmlToPdf { class Program { static void Main(string[] args) { //erstellen eines einfachen PDFs ConvertFoDocument("helloworld.fo", "helloworld.pdf", Driver.RENDER_PDF); } static void ConvertFoDocument(string foFile, string pdfFile,int outputType) { FileInputStream input = new FileInputStream(foFile); InputSource source = new InputSource(input); FileOutputStream output = new FileOutputStream(pdfFile); Driver driver = new Driver(source, output); driver.setRenderer(outputType); driver.run(); output.close(); } } }
die helloworld.fo
<?xml version="1.0" encoding="utf-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm"> <fo:region-body region-name="xsl-region-body" margin="2cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="A4"> <!-- (in Versionen <2.0 "master-name") --> <fo:flow flow-name="xsl-region-body"> <fo:block>Hallo Welt!</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
Resultat: Als Ergebniss bekommt man ein PDF mit “Hello World!”.
Den kompletten Beispielcode kann man hier herunterladen: XmlToPdf Projekt