Visualização de Arquivo PDF (Aplicação Swing)

Galera, estou tendo o seguinte problema:

Estou tentando usar o Acrobat Viewer JavaBean para visualizar meus arquivos PDF a partir de uma aplicação SWING.
Fazendo um teste inicial, para carregar um arquivo que se encontra no sistema de arquivos, tudo vai bem; eu consigo visualizar tudo numa boa, consigo fazer a seleção de determinados trechos do texto.
O código desse teste inicial é o seguinte:

import javax.swing.*;
import java.io.*;
import com.adobe.acrobat.*;
import java.awt.*;

public class ExibePDF{
	
	
	public static void main(String args[]){
		
		InputStream input;
		Viewer viewer;
		JFrame frame = new JFrame("Visualização de Arquivo PDF");
		frame.setLayout(new BorderLayout());	
				
		try{
			
			viewer = new Viewer();
			frame.add(viewer, BorderLayout.CENTER);
			input = new FileInputStream (new File("C:/adobe/java.pdf"));
			
			
			if(input != null){

                ByteArrayOutputStream output = new ByteArrayOutputStream();
                // set read buffer size

                byte[] rb = new byte[1024];
                int ch = 0;

                while ((ch = input.read(rb)) != -1){	
                    output.write(rb, 0, ch);
                }

                byte[] b = output.toByteArray();
                input.close();
                output.close();
                
                viewer.setDocumentInputStream(new ByteArrayInputStream(b));
			}
					
			
			viewer.activate();
			
			viewer.setProperty("Default_Page_Layout", "SinglePage");
			viewer.setProperty("Default_Zoom_Type", "FitVisibleWidth");
			viewer.setProperty("Default_Magnification", "100");
			
			frame.setSize(800, 600);
			frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
			frame.setVisible(true);
		}
		catch(Exception e){
			
			JOptionPane.showMessageDialog(null, 
                        "Não foi possível  abrir o arquivo!", 
                        "Erro", JOptionPane.ERROR_MESSAGE);	
                        
                        System.exit(0);
		}
		
		
		
	}
}

Porém, na aplicação onde devo utilizar o Viewer, eu guardo os arquivos PDF no banco de dados, e ao tentar visualizar o arquivo (criando um ByteArrayInputStream com base nos bytes (byte[]) vindos do banco) o mesmo não é apresentado adequadamente.
Esse “não visualizar adequadamente” é: o texto não aparece, somente as imagens que fazem parte do documento, assim como formatações (realce de texto, por exemplo).
Ao tentar selecionar um trecho, só de clicar no documento, já recebo uma exceção, coisa que não acontece quando abro um arquivo direto do sistema de arquivos.

Alguém tem alguma idéia do porquê disso?
Sei que posso criar um arquivo temporário no sistema de arquivos, e visualizá-lo, mas gostaria de usar diretamente os bytes obtidos no banco.

Alguém sugere outro visualizador (que seja gratuito)?

[]'s

Galera… fiz um teste aqui, gerando um arquivo temporário, e mesmo assim o Viewer não apresenta o texto corretamente, mas se eu abro o arquivo temporário, o mesmo está legível. :stuck_out_tongue:

alguma sugstão?

[editado] imagino que talvez seja algum problema de tipo de fonte [/editado]

Outra informação que possa ser relevante:

eu estou gerando esses pdf’s a partir do open-office… minha aplicação, a partir de um modelo de documento guardado no banco de dados, gera um arquivo temporário do tipo .sxw, abre este modelo no open-office, faz alguns search-replace no documento (tipo mala-direta), e gera o pdf, usando a api do próprio open-office.

voce ja tentou

