Ответ 1
Вам нужно установить правильные заголовки HTTP, чтобы сообщить браузеру загрузить файл.
response.addHeader("Content-Type", "application/force-download")
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"")
Как создать файл 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 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 close the content stream
contentStream.close();
}
// Finally Let 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", потому что это либо не поддерживаемый тип файла, либо потому, что файл был повреждены
Вам нужно установить правильные заголовки HTTP, чтобы сообщить браузеру загрузить файл.
response.addHeader("Content-Type", "application/force-download")
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"")
Я не сделал этого некоторое время, так что несите меня, но то, что вы делаете, вместо сохранения PDF файла в файл через поток, вы сохраняете поток в памяти как массив байтов, а затем, когда пользователь нажимает на ссылку, вы устанавливаете тип MIME в PDF и затем открываете массив байтов как поток, который вы возвращаете в качестве ответа. Приношу извинения за то, что я немного туман. Я думаю, что я также использовал jpedal и iText, чтобы сделать это.
Я не могу показать вам весь код, но вот некоторые из них:
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.DottedLineSeparator;
... // class, etc.
public ByteArrayOutputStream createOrderFormPdf(OrderFormDTO dto)
throws DocumentException {
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
Paragraph header = new Paragraph();
header.add(new Phrase(...));
OrderFormDtoPdfAdapter pdfAdapter = new OrderFormDtoPdfAdapter(dto);
header.add(pdfAdapter.getPdfHeaderTable());
document.add(header);
... // other code
Paragraph footer = new Paragraph();
footer.add(pdfAdapter.getPDFFooterTable());
document.add(footer);
Paragraph paragraph = new Paragraph();
PdfTableUtils.addEmptyLine(paragraph, 2);
document.add(paragraph);
document.add(new DottedLineSeparator());
document.close();
return baos;
}
Затем вы можете выписать баос на ваш ответ в формате pdf, используя правильный тип MIME.