Как создать загружаемый PDF с помощью pdfbox (поврежденный PDF)?

Как сделать PDF файл загружаемым по ссылке?

Я создаю веб-приложение на JSF, когда пользователь нажимает на ссылку "Сохранить как PDF", PDF должен быть доступен для загрузки.

Пока у меня есть рабочий код, который генерирует PDF файл, но файл сохраняется на рабочем столе, а я хочу сделать так, чтобы когда пользователь нажимает на ссылку, pdf файл был доступен для загрузки, а не хранился в приложении.

UPDATE 3: Спасибо за помощь, ребята, я изменил свой код с учетом ваших предложений, и он работает.

UPDATE 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", потому что это либо не поддерживаемый тип файла, либо файл поврежден

16
задан Night Elve 19 January 2012 в 15:48
поделиться