15
votes

I have implemented a report in standard WPF controls and have also implemented a DocumentPaginator to take these controls and convert them into a document for printing.

I have also implemented some code which uses the document paginator to render the pages to images and write them out to a PDF using PDFSharp, however this does not allow for copying and pasting, also the image quality is questionable.

I have experimented with the GhostXPS utility and was thinking of using it by saving out to an XPS document and then using GhostXPS to convert it to a PDF, this was promising, however the current version contains a bug that renders data copied from the generated PDF useless...

So I thought I would ask here to try and find a efficient method for doing this, Can someone please suggest a good way to take a DocumentPaginator and either save it directly out to a PDF, with copy/paste functionality or convert it from an XPS document to a PDF with this functionality?

Thanks, Alex.

EDIT - PDFSharp fix: Ok as requested here is what I did to compile the fix for the PDFSharp 1.31 XPS converter:

1) I downloaded the source from here:

PDFSharp - SourceForge

2) I followed the instruction in this post:

PSFSharp Fix

XpsParser.ImageBrush.cs (ln 22, added): brush.Opacity = 1;
PdfContentWriter.cs (ln 526, changed): if (opacity <= 1)

3) Then just compile the source, first open the 'PdfSharp-WPF.csproj' and build that, then open the 'PdfSharp.Xps.csproj' and build it as well, the relevent libraries are 'PdfSharp-WPF.dll' and 'PdfSharp.Xps.dll'

Note upon trying to build the source you will likely receive a few errors depending on which version of .NET you are targeting, these are simple to fix if you just read the error messages.

EDIT(2): NJones created a blog post with more details on the PdfSharp fix: Output to PDF in WPF

4
I am using custom DocumentPaginator for printing too. PDF and XPS are produced by printing to a virtual printer. It works well also for large documents.Lubo
I am trying to avoid using a virtual printer as I want to minimise user dependencies.Alex Hope O'Connor
@AlexHopeO'Connor I'm in the same boat you were with this question and would much appreciate it if you shared the fix you made to PDFSharp 1.31.N Jones
@NJones added more details to my questionAlex Hope O'Connor
@AlexHopeO'Connor Thanks! I got things working, but had to make a number of other bugfixes. I blogged about it here: nathanpjones.com/wp/2013/03/output-to-pdf-in-wpf-for-freeN Jones

4 Answers

13
votes

There is an XPS Converter that was included with PDFsharp 1.31. It's a beta version, but AFAIK it supports nearly everything and may work for your needs.

PDFsharp 1.31 can be downloaded from SourceForge or CodePlex.

3
votes

If a commercial SDK would be an option, there is one company I came across that has a professional XPS to PDF conversion option (and more).

http://www.nixps.com

Warning: I'm not affiliated with this company nor have I tried their products. I have on the other hand heard good things about them.

1
votes

I use Telerik Reporting which handles document pagination and allows you to create reports in a designer similar to creating a GUI. I decided to just buy a 3rd party product because I didn't want to spend development time writing my own paginator, etc. Also, this tool is probably more bug proof then a custom solution and allows a lot of flexibility for how you want to design your printout/report. In the future if you have more complicated printing or reports required, this tool does a lot more. I do not work for Telerik, but there product is good.

It allows exporting to PDF, Word, Excel, HTML, PowerPoint, PNG, etc. etc.

1
votes

IMHO, you've got the right idea: XPS is, in my mind, the simplest method of serializing the data into a usable format, especially for conversion.

As for a third party tool, I've a peer (as in, not myself,)who's used CheckPrixa with some measure of success; it's freeware and it offers command line conversions. (i.e. serializing a document and converting a la generated .bat file.)

It also allows you to handle keywords, titles, etc. along with more important items like even pagination.

As far as I'm aware, there are no known discrepancies.

Alternatively, if converting the MSXPS is what's giving you headaches, you might want to look at XpsConverter, it converts MSXPS to OpenXPS, and as a Window's driver, it's available on any machine using .NET 3 and above.

Keep us updated with whatever solution you try, virtual reports are a growing deal.