Abir arquivo pdf no servidor com java

Boa tarde, estou fazendo uma aplicação web e quero abrir um documento pdf através do Java. Deve abrir em todos os OS’s.

Utilizei o java.awt.Desktop, porem ele só funciona quando a aplicação esta em local, quando subo no servidor GlassFish ele da HandlessException. Alguém tem alguma ideia de como posso abrir o documento?

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

@WebServlet(urlPatterns = { "/relatorio" })
public class RelatorioController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
//	String diretorioUpload = System.getProperty("java.io.tmpdir");
	String diretorioUpload = "/home/relatorio/";

	public RelatorioController() {
		super();
	}

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext sessionOperador = getServletContext();
		switch (request.getRequestURI()) {
		case "/NetCenter/relatorio":
			criarPdf();
			break;
		}
	}

	public void criarPdf() {
		System.out.println("Inicio");
		
		Document document = new Document(PageSize.A4.rotate(), 10, 10, 10, 10);
		try {
			// step2
			PdfWriter.getInstance(document, new FileOutputStream(diretorioUpload + "arquivopdf.pdf"));
			// step3
			document.open();
			// step4
			String[] bogusData = { "M0065920", "SL", "FR86000P", "PCGOLD", "119000", "96 06", "2001-08-13", "4350",
					"6011648299", "FLFLMTGP", "153", "119000.00" };
			int NumColumns = 12;

			PdfPTable datatable = new PdfPTable(NumColumns);
			int[] headerwidths = { 9, 4, 8, 10, 8, 11, 9, 7, 9, 10, 4, 10 }; // percentage
			datatable.setWidths(headerwidths);
			datatable.setWidthPercentage(100); // percentage
			datatable.getDefaultCell().setPadding(3);
			datatable.getDefaultCell().setBorderWidth(2);
			datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
			datatable.addCell("Clock #");
			datatable.addCell("Trans Type");
			datatable.addCell("Cusip");
			datatable.addCell("Long Name");
			datatable.addCell("Quantity");
			datatable.addCell("Fraction Price");
			datatable.addCell("Settle Date");
			datatable.addCell("Portfolio");
			datatable.addCell("ADP Number");
			datatable.addCell("Account ID");
			datatable.addCell("Reg Rep ID");
			datatable.addCell("Amt To Go ");

			datatable.setHeaderRows(1); // this is the end of the table header

			datatable.getDefaultCell().setBorderWidth(1);
			for (int i = 1; i < 750; i++) {
				if (i % 2 == 1) {
					datatable.getDefaultCell().setGrayFill(0.9f);
				}
				for (int x = 0; x < NumColumns; x++) {
					datatable.addCell(bogusData[x]);
				}
				if (i % 2 == 1) {
					datatable.getDefaultCell().setGrayFill(1);
				}
			}
			document.add(datatable);
		} catch (Exception de) {
			System.out.println(de);
		}
		// step5
		document.close();
		
		try {
			Desktop desktop = Desktop.getDesktop();  
			desktop.open(new File(diretorioUpload + "arquivopdf.pdf"));
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

Vc não deve abrir um PDF dessa forma em um projeto web. Pois o projeto roda num servidor, e o uso de java.awt.Desktop inicia o navegador na maquina onde ele está sendo executado (no próprio servidor onde o sistema está sendo executado).

Vc deve retornar o conteúdo do arquivo PDF na forma de array de bytes (byte[]) para que o navegador do usuário consiga realizar o download do arquivo. No download, vc pode forçar o navegador a salvar diretamente o arquivo, ou dizer para ele tentar abrir ele (caso o usuário tenha algum visualizador de pdf instalado na máquina dele).

Dê uma lida nesse tutorial, q ele tem um exemplo de como vc irá conseguir fazer isso: https://www.baeldung.com/servlet-download-file

Maninho, segui o tutorial que vc me passou, funcionou certinho porem percebi que so consigo pegar o arquivo dentro do WEB-INF, atraves do servidor ou outro diretorio dentro da aplicacao, nao funcionou.

1 curtida

Carregando um arquivo dentro do projeto para obter seus bytes, só é possível se o arquivo realmente estiver no classpath (no seu caso, que deve ser a estrutura de um projeto java web padrão, no WEB-INF mesmo).

Fechou, muito obrigado pela ajuda. Agora vou tentar fazer upload do arquivo dentro da web-inf

O upload não pode ser feito dentro da pasta WEB-INF. Vc terá que jogar os arquivos numa pasta qualquer do servidor.

Caramba, para fazer o download tem que ser no WEB-INF e para o upload na pasta do servidor. Como faco entao? Algo para me indicar?

O upload não pode ser em alguma pasta do projeto, pq ao atualizar o projeto no servidor, os arquivos seriam perdidos.

Tu pode separar uma pasta no servidor (pode ser dentro do servidor web msm - glassfish), ou na máquina onde o servidor está rodando. Com isso, vc iria usar o caminho da pasta para recuperar e guardar os arquivos, referenciando a pasta pelo caminho de forma fixa no código.

Para vc ter uma ideia, em sistemas mais robustos, são usadas soluções como NFS (Network File System) para armazenar esses arquivos.