pdfת»»³ÉjpgʾÀý·ÖÏí

¡¡¡¡

¸´ÖÆ´úÂë ´úÂëÈçÏÂ:

¡¡¡¡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);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}

¡¡¡¡²âÊÔWinForm£º

¡¡¡¡¿ÉÒÔ²ÉÓÃÏÂÃæµÄ·½Ê½²âÊÔµ÷ÓÃÉÏÃæµÄ¹¦ÄÜ£¬È磺

¡¡¡¡

¸´ÖÆ´úÂë ´úÂëÈçÏÂ:

¡¡¡¡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);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}