如何使用Struts2中的itext在新窗口中生成PDF

时间:2014-11-24 06:02:49

标签: pdf struts2 http-headers content-disposition

 <action name="PDF" class="OwnerDetail" method="createPDF">
     <result name="success" type="stream">
        <param name="contentType">application/pdf</param>
        <param name="inputName">inputStream</param>
        <param name="contentDisposition">attachment;filename="RegistrationSummaryReport.pdf"</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

上述代码生成PDF作为附件。但我需要在新窗口中打开PDF。请提供您的建议

1 个答案:

答案 0 :(得分:2)

您需要更改the contentDisposition。这是一个HTTP头,因此在使用除Struts2之外的其他技术时也需要这样做(例如,Servlets)。

Content-Disposition有两个对您的案例很有意思的主要值:

  • attachment:询问用户下载文件或使用桌面应用程序打开文件所需的操作。

  • inline(默认值):尝试使用浏览器插件在新标签页(或窗口)中打开文件。如果找不到该Content-Type的插件,它会要求用户选择一个桌面应用程序来打开它。

然后你只需要:

<param name="contentDisposition">
    inline;filename="RegistrationSummaryReport.pdf"
</param>

或只是

<param name="contentDisposition">
    filename="RegistrationSummaryReport.pdf"
</param>

修改

如@BrunoLowagie的评论所示,我可能省略了一个重要部分。

虽然您需要inline在浏览器中打开文档是正确的,但还有一步(我认为这是理所当然的,同时它也是如此)可能不是)需要在另一个选项卡/窗口中打开该文档而不是当前文档:您需要通过指定target属性或使用javascript来调用该操作window.open()

<s:url var="myUrl" action="downloadPdf" namespace="/foobar" />

<!-- In a new Tab/Window without javascript -->  
<s:a href="%{myUrl} target="_blank">
    download
</s:a>

<!-- In a new Tab/Window with javascript -->    
<s:a href="javascript:window.open('%{myUrl}');>
    download
</s:a>

详细了解this related answer