如何在链接中下载PDF文件?
我正在使用JSF构建Web应用程序,当用户单击"另存为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;
}
这是我的servlet,它调用前面的代码并生成输出并设置标头:
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",因为它不是受支持的文件类型,或者因为文件已被损坏
小智 7
您需要设置正确的http标头,以告知浏览器下载文件.
response.addHeader("Content-Type", "application/force-download")
response.addHeader("Content-Disposition", "attachment; filename=\"yourFile.pdf\"")