Java Jasper Report:如何定制JasperViewer,使其只能以一种格式导出?

Java Jasper Report:如何定制JasperViewer,使其只能以一种格式导出?,java,jasper-reports,viewer,Java,Jasper Reports,Viewer,我们的客户很喜欢Jasper viewer,但我们有一个问题。它将数据导出为几种不同的格式(PDF、Excel、CSV、HTML等),但我们的客户只希望导出为PDF 我们如何定制Jasper Viewer,以便用户可以选择的唯一导出数据格式是PDF?我找到了一个解决方案,在我看来,这个解决方案非常糟糕,但在我的案例中起到了作用 嗯:在阅读JasperViewer类的源代码时,我发现该类上有一个名为viewer的受保护字段 所以,我所要做的就是编写这样的代码: Field jrViewerFiel

我们的客户很喜欢Jasper viewer,但我们有一个问题。它将数据导出为几种不同的格式(PDF、Excel、CSV、HTML等),但我们的客户只希望导出为PDF


我们如何定制Jasper Viewer,以便用户可以选择的唯一导出数据格式是PDF?

我找到了一个解决方案,在我看来,这个解决方案非常糟糕,但在我的案例中起到了作用

嗯:在阅读JasperViewer类的源代码时,我发现该类上有一个名为viewer的受保护字段

所以,我所要做的就是编写这样的代码:

Field jrViewerField;
            try {
                jrViewerField = viewer.getClass().getDeclaredField("viewer");

                jrViewerField.setAccessible(true);
                JRViewer jrViewer = (JRViewer) jrViewerField.get(viewer);
                List<JRSaveContributor> savers = new ArrayList<JRSaveContributor>();
                for (JRSaveContributor sc : jrViewer.getSaveContributors()) {

                        savers.add(sc);

                }

                for (JRSaveContributor sc : savers) {
                    if (! sc.getClass().getName().toLowerCase().contains("pdf")) {
                        jrViewer.removeSaveContributor(sc);
                    }
                }


            } catch (Exception ex) {
              ex.printStackTrace();
            } 
字段jrViewerField;
试一试{
jrViewerField=viewer.getClass().getDeclaredField(“查看器”);
jrViewerField.setAccessible(true);
JRViewer JRViewer=(JRViewer)jrViewerField.get(查看器);
列表保存程序=新建ArrayList();
对于(JRSaveContributor sc:jrViewer.getSaveContributors()){
储蓄者。添加(sc);
}
用于(JRSaventor sc:saver){
如果(!sc.getClass().getName().toLowerCase()包含(“pdf”)){
jrViewer.removeSaveContributor(sc);
}
}
}捕获(例外情况除外){
例如printStackTrace();
} 

这不是一个漂亮的解决方案,但至少它与Jasper Reports的3.7.1版本一起工作。它不保证可以与其他版本的系统一起使用,因此我强烈建议任何人使用此解决方案,除非这是您的最后一个资源。

从\apache-tomcat-7.0.12\webapps\jasperserver\WEB-INF\flows打开viewReportsBean.xml

继续向下滚动到文档末尾,您将看到以下几行

<entry key="pdf" value-ref="pdfExporterConfiguration"/>
     <entry key="xls" value-ref="xlsExporterConfiguration"/> 
    <entry key="csv" value-ref="csvExporterConfiguration"/>
    <entry key="docx" value-ref="docxExporterConfiguration"/>
    <entry key="rtf" value-ref="rtfExporterConfiguration"/>
    <entry key="swf" value-ref="swfExporterConfiguration"/>
    <entry key="odt" value-ref="odtExporterConfiguration"/>
    <entry key="ods" value-ref="odsExporterConfiguration"/>
    <entry key="xlsx" value-ref="xlsxExporterConfiguration"/> 
    <!-- entry key="txt" value-ref="txtExporterConfiguration"/
</util:map> 

为什么不设置一个只允许PDF的SaveContributor?例如。JRPdfSaveContributor

    JRViewer viewer = new JRViewer(jrPrint);
    viewer.setSaveContributors(new JRSaveContributor[] { new JRPdfSaveContributor(Locale.getDefault(), null) });
    JRViewer viewer = new JRViewer(jrPrint);
    viewer.setSaveContributors(new JRSaveContributor[] { new JRPdfSaveContributor(Locale.getDefault(), null) });