![]() |
Desktop Development »
Files and Folders »
General
Intermediate
License: The GNU General Public License (GPL)
View PDF files in C# using the Xpdf and muPDF library, Print PostScript.By Antonio SandovalWrapper C# class written in C++\CLI and a sample implementation in C# to render PDF files. |
VC8.0, C#2.0, Windows, Win32, ATL, GDI+, COM, WinForms, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

Xpdf is an Open Source library released under GPL license; they have an ActiveX with commercial license, but some time ago, before I knew about this commercial control, I wrote this wrapper library to render PDF files in C#.
The basic idea is create a preview of PDF files in C#. After looking at many places in the internet, I found this wonderful library; the only problem is that the library uses XLib, and there is no XLib available for Windows. Fortunately, Xpdf can render the generated PDF into a Win32 DC.
IntPtr ptr = Marshal::StringToCoTaskMemAnsi(fileName);
char *singleByte= (char*)ptr.ToPointer();
try{
}finally{
Marshal::FreeCoTaskMem(ptr);
} For releasing resources is necessary implement IDisposable:
!PDFWrapper()
{
_pdfDoc->Dispose();
}
The file xpdfWin-Interop.sln includes all the necessary files, you can also download the last version from http://www.foolabs.com/xpdf/ and recompile without the files that requires XLib.
The Build Project Order is as follows: freetype,xpdf,AFPDFLib, PDFLibNet. Once compiled PDFLibNet, it can be used in C# code:
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Portable Document Format (*.pdf)|*.pdf";
if (dlg.ShowDialog() == DialogResult.OK)
{
_pdfDoc = new PDFLibNet.PDFWrapper();
_pdfDoc.LoadPDF(dlg.FileName);
_pdfDoc.CurrentPage = 1;
PictureBox pic =new PictureBox();
pic.Width=800;
pic.Height=1024;
_pdfDoc.FitToWidth(pic.Handle);
pic.Height = _pdfDoc.PageHeight;
_pdfDoc.RenderPage(pic.Handle);
Bitmap _backbuffer = new Bitmap(_pdfDoc.PageWidth, _pdfDoc.PageHeight);
using (Graphics g = Graphics.FromImage(_backbuffer))
{
_pdfDoc.RenderHDC(g.GetHdc);
g.ReleaseHdc();
}
pic.Image = _backbuffer;
}
It is necessary create a PictureBox because the class implements only a method that accepts an HWND, because in the first instance,
I was trying to implement the scroll into the same control that the PDF is rendered. In the included sample, the scroll is controlled by a Panel container.
Xpdf can export the PDF to a PostScript file. For printing this is the best option if you have a PostScript Printer:
PSOutputDev *psOut =new PSOutputDev((char *)fileName,m_PDFDoc->getXRef(),m_PDFDoc->getCatalog(),fromPage,toPage,psModePS);
if(psOut->isOk()){
m_PDFDoc->displayPages(psOut,fromPage,toPage,PRINT_DPI,PRINT_DPI,0,gTrue,globalParams->getPSCrop(),gTrue);
}
delete psOut; The file must be sended in RAW format (http://support.microsoft.com/kb/322091)
For async export:
_doc.ExportJpg(filename,
1, //From page
1, //To page
150, //Resolution in DPI
90, //Jpg quality if you need a sync operation its posible especify a wait time:
_doc.ExportJpg(filename,
1, //From page
1, //To page
150, //Resolution in DPI
90, //Jpg quality
-1); //Time to wait, -1 to infinite.
If the file name does not contains a %d token (for the page number), then the procedure replaces .jpg with -page%d.jpg.
PDFWrapper exposes two events ExportJpgProgress and ExportJpgFinished. Both events are called from the exporting Thread, so it is necesary to make a security call using Invoke, check frmExportJpg for a sample.
06\July\2009:
11\July\2009
12\July\2009
13\July\2009
20\July\2009
07\Nov\2009
Know issues:
MuPDF has some problems with transparency, but is faster than xpdf.
MuPDF uses recursion for analyze the tree document, so is necessary increment the Stack Size to at least 4mb to avoid problems with some complex files (editbin for C#, VB.Net exe's). Soon or later the recursion causes an stack overflow if the tree is so big, so while it is fixed that is the most important issue.
- Apply last xpdf patche
- Show multiple pages in the viewer.
- Improve user interface.
- Implement LoadFromStream for MuPDF.
There is missing some functionality that can be extracted from xpdf:
- Enable selection, image extraction and instant snapshot.
- Print in non PostScript printers.
General
News
Question
Answer
Joke
Rant
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads.
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 7 Nov 2009 Editor: Smitha Vijayan |
Copyright 2009 by Antonio Sandoval Everything else Copyright © CodeProject, 1999-2010 Web19 | Advertise on the Code Project |