2012-01-18 15 views
14

リンクでPDFファイルをダウンロードするにはどうすればよいですか?pdfbox(破損したPDF)でダウンロード可能なPDFを生成するには?

私はJSFを使用してWebアプリケーションを構築していますが、ユーザーが[PDFで保存]リンクをクリックするとPDFをダウンロードできるようになります。

これまでのところ、PDFファイルを生成する作業コードがありますが、そのファイルはデスクトップに保存されています。ユーザーがリンクをクリックすると、pdfファイルをダウンロードする必要はありませんアプリに保存されます。

UPDATE 3: 私はあなたの提案を私のコードをmodifedし、それが働いて、あなたの助けみんなありがとう。

UPDATE 2: 私は次のエラーを取得しています:サポートされていないファイルタイプかのどちらかであるためAdoble Readerは「yourfile.pdf」を開くことができませんでしたファイルは

を損傷しているので、 UPDATE 1: 私はしかし、私はまだこの作品に

This is my method that generated the 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; 
} 

This is my servlet that call the previous code and generates the output and set the header:

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」を開くことができませんでしたサポートされているファイルの種類またはファイルが破損しているために

+0

Re "Update 2"、これはこのバグかもしれません:http://issues.apache.org/jira/browse/PDFBOX-2026。 1.8.5で修正される予定です。または、スナップショットをダウンロードします。 –

+0

こんにちは@Night。私はあなたが達成したものに似た何かを実装しようとしています。応答オブジェクトの宣言をサーブレットの中に入れてください。または、コード全体を投稿することができますか? – Erick

答えて

7

ブラウザにファイルをダウンロードするように指示するには、適切なhttpヘッダーを設定する必要があります。

response.addHeader("Content-Type", "application/force-download") 
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"") 
+0

私の質問にサンプルコードを追加しましたが、ヘッダーを追加しましたが、PDFファイルを開くときに次のエラーが表示されます: Adob​​le Readerは "yourfile.pdf"を開くことができませんでした。ファイルが破損しています。 –

+0

"yourfile。pdf "は生成したファイル名でなければなりません。サンプル名としてのみ使用していますので、バックスラッシュと引用符を削除してみてください – jloper3

+0

response.addHeader(" Content-Disposition "、" attachment; filename = yourFile.pdf ") – jloper3

4

私はこれをしばらくしていませんでしたので、私には負担がかかりますが、ストリームを介して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タイプを使用してPDFとしてあなたの応答でのBAOを書き出すことができます。

+0

あなたの回答に基づいて私のコードの修正版で質問を更新しました。 –

関連する問題