Biblioteca Java Free para conversão de documento PDF para Imagem

21 respostas
mrapha

Eu estou usando uma biblioteca chamda Java Renderer para converter documentos PDF para imagem. Porém esta biblioteca não converte corretamente arquivos de grande área.

Alguém conhece outra biblioteca freeware para Java que faça este trabalho?

21 Respostas

alanbrasil1984

acho que vc consegue isso com itext.

mrapha

Já tentei usá-lo mas não consegui nada.

alanbrasil1984

tem um referencia o itext in action vai la no 4shared que vc encontra e nessa referencia vc consegue resolver o seu problema.

mrapha

Achei o documento e estou baixando-o. Não acredito q o iText vá ajudar, mas esse documento é novo, não ouvi falar dele antes! Obrigado pela esperança! =) Vou testar e logo falo o resultado!

alanbrasil1984

bo brother eu te digo que sim, pq tem tres formas de se gerar relatorio com itext uma é pdf outra imagem e HTML.

se vc quiser converter vc pega o pdf converte para bytearray e devolve a imagem…

mais ou menos assim.

espero ter ajudado.

mrapha

Bom dia Alan!!

Eu consegui chegar bem perto com a solução que você ofereceu!! Realmente é possível fazer esse trabalho com o iText!!
Só estou com problemas no seguinte item:

Eu pego o conteúdo da página do documento em forma de byte[] e quando vou converter pra BufferedImage ele converte pra null!! Não estou conseguindo achar o melhor jeito pra essa conversão.

Depois de mtas tentativas com voltas e sem voltas, o meu código para essa conversão ficou congelado assim:

public static BufferedImage toImage(byte[] data) {
        try {
            ByteArrayInputStream bais = new ByteArrayInputStream(data);
            BufferedImage image = ImageIO.read(bais);
            return image;
        } catch (Exception ex) {
            System.out.println("Erro: " + ex.getMessage());
            return null;
        }
    }

E nesse código ele está retornando null sem cair na excessão!! O ImageIO.read não consegue ler! O BufferedImage recebe nullo.

Você ou mais alguém pode me ajudar a resolver esse problema?

alanbrasil1984

eu acredito que vc esta indo pelo lado diferente, faz o seguinte pega o fonte do JBoleto que la tem isso ja pronto.

http://jboleto.org/download_programadorjava.php

mrapha

Oi Alan!!

Eu pesquisei o JBoleto mas não encontrei nada… Ele tem código de captura de imagens no disco e escrita das mesmas num documento PDF. Ele foi na contra-mão do que preciso.

alanbrasil1984

da uma olhada nisso e ve se te ajuda

http://www.coderanch.com/t/63481/Other-Open-Source-Projects/iText-pdf-image-conversion

Felagund

A resposta se chama PDFBox

ainda é dev mas é um excelente projeto.

E tem exemplos sobre como converter PDF para imagem

http://incubator.apache.org/pdfbox/

mrapha

Felagund:
A resposta se chama PDFBox

ainda é dev mas é um excelente projeto.

E tem exemplos sobre como converter PDF para imagem

http://incubator.apache.org/pdfbox/

Eu baixei esta ferramenta, a implementei e estou trabalhando nela. Porém ela não está convertendo o projeto por não encontrar uma classe da própria biblioteca. Você já utilizou esta ferramenta para este propósito?

mrapha

Eis a solução!! O PDFBox não funciona corretamente sem o FontBox!! Precisei baixá-lo também!! Já está tudo funcionando como precisava!!!
Muito obrigado a vocês, Alan e Felagund, pela ajuda!!!

Usando o PDFBox e o FontBox na pasta de biblioteca, eis o código para a conversão:

/*
 * Classe de conversão de arquivo PDF para Imagem
 */

package conversao;

import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Vector;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDPage;

/**
 *
 * @author Márcio Raphael Rigues
 * 
 */
public class PdfToBufferedImage {
    public Vector<BufferedImage> Convert(String caminho){
        try {
            Vector<BufferedImage> paginas = new Vector<BufferedImage>();
            PDDocument document = PDDocument.load(caminho);
            List<PDPage> pages = document.getDocumentCatalog().getAllPages();
            for (int i = 0; i < pages.size(); i++) {
                PDPage singlePage = pages.get(i);
                BufferedImage buffImage = singlePage.convertToImage();
                paginas.add(buffImage);
            }
            return paginas;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
}

Abraços!!!

B

Eu fiz assim tambem ams ta dando erro no = PDDocument document = PDDocument.load(caminho);

o erro é esse:

Exception in thread main java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

at org.apache.pdfbox.pdfparser.BaseParser.(BaseParser.java:58)

at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:861)

at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:829)

