Voor een project heb ik een C# .net oplossing nodig voor PDF documenten die server side gegenereerd worden en in de WPF client getoond en geprint worden. Een vereiste is dat het document in de WPF applicatie getoond wordt. En ook silent printen mogelijk is ofwel printen zonder weergave van het document.
Het Telerik WPF control RadPdfViewer is hier uitermate geschikt voor.
http://www.telerik.com/products/wpf/pdf-viewer.aspx
Het aanbieden van een pdf document in de vorm van een byte[] ontvangen via WCF gaat eenvoudig:
private void ShowDocument(byte[] documentAsByteArray)
{
Stream str = new MemoryStream(documentAsByteArray);
pdfViewer.DocumentSource = new PdfDocumentSource(str);
}
Printen naar de standaardprinter zonder weergave gaat met een paar regels code:
private void PrintDocument(byte[] documentAsByteArray)
{
Stream str = new MemoryStream(documentAsByteArray);
var rdPdfViewerPrint = new RadPdfViewer();
var prvdPdfPrint = new PdfFormatProvider(str,
Telerik.Windows.Documents.Fixed.FormatProviders.FormatProviderSettings.ReadOnDemand);
rdPdfViewerPrint.Document = prvdPdfPrint.Import();
rdPdfViewerPrint.Print(new PrintSettings(@"Document", true));
}
Printen naar een andere printer kan door gebruik te maken van de PrintDialog class
private void PrintDocument(byte[] documentAsByteArray, string printerName)
{
Stream str = new MemoryStream(documentAsByteArray);
var rdPdfViewerPrint = new RadPdfViewer();
var prvdPdfPrint = new PdfFormatProvider(str,
Telerik.Windows.Documents.Fixed.FormatProviders.FormatProviderSettings.ReadOnDemand);
rdPdfViewerPrint.Document = prvdPdfPrint.Import();
var queue = new LocalPrintServer().GetPrintQueue(printerName);
var dialog = new PrintDialog();
dialog.PrintQueue = queue;
var defaultPrintTicket = queue.DefaultPrintTicket;
rdPdfViewerPrint.Print(dialog, new PrintSettings(@"Document", false));
}