pdf conversion to jpg sample sharing

  • 2020-12-13 18:57:07
  • OfStack


using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Runtime.InteropServices;  
using System.Collections;  
/** 
Convert PDF to Image Format(JPEG) using Ghostscript API 

convert a pdf to jpeg using ghostscript command line: 
gswin32c -q -dQUIET -dPARANOIDSAFER  -dBATCH -dNOPAUSE  -dNOPROMPT -dMaxBitmap=500000000 -dFirstPage=1 -dAlignToPixels=0 -dGridFitTT=0 -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r100x100 -sOutputFile=output.jpg test.pdf 
see also:http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/ 
and: http://www.codeproject.com/KB/cs/GhostScriptUseWithCSharp.aspx 
Note:copy gsdll32.dll to system32 directory before using this ghostscript wrapper. 
 *  
 */  
namespace ConvertPDF  
{  
    /// <summary>  
    ///   
    /// Class to convert a pdf to an image using GhostScript DLL  
    /// Credit for this code go to:Rangel Avulso  
    /// i only fix a little bug and refactor a little  
    /// http://www.hrangel.com.br/index.php/2006/12/04/converter-pdf-para-imagem-jpeg-em-c/  
    /// </summary>  
    /// <seealso cref="http://www.hrangel.com.br/index.php/2006/12/04/converter-pdf-para-imagem-jpeg-em-c/"/>  
    class PDFConvert  
    {  
        #region GhostScript Import  
        /// <summary>Create a new instance of Ghostscript. This instance is passed to most other gsapi functions. The caller_handle will be provided to callback functions.  
        ///  At this stage, Ghostscript supports only one instance. </summary>  
        /// <param name="pinstance"></param>  
        /// <param name="caller_handle"></param>  
        /// <returns></returns>  
        [DllImport("gsdll32.dll", EntryPoint="gsapi_new_instance")]  
        private static extern int gsapi_new_instance (out IntPtr pinstance, IntPtr caller_handle);  
        /// <summary>This is the important function that will perform the conversion</summary>  
        /// <param name="instance"></param>  
        /// <param name="argc"></param>  
        /// <param name="argv"></param>  
        /// <returns></returns>  
        [DllImport("gsdll32.dll", EntryPoint="gsapi_init_with_args")]  
        private static extern int gsapi_init_with_args (IntPtr instance, int argc, IntPtr argv);  
        /// <summary>  
        /// Exit the interpreter. This must be called on shutdown if gsapi_init_with_args() has been called, and just before gsapi_delete_instance().   
        /// </summary>  
        /// <param name="instance"></param>  
        /// <returns></returns>  
        [DllImport("gsdll32.dll", EntryPoint="gsapi_exit")]  
        private static extern int gsapi_exit (IntPtr instance);  
        /// <summary>  
        /// Destroy an instance of Ghostscript. Before you call this, Ghostscript must have finished. If Ghostscript has been initialised, you must call gsapi_exit before gsapi_delete_instance.   
        /// </summary>  
        /// <param name="instance"></param>  
        [DllImport("gsdll32.dll", EntryPoint="gsapi_delete_instance")]  
        private static extern void gsapi_delete_instance (IntPtr instance);  
        #endregion  
        #region Variables  
        private string _sDeviceFormat;  
        private int _iWidth;  
        private int _iHeight;  
        private int _iResolutionX;  
        private int _iResolutionY;  
        private int _iJPEGQuality;  
        private Boolean _bFitPage;  
        private IntPtr _objHandle;  
        #endregion  
        #region Proprieties  
        public string OutputFormat  
        {  
            get { return _sDeviceFormat; }  
            set { _sDeviceFormat = value; }  
        }  
        public int Width  
        {  
            get { return _iWidth; }  
            set { _iWidth = value; }  
        }  
        public int Height  
        {  
            get { return _iHeight; }  
            set { _iHeight = value; }  
        }  
        public int ResolutionX  
        {  
            get { return _iResolutionX; }  
            set { _iResolutionX = value; }  
        }  
        public int ResolutionY  
        {  
            get { return _iResolutionY; }  
            set { _iResolutionY = value; }  
        }  
        public Boolean FitPage  
        {  
            get { return _bFitPage; }  
            set { _bFitPage = value; }  
        }  
        /// <summary>Quality of compression of JPG</summary>  
        public int JPEGQuality  
        {  
            get { return _iJPEGQuality; }  
            set { _iJPEGQuality = value; }  
        }  
        #endregion  
        #region Init  
        public PDFConvert(IntPtr objHandle)  
        {  
            _objHandle = objHandle;  
        }  
        public PDFConvert()  
        {  
            _objHandle = IntPtr.Zero;  
        }  
        #endregion  
        private byte[] StringToAnsiZ(string str)  
        {  
            //' Convert a Unicode string to a null terminated Ansi string for Ghostscript.  
            //' The result is stored in a byte array. Later you will need to convert  
            //' this byte array to a pointer with GCHandle.Alloc(XXXX, GCHandleType.Pinned)  
            //' and GSHandle.AddrOfPinnedObject()  
            int intElementCount;  
            int intCounter;  
            byte[] aAnsi;  
            byte bChar;  
            intElementCount = str.Length;  
            aAnsi = new byte[intElementCount+1];  
            for(intCounter = 0; intCounter < intElementCount;intCounter++)  
            {  
                bChar = (byte)str[intCounter];  
                aAnsi[intCounter] = bChar;  
            }  
            aAnsi[intElementCount] = 0;  
            return aAnsi;  
        }  
        /// <summary>Convert the file!</summary>  
        public void Convert(string inputFile,string outputFile,  
            int firstPage, int lastPage, string deviceFormat, int width, int height)  
        {  
            //Avoid to work when the file doesn't exist  
            if (!System.IO.File.Exists(inputFile))  
            {  
                System.Windows.Forms.MessageBox.Show(string.Format("The file :'{0}' doesn't exist",inputFile));  
                return;  
            }  
            int intReturn;  
            IntPtr intGSInstanceHandle;  
            object[] aAnsiArgs;  
            IntPtr[] aPtrArgs;  
            GCHandle[] aGCHandle;  
            int intCounter;  
            int intElementCount;  
            IntPtr callerHandle;  
            GCHandle gchandleArgs;  
            IntPtr intptrArgs;  
            string[] sArgs = GetGeneratedArgs(inputFile,outputFile,  
                firstPage, lastPage, deviceFormat, width, height);  
            // Convert the Unicode strings to null terminated ANSI byte arrays  
            // then get pointers to the byte arrays.  
            intElementCount = sArgs.Length;  
            aAnsiArgs = new object[intElementCount];  
            aPtrArgs = new IntPtr[intElementCount];  
            aGCHandle = new GCHandle[intElementCount];  
            // Create a handle for each of the arguments after   
            // they've been converted to an ANSI null terminated  
            // string. Then store the pointers for each of the handles  
            for(intCounter = 0; intCounter< intElementCount; intCounter++)  
            {  
                aAnsiArgs[intCounter] = StringToAnsiZ(sArgs[intCounter]);  
                aGCHandle[intCounter] = GCHandle.Alloc(aAnsiArgs[intCounter], GCHandleType.Pinned);  
                aPtrArgs[intCounter] = aGCHandle[intCounter].AddrOfPinnedObject();  
            }  
            // Get a new handle for the array of argument pointers  
            gchandleArgs = GCHandle.Alloc(aPtrArgs, GCHandleType.Pinned);  
            intptrArgs = gchandleArgs.AddrOfPinnedObject();  
            intReturn = gsapi_new_instance(out intGSInstanceHandle, _objHandle);  
            callerHandle = IntPtr.Zero;  
            try  
            {  
                intReturn = gsapi_init_with_args(intGSInstanceHandle, intElementCount, intptrArgs);  
            }  
            catch (Exception ex)  
            {  
                //System.Windows.Forms.MessageBox.Show(ex.Message);  

            }  
            finally  
            {  
                for (intCounter = 0; intCounter < intReturn; intCounter++)  
                {  
                    aGCHandle[intCounter].Free();  
                }  
                gchandleArgs.Free();  
                gsapi_exit(intGSInstanceHandle);  
                gsapi_delete_instance(intGSInstanceHandle);  
            }  
        }  
        private string[] GetGeneratedArgs(string inputFile, string outputFile,  
            int firstPage, int lastPage, string deviceFormat, int width, int height)  
        {  
            this._sDeviceFormat = deviceFormat;  
            this._iResolutionX = width;  
            this._iResolutionY = height;  
            // Count how many extra args are need - HRangel - 11/29/2006, 3:13:43 PM  
            ArrayList lstExtraArgs = new ArrayList();  
            if ( _sDeviceFormat=="jpg" && _iJPEGQuality > 0 && _iJPEGQuality < 101)  
                lstExtraArgs.Add("-dJPEGQ=" + _iJPEGQuality);  
            if (_iWidth > 0 && _iHeight > 0)  
                lstExtraArgs.Add("-g" + _iWidth + "x" + _iHeight);  
            if (_bFitPage)  
                lstExtraArgs.Add("-dPDFFitPage");  
            if (_iResolutionX > 0)  
            {  
                if (_iResolutionY > 0)  
                    lstExtraArgs.Add("-r" + _iResolutionX + "x" + _iResolutionY);  
                else  
                    lstExtraArgs.Add("-r" + _iResolutionX);  
            }  
            // Load Fixed Args - HRangel - 11/29/2006, 3:34:02 PM  
            int iFixedCount = 17;  
            int iExtraArgsCount = lstExtraArgs.Count;  
            string[] args = new string[iFixedCount + lstExtraArgs.Count];  
            /* 
            // Keep gs from writing information to standard output 
        "-q",                      
        "-dQUIET", 

        "-dPARANOIDSAFER", // Run this command in safe mode 
        "-dBATCH", // Keep gs from going into interactive mode 
        "-dNOPAUSE", // Do not prompt and pause for each page 
        "-dNOPROMPT", // Disable prompts for user interaction            
        "-dMaxBitmap=500000000", // Set high for better performance 

        // Set the starting and ending pages 
        String.Format("-dFirstPage={0}", firstPage), 
        String.Format("-dLastPage={0}", lastPage),    

        // Configure the output anti-aliasing, resolution, etc 
        "-dAlignToPixels=0", 
        "-dGridFitTT=0", 
        "-sDEVICE=jpeg", 
        "-dTextAlphaBits=4", 
        "-dGraphicsAlphaBits=4", 
            */  
            args[0]="pdf2img";//this parameter have little real use  
            args[1]="-dNOPAUSE";//I don't want interruptions  
            args[2]="-dBATCH";//stop after  
            //args[3]="-dSAFER";  
            args[3] = "-dPARANOIDSAFER";  
            args[4]="-sDEVICE="+_sDeviceFormat;//what kind of export format i should provide  
            args[5] = "-q";  
            args[6] = "-dQUIET";  
            args[7] = "-dNOPROMPT";  
            args[8] = "-dMaxBitmap=500000000";  
            args[9] = String.Format("-dFirstPage={0}", firstPage);  
            args[10] = String.Format("-dLastPage={0}", lastPage);  
            args[11] = "-dAlignToPixels=0";  
            args[12] = "-dGridFitTT=0";  
            args[13] = "-dTextAlphaBits=4";  
            args[14] = "-dGraphicsAlphaBits=4";  
            //For a complete list watch here:  
            //http://pages.cs.wisc.edu/~ghost/doc/cvs/Devices.htm  
            //Fill the remaining parameters  
            for (int i=0; i < iExtraArgsCount; i++)  
            {  
                args[15+i] = (string) lstExtraArgs[i];  
            }  
            //Fill outputfile and inputfile  
            args[15 + iExtraArgsCount] = string.Format("-sOutputFile={0}",outputFile);  
            args[16 + iExtraArgsCount] = string.Format("{0}",inputFile);  
            return args;  
        }  
        public void pdf2jpgTest()  
        {              
            this.Convert(@"C://tmp//pdfimg//test1.pdf",@"C://tmp//pdfimg//out.jpg",1,1,"jpeg",100,100);  
            //this.Convert(@"C://tmp//pdfimg//test.pdf", @"C://tmp//pdfimg//out2.jpg", 291, 291, "jpeg", 800, 800);  
        }  
    }  
}  

Test WinForm:

The above functions can be tested in the following ways, such as:


 PDFConvert convertor = new PDFConvert();
 convertor.pdf2jpgTest();
 


using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  
using ConvertPDF;  
namespace PDF2Img  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  

        }  
        private void button1_Click(object sender, EventArgs e)  
        {  
            PDFConvert convertor = new PDFConvert();  
            convertor.pdf2jpgTest();  
            Image img = Image.FromFile(@"C://tmp//pdfimg//out.jpg");  
            myBitmap = new Bitmap(img);  

            Graphics G = this.CreateGraphics();  
            GraphicsUnit GU = G.PageUnit;  
            BMPContainer = myBitmap.GetBounds(ref GU); //X,Y = 0  

           // Graphics g = this.CreateGraphics();  
            //g.DrawImage(myBitmap, 1, 1);  
            this.Invalidate();  
        }  
        private Bitmap myBitmap;  
        private RectangleF BMPContainer;  
        protected override void OnPaint(PaintEventArgs e)  
        {  
            Graphics G = e.Graphics;  
            if (myBitmap != null)  
            {             
                G.DrawImage(myBitmap, BMPContainer);  
            }  
            base.OnPaint(e);  
        }  
    }  
} 


Related articles: