Click here to Skip to main content
15,896,269 members
Articles / Desktop Programming / Windows Forms

View PDF files in C# using the Xpdf and muPDF library, Print PostScript.

Rate me:
Please Sign up or sign in to vote.
4.78/5 (39 votes)
26 Nov 2010GPL34 min read 1.6M   311   245  
Wrapper C# class written in C++\CLI and a sample implementation in C# to render PDF files.
/* to be example to the xoring problem 
 * i ve written a simple namespace to referance to standat GDI.
 * But the GDIDraw namespace 
 * doesnt referance to whole methots such as drawing 
 * rectangles or other shapes
 * but can easily be enhanged if necessary */
namespace GDIDraw
{
    public enum PenStyles
    {
        PS_SOLID=0
        ,PS_DASH=1
        ,PS_DOT=2
        ,PS_DASHDOT=3
        ,PS_DASHDOTDOT=4
        ,PS_NULL=5
        ,PS_INSIDEFRAME=6
        ,PS_USERSTYLE=7
        ,PS_ALTERNATE=8
        ,PS_STYLE_MASK=0x0000000F

        ,PS_ENDCAP_ROUND=     0x00000000
        ,PS_ENDCAP_SQUARE=    0x00000100
        ,PS_ENDCAP_FLAT=      0x00000200
        ,PS_ENDCAP_MASK =     0x00000F00
        ,PS_JOIN_ROUND=       0x00000000
        ,PS_JOIN_BEVEL=       0x00001000
        ,PS_JOIN_MITER=       0x00002000
        ,PS_JOIN_MASK=        0x0000F000

        ,PS_COSMETIC=         0x00000000
        ,PS_GEOMETRIC=        0x00010000
        ,PS_TYPE_MASK=        0x000F0000
    };
    public enum drawingMode
    {
        R2_BLACK=            1   /*  0       */
        ,R2_NOTMERGEPEN=      2   /* DPon     */
        ,R2_MASKNOTPEN=       3   /* DPna     */
        ,R2_NOTCOPYPEN=       4   /* PN       */
        ,R2_MASKPENNOT=       5   /* PDna     */
        ,R2_NOT=              6   /* Dn       */
        ,R2_XORPEN=           7   /* DPx      */
        ,R2_NOTMASKPEN=       8   /* DPan     */
        ,R2_MASKPEN=          9   /* DPa      */
        ,R2_NOTXORPEN=        10  /* DPxn     */
        ,R2_NOP=              11  /* D        */
        ,R2_MERGENOTPEN=      12  /* DPno     */
        ,R2_COPYPEN=          13  /* P        */
        ,R2_MERGEPENNOT=      14  /* PDno     */
        ,R2_MERGEPEN=         15  /* DPo      */
        ,R2_WHITE=            16  /*  1       */
        ,R2_LAST=             16
    };

    public class GDI
    {
        private IntPtr hdc;
        private System.Drawing.Graphics grp;
        
        public void BeginGDI(System.Drawing.Graphics g)
        {
            grp=g;
            hdc=grp.GetHdc();    
        }

        public void EndGDI()
        {
            grp.ReleaseHdc(hdc);
        }

        public IntPtr CreatePEN(
            PenStyles fnPenStyle,    // pen style

            int nWidth,        // pen width

            int crColor   // pen color

            )
        {
           return CreatePen(fnPenStyle,nWidth,crColor);
        }

        public bool DeleteOBJECT(IntPtr hObject)
        {
          return DeleteObject(hObject);
        }

        public IntPtr SelectObject(
            IntPtr hgdiobj   // handle to object

            )
        {
             return SelectObject(hdc,hgdiobj);
        }

        public void MoveTo(int X,int Y)
        {
           MoveToEx(hdc,X,Y,0);
        }

        public void LineTo(int X,int Y)
        {
            LineTo(hdc,X,Y);
        }

        public int SetROP2(drawingMode fnDrawMode)
        {
           return SetROP2(hdc,fnDrawMode);
        }

        [System.Runtime.InteropServices.DllImportAttribute(
             "gdi32.dll")]
        private static extern int SetROP2(
            IntPtr hdc,         // handle of device context

            drawingMode fnDrawMode      // drawing mode

            );  
       
        [System.Runtime.InteropServices.DllImportAttribute(
             "gdi32.dll")] 
        private static extern bool MoveToEx(
            IntPtr hdc,          // handle to device context

            int X,            // x-coordinate of new current position

            int Y,            // y-coordinate of new current position

            int oldp// pointer to old current position

            );

        [System.Runtime.InteropServices.DllImportAttribute(
             "gdi32.dll")]
        private static extern bool LineTo(
            IntPtr hdc,    // device context handle

            int nXEnd,  // x-coordinate of line's ending point

            int nYEnd   // y-coordinate of line's ending point

            );

        [System.Runtime.InteropServices.DllImportAttribute(
             "gdi32.dll")]
        private static extern IntPtr CreatePen(
            PenStyles fnPenStyle,    // pen style

            int nWidth,        // pen width

            int crColor   // pen color

            );

        [System.Runtime.InteropServices.DllImportAttribute(
             "gdi32.dll")]
        private static extern bool DeleteObject(IntPtr hObject   
                                               // handle to graphic object

            );

        [System.Runtime.InteropServices.DllImportAttribute(
             "gdi32.dll")]
        private static extern IntPtr SelectObject(
            IntPtr hdc,          // handle to device context

            IntPtr hgdiobj   // handle to object

            );

        public static int RGB(int R,int G,int B)
        {
            return (R|(G<<8)|(B<<16));         
        }
        
    
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Engineer HidraQuim SA de CV
Mexico Mexico
I'm a Chemical Engineering that loves the programming.
2003 - Graduated from Technical Programmer UNIVA México.
2009 - Graduated from Chemical Engineering Universidad de Guadalajara, Mexico.
Programmer by Hobby since 6 years ago.

Comments and Discussions