¿Cómo generar un PDF descargable con PDFBox (PDF corrupto)?
Pregunta
¿Cómo hago descargable un archivo PDF en un enlace?
Estoy construyendo una aplicación web usando JSF, cuando el usuario hace clic en un enlace "Guardar como PDF", debe estar disponible un PDF para descargar.
Hasta ahora tengo un código de trabajo que genera el archivo PDF, pero el archivo se guarda en mi escritorio y lo que quiero hacer es que cuando el usuario haga clic en el enlace, el archivo PDF debe descargarse en lugar de almacenarse en la aplicación .
Actualización 3: Gracias por su ayuda, chicos, modifiqué mi código con sus sugerencias y está funcionando.
Actualización 2: Recibo el siguiente error: Adoble Reader no pudo abrir "YourFile.pdf" porque no es un tipo de archivo compatible o porque el archivo ha sido dañado
Actualización 1: Estoy agregando mi código actual con los cambios que me ha señalado, sin embargo, todavía estoy luchando por hacer que esto funcione
Este es mi método que generó el PDF:
public ByteArrayOutputStream createPDF() throws IOException, COSVisitorException {
PDDocument document;
PDPage page;
PDFont font;
PDPageContentStream contentStream;
PDJpeg front;
PDJpeg back;
InputStream inputFront;
InputStream inputBack;
ByteArrayOutputStream output = new ByteArrayOutputStream();
// Creating Document
document = new PDDocument();
// Creating Pages
for(int i=0; i<2; i++) {
page = new PDPage();
// Adding page to document
document.addPage(page);
// Adding FONT to document
font = PDType1Font.HELVETICA;
// Retrieve Image to be added to the PDF
inputFront = new FileInputStream(new File("D:/Media/imageFront.jpg"));
inputBack = new FileInputStream(new File("D:/Media/imageBack.jpg"));
BufferedImage buffFront = ImageIO.read(inputFront);
BufferedImage resizedFront = Scalr.resize(buffFront, 460);
BufferedImage buffBack = ImageIO.read(inputBack);
BufferedImage resizedBack = Scalr.resize(buffBack, 460);
front = new PDJpeg(document, resizedFront);
back = new PDJpeg(document, resizedBack);
// Next we start a new content stream which will "hold" the to be created content.
contentStream = new PDPageContentStream(document, page);
// Let's define the content stream
contentStream.beginText();
contentStream.setFont(font, 8);
contentStream.moveTextPositionByAmount(10, 770);
contentStream.drawString("Amount: $1.00");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(font, 8);
contentStream.moveTextPositionByAmount(200, 770);
contentStream.drawString("Sequence Number: 123456789");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(font, 8);
contentStream.moveTextPositionByAmount(10, 760);
contentStream.drawString("Account: 123456789");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(font, 8);
contentStream.moveTextPositionByAmount(200, 760);
contentStream.drawString("Captura Date: 04/25/2011");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(font, 8);
contentStream.moveTextPositionByAmount(10, 750);
contentStream.drawString("Bank Number: 123456789");
contentStream.endText();
contentStream.beginText();
contentStream.setFont(font, 8);
contentStream.moveTextPositionByAmount(200, 750);
contentStream.drawString("Check Number: 123456789");
contentStream.endText();
// Let's close the content stream
contentStream.close();
}
// Finally Let's save the PDF
document.save(output);
document.close();
return output;
}
Este es mi servlet que llama al código anterior y genera la salida y establece el encabezado:
try {
ByteArrayOutputStream output = new ByteArrayOutputStream();
output = createPDF();
response.addHeader("Content-Type", "application/force-download");
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"");
response.getOutputStream().write(output.toByteArray());
} catch (Exception ex) {
ex.printStackTrace();
}
No estoy seguro de lo que me falta, ya que cuando intento abrir el PDF recibí el error: el lector adobado no pudo abrir "YourFile.pdf" porque no es un tipo de archivo compatible o porque el archivo ha sido dañado
No hay solución correcta