Come generare un PDF scaricabile con PDFBox (corrotto PDF)?
Domanda
Come faccio a creare un file PDF scaricabile in un link?
Sto costruendo un'applicazione Web utilizzando JSF, quando l'utente fa clic in un collegamento "Salva As PDF", dovrebbe essere disponibile un PDF per essere scaricato.
Finora ho un codice di lavoro che genera il file PDF, ma il file viene salvato sul mio desktop e quello che voglio fare è che quando l'utente fa clic sul collegamento, il file PDF dovrebbe essere scaricabile invece di essere archiviato nell'app .
Aggiornamento 3: Grazie per il tuo aiuto, ho modificato il mio codice con i tuoi suggerimenti e funziona.
Aggiornamento 2: Sto ricevendo il seguente errore: Adoble Reader non potrebbe aprire "yourfile.pdf" perché non è un tipo di file supportato o perché il file è stato danneggiato
Aggiornamento 1: Sto aggiungendo il mio codice attuale con le modifiche che mi hai sottolineato, tuttavia sto ancora lottando per far funzionare questo
Questo è il mio metodo che ha generato il 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;
}
Questo è il mio servlet che chiama il codice precedente e genera l'output e impostare l'intestazione:
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();
}
Non sono sicuro di quello che mi manca da quando provo ad aprire il PDF ho ricevuto l'errore: Adoble Reader non potrebbe aprire "YourFile.pdf" perché non è un tipo di file supportato o perché il file è stato danneggiato
Nessuna soluzione corretta