Как сделать файл PDF доступным для загрузки по ссылке?
Я создаю веб-приложение с помощью JSF, когда пользователь нажимает ссылку "Сохранить как PDF", и PDF-файл должен быть доступен, чтобы бытьскачал.
Пока у меня есть рабочий код, который генерирует файл PDF, но файл сохраняется на моем рабочем столе, и я хочу сделать так, чтобы, когда пользователь нажимает на ссылку, файл PDF былзагружается вместо сохранения в приложении.
ОБНОВЛЕНИЕ 3: Спасибо за вашу помощь, ребята, я изменил свой код с вашими предложениями, и он работает.
ОБНОВЛЕНИЕ 2: Я получаю следующую ошибку: Adoble Reader не удалось открыть «yourfile.pdf», так как он не поддерживается или тип файла поврежден
ОБНОВЛЕНИЕ 1: Я добавляю свой текущий код с изменениями, которые вы указали мне, однако я все еще изо всех сил пытаюсь сделать эту работу
Это мой метод, который сгенерировал 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;
}
Это мой сервлет, который вызывает предыдущий код, генерирует вывод и устанавливает заголовок:
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();
}
Я не уверен, что мне не хватает, так как при попытке открыть PDF я получил сообщение об ошибке: Adoble Reader не смог открыть "yourfile.pdf", потому что это не поддерживаемый тип файла, или потому чтофайл был поврежден