Вопрос по itext, struts2, java – Struts2 Показать PDF-файл в JSP

3

Мое требование - создать PDF-файл динамического отчета с некоторыми данными из базы данных, которые я делаю с использованием iText. Теперь я хочу отобразить этот PDF-файл на веб-странице вместе с меню, заголовком, нижним колонтитулом и т. Д.

Таким образом, если у пользователя есть какой-либо просмотрщик PDF, этот PDF-файл должен отображаться на компьютере пользователя с возможностью печати для печати этого PDF-файла.

Here это ответ с использованием iText иHttpServletResponse OutputStream. silver
Вы удостоверились, что установили ответ заголовка для отображения содержимого в строке? В любом случае, не повредит, если вы разместите некоторый код и объясните, что с ним не работает ... Alexis Pigeon

Ваш Ответ

3   ответа
0
public ByteArrayInputStream generatePDF(List<Object> items) {

    try {

        List<InputStream> listInputStream = new ArrayList<InputStream>();
        for (int i = 0; i < items.size(); i++) {
            listInputStream.add(new ByteArrayInputStream(getBytes(items.get(i)));
        }

        HttpServletResponse response = ServletActionContext.getResponse();
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        Document document = new Document();

        PdfWriter writer = PdfWriter.getInstance(document, buffer);
        document.open();
        PdfContentByte cb = writer.getDirectContent();

        for (InputStream inputStream : listInputStream) {

            PdfReader reader = new PdfReader(inputStream);

            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.setPageSize(reader.getPageSize(i));
                document.newPage();
                PdfImportedPage page = writer.getImportedPage(reader, i);
                cb.addTemplate(page, 0, 0);
            }
        }

        document.close();

        byte[] bytes = null;
        bytes = buffer.toByteArray();
        response.setContentLength(bytes.length);

        return new ByteArrayInputStream(bytes);

    } catch(Exception e){
        System.out.println(e);
    }

}
0

Я делаю это, используя действие сinputStream как предложил Ану. И используяpdf.js библиотека.

Онлайн демо

GitHub

8

Вот как я это делаю. Вы можете вызвать это действие внутри iframe или в обычном jsp

public class GeneratePdf extends ActionSupport{
    private InputStream inputStream;
    public String execute(){
        HttpServletResponse response = ServletActionContext.getResponse();
        Document document = new Document();
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        try {
            PdfWriter.getInstance(document, buffer);
            document.open();
                        // do your thing
            document.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        byte[] bytes = null;
        bytes = buffer.toByteArray();
        response.setContentLength(bytes.length);

        if(bytes!=null){
            inputStream = new ByteArrayInputStream ( bytes );
        }
 return SUCCESS;
}

public InputStream getInputStream() {
        return inputStream;
    }
}

В твоих Struts.xml

   <action name="GeneratePdf" class="com.xxx.action.GeneratePdf">
    <result name="success" type="stream">
            <param name="contentType">application/pdf</param>
            <param name="inputName">inputStream</param>
            <param name="contentDisposition">filename="test.pdf"</param>
            <param name="bufferSize">1024</param>
    </result>
   </action>   
Этот ответ действительно спас мой день! благодаря тонну !! :-)
Спасибо за чаевые ! Это с & quot; встроенным; & quot; вcontentDisposition Парам спас мой день. знак равно
эти параметры должны быть взяты из класса GeneratePdf, особенно contentDisposition, чтобы иметь другое имя pdf. Если у вас есть метод public String getContentDisposition () в GeneratePdf в действии, вы получите следующий параметр: & lt; param name = & quot; contentDisposition & quot; & gt; $ {contentDisposition} & lt; / param & gt;
Я сделал одну ошибку, просто чтобы исправить это: & lt; имя_параметра = "contentDisposition" & gt; имя_файла = $ {contentDisposition} & lt; / param & gt;
@Zemzela Точно. Это был просто пример, чтобы показать ОП, как работает базовая настройка. Я не упомянул имя файла, так как я не показал его получатель в классе действия.

Похожие вопросы