PDFファイルをリンクでダウンロード可能にするにはどうすればよいですか?
JSFを使用してWebアプリケーションを構築していますが、ユーザーが[PDFとして保存]リンクをクリックすると、PDFがダウンロード可能になります。
これまでのところ、PDFファイルを生成する作業コードがありますが、ファイルはデスクトップに保存されます。ユーザーがリンクをクリックすると、PDFファイルが表示されます。アプリに保存する代わりにダウンロード可能にする。
更新3:助けてくれてありがとう、私はあなたの提案で私のコードを修正しました、そしてそれは働いています。
PDATE 2:次のエラーが発生します:Adoble Readerは、サポートされているファイルタイプではないか、ファイルに破損している
PDATE 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エラーが発生しました:サポートされているファイルタイプではないため、AdobleReaderは "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;
}
次に、正しいMIMEタイプを使用して、応答のbaosをpdfとして書き出すことができます。