Converter PDF para Imagem (JPEG) em C#
Esse vai ser o primeiro post sobre realmente o que faço no dia-a-dia, programação em C#.
Bom, é simples e rápido, estava procurando já faz um tempo de converter PDF’s pra imagem em runtime.
Procurei por toda a net e quando achei decidi publicar pois muita gente estava com a mesma dúvida.
Espero que possa ajudar!!
O que você vai precisar para fazer isso:
- Dll “gsdll32.dll” do Ghostscript, não tenho certeza se tem a DLL “solta”, mas se for o caso instale que a dll vai estar na pasta bin, do diretório de instalação.
- Copiar essa DLL para a pasta do executável (caso o projeto seja Windows Form) ou para a pasta que contém a DLL de execução do código (pasta Bin de Sites criados pelo VS2003);
[UPDATE]Como to vendo muita procura sobre esse post, vou escrever um tutorial melhor para facilitar a vida da galera que precisa usar essa ferramenta, mas primeiro vou dar uma pesquisada se não inventaram nada melhor. I’ll be back[/UPDATE]
Segue o código da classe que eu criei para converter arquivos PDF para imagens JPG:
using System;
using System.Collections;
using System.Runtime.InteropServices;
namespace Utilities.Class
{
public class PDFConvert
{
[DllImport("gsdll32.dll", EntryPoint="gsapi_new_instance")]
private static extern int gsapi_new_instance (out IntPtr pinstance, IntPtr caller_handle);</code>
[DllImport("gsdll32.dll", EntryPoint="gsapi_init_with_args")]
private static extern int gsapi_init_with_args (IntPtr instance, int argc, IntPtr argv);
[DllImport("gsdll32.dll", EntryPoint="gsapi_exit")]
private static extern int gsapi_exit (IntPtr instance);
[DllImport("gsdll32.dll", EntryPoint="gsapi_delete_instance")]
private static extern void gsapi_delete_instance (IntPtr instance);
private string _sOutputFile;
private string _sInputFile;
private int _iWidth;
private int _iHeight;
private int _iResolutionX;
private int _iResolutionY;
private int _iJPEGQuality;
private Boolean _bFitPage;
private IntPtr _objHandle;
public GSPDFConvert(IntPtr objHandle)
{
_objHandle = objHandle;
}
public GSPDFConvert()
{
_objHandle = IntPtr.Zero;
}
public string InputFile
{
get { return _sInputFile; }
set { _sInputFile = value; }
}
public string OutputFile
{
get { return _sOutputFile; }
set { _sOutputFile = 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; }
}
public int JPEGQuality
{
get { return _iJPEGQuality; }
set { _iJPEGQuality = value; }
}
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;
}
public void Run()
{
int intReturn;
IntPtr intGSInstanceHandle;
object[] aAnsiArgs;
IntPtr[] aPtrArgs;
GCHandle[] aGCHandle;
int intCounter;
int intElementCount;
IntPtr callerHandle;
GCHandle gchandleArgs;
IntPtr intptrArgs;
string[] sArgs = GetGeneratedArgs();
// 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];
for(intCounter = 0; intCounter< intElementCount; intCounter++)
{
aAnsiArgs[intCounter] = StringToAnsiZ(sArgs[intCounter]);
aGCHandle[intCounter] = GCHandle.Alloc(aAnsiArgs[intCounter], GCHandleType.Pinned);
aPtrArgs[intCounter] = aGCHandle[intCounter].AddrOfPinnedObject();
}
gchandleArgs = GCHandle.Alloc(aPtrArgs, GCHandleType.Pinned);
intptrArgs = gchandleArgs.AddrOfPinnedObject();
intReturn = gsapi_new_instance(out intGSInstanceHandle, _objHandle);
callerHandle = IntPtr.Zero;
intReturn = gsapi_init_with_args(intGSInstanceHandle, intElementCount, intptrArgs);
for(intCounter = 0; intCounter
{
aGCHandle[intCounter].Free();
}
gchandleArgs.Free();
gsapi_delete_instance(intGSInstanceHandle);
gsapi_exit(intGSInstanceHandle);
}
private string[] GetGeneratedArgs()
{
// Count how many extra args are need - HRangel - 11/29/2006, 3:13:43 PM
ArrayList lstExtraArgs = new ArrayList();
if (_iJPEGQuality > 0 &amp;&amp; _iJPEGQuality < 101)
lstExtraArgs.Add("-dJPEGQ=" + _iJPEGQuality);
if (_iWidth > 0 &amp;&amp; _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 = 7;
int iExtraArgsCount = lstExtraArgs.Count;
string[] args = new string[iFixedCount + lstExtraArgs.Count];
args[0]="pdf2jpg";
args[1]="-dNOPAUSE";
args[2]="-dBATCH";
args[3]="-dSAFER";
args[4]="-sDEVICE=jpeg";
for (int i=0; i < iExtraArgsCount; i++)
{
args[5+i] = (string) lstExtraArgs[i];
}
args[5 + iExtraArgsCount]="-sOutputFile="+_sOutputFile;
args[6 + iExtraArgsCount] = _sInputFile;
return args;
}
}
}
Se alguém precisar de ajuda pra entender o código me avisa.
Abs



O .dll para converter pode ser achado em:
http://www.afreedll.com/dll/download/644/gsdll32.dll
Espero ter ajudado.
Cara, to com dificuldade em entender o codigo,
qual metodo da converte o pdf para imagem e o que eu passo como parametro para ele??
desde ja agradeço..
Ola Henrique, você tem que criar uma instância dessa classe, preencher os argumentos desejados (como Input e Output file por exemplo) e em seguida executar o metodo Run do objeto criado.
Espero poder ter ajudado
O que é suposto passar como parametro no construtor? O que é este caller handle?
n liga… erro meu. estou e a ter um crash ao invocar o ponteiro gsapi_exit. alguma ideia?
Olá Rangel,
Excelente post acredito que tenha solucionado o problema de muita gente, no meu caso nem tanto rsrsrs
Qaundo rodo a página aparece o seguinte erro
Não é possível carregar a DLL ‘gsdll32.dll’: Não foi possível encontrar o módulo especificado. (Exceção de HRESULT: 0x8007007E)
tem idéia do que pode ser? Estou usando o Visual Web Developer 2008 para desenvolver o sistema.
até mais
Olá rangel,
testei a cla
Não é possível carregar a DLL ‘gsdll32.dll’: Não foi possível encontrar o módulo especificado. (Exceção de HRESULT: 0x8007007E)
O codigo não funciona …
amador é [moderated]f***[/moderated] …….
@Marcio: Marcio,
Primeiramente, agradeço a visita ao blog e o cometário.
Sobre seu comentário, se seu interesse era realmente converter um PDF para Imagem então não entendi porque do tom do comentário.
Um comentário como o seu desse não ajuda em nada a resolver o seu problema e o de outras pessoas.
Se eu escrevi um post sobre o assunto é que – no mínimo – o processo funcionou no meu ambiente e do meu cliente. Se o código não está funcionando com você o problema pode ser alguma configuração da sua máquina ou, como eu digo no próprio post, o fato do código já ser um pouco antigo (utiliza .NET 1.1).
Além disso pode ser também alguma configuração ou passo que esqueci de citar.
Como você pode ver em meus dois blogs sou programador e já trabalho na área a mais de 6 anos, com C# especificamente a quase 3.
Tento contribuir com problemas que resolvo no meu dia-a-dia e melhorar cada post para facilitar a vida de outros como eu.
Bom, se você ainda quiser resolver seu problema podemos conversar – quem sabe você não me ajuda a atualizar esse post – para melhorarmos o código e atualizarmos a solução.
Agora se você só quiser me ofender no meu blog sinto muito.
De qualquer jeito volto a agradever a visita.
Abraços
Henrique Rangel
Olá HRangel ,
Estou pesquisando este assunto – converter arquivo pdf e html em imagem jpg.
Você conhece algum utilitário que faça esta tarefa ?
Agradeço a atenção ,
kleber
Oi.
Graças ao código. Ela está trabalhando para mim. =) No entanto, as minhas imagens estão a perder qualidade e eu ainda estou trabalhando na resolução. Tem alguma dica sobre o que eu poderia fazer para aumentar a qualidade da imagem? Estou definição
JPEGQuality = 10.
Anyone have any issues with custom fonts? The fonts that I am using in the PDF seem to be causing the images generated to contain text that just looks wrong. The text is scruffy looking.
From the documentation
“If you don’t seem to be getting nice characters on the screen under MS Windows, you can try adding aliases to Fontmap, according to the documentation you’ll find in there. ”
How can we sort this out in this application?
ja resolveram esse problema?
Não é possível carregar a DLL ‘gsdll32.dll’: Não foi possível encontrar o módulo especificado. (Exceção de HRESULT: 0×8007007E)
Muito bom post, mas falta o básico para iniciantes. Como eu uso ela? Em que processo? Eu consegui tudo que o post manda, mas não tenho noção do como chamar a classe. Fico no aguardo urgente da sua resposta.
amigo a classe parece estar ok e parece funcionar mas faltou o exemplo de como usar pois como faço para passar meu arquivo pdf para a funcao que gera os jpgs pois o parametro é
IntPtr nao sei como fazer pode me ajudar ????
Olá,
Estou em falta em relação a esse pist que esta sendo muito procurado e gerando muitas duvidas.
Essa semana vou estar mais tranquilo, vou rever o código e colocar mais exemplos.
Assim que o fizer mando email a todos que se mostraram interessados.
Abs
Henrique