pdf转换成jpg示例分享
pdf转换成jpg示例分享
发布时间:2016-12-29 来源:查字典编辑
摘要:复制代码代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;...

复制代码 代码如下:

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

}

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类