at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:754)

at teste.Convert(teste.java:20)

at teste.main(teste.java:15)

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:303)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
mrapha

Boa tarde barradas,

minhas pesquisas avançaram muito depois deste tópico. Este componente se mostrou insuficiente pra mim e usei outro mais profissional: o JPedal (http://www.jpedal.org/). Lá tem duas versões: a free e a paga. Nós aqui precisamos da paga. Valeu muiiito a pena! É excelente e suporta todas as fontes que precisamos.

Você pode usar a versão gratuita que também é muito boa. O site te informa de tudo e ainda tem um código de exemplo que te ajuda a fazer uma conversão básica. =)

Abraços e boa sorte! =)

B

mas você não sabe o que é esse erro que esta dando no meu codigo ?
ou pelo menos tem um exemplo com JPanel ?

mrapha

Não sei, amigo. Eu larguei mão da PDFBox pq dava mto problema na época.

B

E um exemplo com JPedal ? Não consigo fazer o do site funcionar !

mrapha
Kanin_Dragon

Jovem,

Um tempo atrás precisei adotar uma solução semelhante, mas o iText não atendia minhas necessidades então acabei montando uma biblioteca para tal funcionalidade.

Abs,

E

Fal mrapha blz???

então eu estava usando o pdf box tbm sem problemas… o problema é q os pdfs que estão sendo inseridos no nosso sistema aqui para serem convertidos em imagens,… estão vindo com fotos e com letras muito pequenas … o pdf box não está conseguindo converter as imagem tão bem… esse jpedal consegue fazer isso ??? eu baixei um jar nesse link que vc deixou… e testei em um pdf que tenho aqui com imagens e font bem pequena … as imagens sairam bem parecidas com as do pdfbox, não senti muita melhora… tem alguma forma no código pra melhorar a conversão ??? a versão paga consegue fazer isso ???

vlwwww mesmo!!!

mrapha

Oi Edward,

nós utilizamos a versão paga do JPedal e recebemos matérias diariamente para um sistema governamental que trabalha especificamente através desse processamento.
Tanto a versão paga quanto a free nos foi satisfatória. Compramos a ferramenta para ter um uso com suporte mais amplo e sem limitações. Talvez esse limite de fonte possa ser um plus do pago que não sei te mencionar.

Nós precisamos sempre desse processamento eficaz pois trabalhamos usando as medidas do conteúdo a ser impresso nas páginas e precisamos das imagens perfeitas. Então posso te passar que o JPedal é 100% eficaz. Segue o algoritmo que usamos para isso:

public String[] convert(String nome) throws Exception
    {
        //Carregamento das classes de trabalho
        Mensuracao mens = new Mensuracao();
        PdfDecoder decode_pdf = new PdfDecoder(true);
        PdfDecoder.setFontReplacements(decode_pdf);
        BufferedImage pagina = null;
        
        try
        {
            //Abertura do arquivo PDF gravado em disco
            decode_pdf.openPdfFile(nome);

            //Varredura de páginas do arquivo PDF
            for(int page = 1; page <= decode_pdf.getPageCount(); page++)
            {
                //Conversão da página em imagem
                pagina = decode_pdf.getPageAsImage(page);

                //Mensuração da página
                mens.calcular(pagina); //
                
                //Limpeza de memória e fechamento das conexões
                pagina = null;
                decode_pdf.closePdfFile();
                decode_pdf.openPdfFile(nome);
            }
            decode_pdf.closePdfFile();

            //Retorno do resultado final
            return mens.getResultado();
        } 
        catch (Exception e)
        {
            throw new Exception("Erro ao gerar imagens: " + e.getMessage());
        }
    }

Ressalto que descarto o lixo dentro do laço pois recebemos documentos com X páginas. Se eu converter todas as páginas em imagem guardando tudo em um Vector eu terei um Estouro de Memória. Então processe cada página e tente guardar as imagens em disco, ao invés de memória, para não estourar a memória. Acho que é só.

Boa sorte! ;)

Criado 18 de agosto de 2009
Ultima resposta 25 de out. de 2011
Respostas 21
Participantes 6