viewer.setDocumentInputStream(new FileInputStream (new File("C:/adobe/java.pdf"));

[quote=felipecruz]voce ja tentou

viewer.setDocumentInputStream(new FileInputStream (new File("C:/adobe/java.pdf")); [/quote]

Sim Felipe, o método que chama o viewer está assim:

public void exibirDocumentoPDF(InputStream input, String titulo) throws IOException, Exception{		
		
        frame = new JFrame(titulo);
        frame.setLayout(new BorderLayout());	

        try{

            viewer = new Viewer();		
            frame.add(viewer, BorderLayout.CENTER);               

            viewer.setDocumentInputStream(input);

            viewer.activate();

            viewer.setProperty("Default_Page_Layout", "SinglePage");
            viewer.setProperty("Default_Zoom_Type", "FitVisibleWidth");
            viewer.setProperty("Default_Magnification", "100");

            frame.setSize(800, 600);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
            frame.setVisible(true);
        }
        catch(IOException e){
            // incluir um logger aqui, se necessário!
            e.printStackTrace();
            throw e;
        }
        catch(Exception e){
            // incluir um logger aqui, se necessário!
            e.printStackTrace();
            throw e;
        }

e o método que chama esse aí de cima, responsável por criar o arquivo temporário, é este:

public void exibirPDF() throws IOException, Exception{
    
        File aFile = null;
        
        try{
            
            ManipuladorDePDF manipuladorDePdf = new ManipuladorDePDF();            

            aFile = new File(".");
            String path = aFile.getCanonicalPath();
            
            String nomeDirDestino = path+File.separator+"temp"+File.separator;
            
            File dirDestino = new File(nomeDirDestino);
            
            // Criar o arquivo temporário.
            File temp = File.createTempFile(descricao.trim(), ".pdf", dirDestino);

            // Deletar o arquivo quando o programa finalizar
            temp.deleteOnExit();

            // Escrever os dados no arquivo temporário
            FileOutputStream fos = new FileOutputStream(temp);
            fos.write(contrato); // contrato é um byte[]
            fos.close();

            InputStream input = new FileInputStream(temp);            
            
            if(input != null){

                ByteArrayOutputStream output = new ByteArrayOutputStream();

                byte[] rb = new byte[1024];
                int ch = 0;

                while ((ch = input.read(rb)) != -1){	
                        output.write(rb, 0, ch);
                }

                byte[] b = output.toByteArray();
                input.close();
                output.close();                
                
                manipuladorDePdf.exibirDocumentoPDF(new ByteArrayInputStream(b), descricao);
            }            
        }
        catch(IOException e){
            // substituir por um logger se necessário
            e.printStackTrace();
            throw e;
        }
        catch(Exception e){
            // substituir por um logger se necessário
            e.printStackTrace();
            throw e;
        }
    }

ele até apresenta o documento, mas como falei, sem mostrar o texto… e o texto está lá, porque os realces de texto aparecem, só a fonte que não :stuck_out_tongue:

e se eu abro o temporário no Adobe reader mesmo (sem ser o bean), eu o visualizo numa boa.

é… realmente tem algo estranho ai…

vc ja tentou usar seu codigo pra abrir um pdf q vc sabe q é valido?
talvez o problema seja na geração do pdf

vc ja tentou abrir o pdf q vc gerou pelo acrobat?

eu ja usei esse componente… com pdf gerado pelo itext e nao tive nenhum problema…

eu so ainda nao entendi pq vc usa o bytearray ao inves de usar direto assim

manipuladorDePdf.exibirDocumentoPDF(input , descricao);

pois é… marcação mesmo… sugestão acatada :smiley:

sim… abre numa boa… só no bean que não aparece direito…

e se eu tento abrir um outro arquivo qualquer com o bean, ele abre numa boa tb… a questão é que eu acho que ao ir ao banco e voltar, o arquivo sofre alguma modificação que impede que o bean o abra…

Aliás… fazendo um teste percebi que mesmo antes de ir para o banco o bean não consegue apresentar o pdf corretamente… deve-se ao fato de estar sendo gerado pelo open-office :stuck_out_tongue:

estranhoooo… pq se abre por fora o visualizador deveria abrir tb…

como vc obtem o pdf do banco?

Então… percebi que o problema não é o banco… quando obtenho o pdf do banco, e gero um temporário para a apresentação, consigo visualizar numa boa pelo adobe reader, só o viewer que não dá conta.

[quote=Luiz_Gustavo][quote=felipecruz]
como vc obtem o pdf do banco?
[/quote]

Então… percebi que o problema não é o banco… quando obtenho o pdf do banco, e gero um temporário para a apresentação, consigo visualizar numa boa pelo adobe reader, só o viewer que não dá conta.[/quote]

:shock:

como sempre… só pode estar faltando algum detalhe muito bobo entao hehehe

no pior dos casos voce manda roda o acrobat ao inves de chamar o visualizador! hehehe

boa sorte!!

não acho que tenha algo relacionado mas… segundo os comentários do artigo esta api é meio velha e não funciona muito bem com swing… tenta trocar pra awt e ver se fica igual… apesar que não acho que seja isso, não custa tentar hehehe

“Caro cara do pdf”! :smiley:
Não conheço essa aplicação mas de postscript sei um pouco.
Em um arquivo postscript podemos ter fontes, imagens(dentro), referencia de imagens(de fora), objetos encapsulados e bitmaps.
Acho que seu problema é com o path onde se encontra as fontes. Então ele não consegue renderizar utilizando uma fonte que o documento está pedindo.
Primeiramente verifique se essa API que vc tá sofrendo com ele se ela já vem com as fontes, se não viar vc tera que setar o path, como se fosse o classpath mas um fontpath.
Exemplo no linux, temos o clássico ghostscript(interpretados de postscript)
no arquivo

/etc/fonts/Fontmap

é um mapeamento das fontes.

/CenturySchL-BoldItal (/usr/local/share/fonts/CenturySchL_BoldItal.ttf) ;

Neste caso uma fonte TrueType que pode ser convertida para um padrão .pfb .pfa ou .pfm em tempo de execução pelo aplicativo reenderizador ghostscript.
Sugio a vc que abrir o seu pdf utilizando o gs (ghostview) e verificar quais fontes são necessárias e depois defina o path.
PDF é um PS “compilado”


#!
/Helvetica findfont 12 scalefont setfont
150 150 moveto
(DIGA OLA) show
showpage

Salve o arquivo como .ps e converta para pdf
Se a sua API estiver pelo menos com a fonte padrão(Helvetica) isso funcionará.

Obrigado pelas dicas galera!!!

[]'s

Eu sou iniciante no Java, estou estudando a uns 2 meses e fiquei interessado em fazer uma aplicação java utilizando um vizualizador PDF. Vocês tem uma apostila passo-a-passo, como implementar na aplicação? ou será que vc’s poderiam me ensinar por aqui?
Agradeço muito.

Vc pode usar http://download.oracle.com/javase/6/docs/api/java/awt/Desktop.html#open%28java.io.File%29

Que vai delegar a tarefa pro SO. E se o SO tiver um reader de PDF, vai abrir.