我怎样才能让JasperViewer优先保存PDF选项

时间:2019-03-01 14:54:44

标签: java swing reflection jasper-reports

我有一个实现,其中JasperViewer用于预览和保存报告。观看者提供的第一种保存格式是.jrprint,我正在尝试将其更改为pdf。我正在采用以下方法来解决这个问题

private static void promotePdfSaveFormat(JasperViewer jasperViewer) {
    /* get via reflection (with jOOR) the parameter JasperViewer object's member viewer (of type JRViewer) */
    JRViewer viewer = on(jasperViewer).call("viewer").get();
    /* get via reflection JRViewer object's member tlbToolBar (of type JRViewerToolbar) */
    JRViewerToolbar tlbToolBar = on(viewer).call("tlbToolBar").get();
    /* call tlbToolBar's getSaveContributors() */
    Arrays.stream(tlbToolBar.getSaveContributors()).forEach(
        e -> {
            /* Find the one that is of type JRPdfSaveContributor (using instanceof) */
            if (e instanceof JRPdfSaveContributor){
                /* set JRViewerToolbar object member lastSaveContributor value to the instance of JRPdfSaveContributor */
                on(tlbToolBar).call("lastSaveContributor").get();
            }
        }
    );
}

每次在JasperViewer viewer = new JasperViewer(...)之类的类中创建新对象时,我都会在其后立即添加promotePdfSaveFormat(viewer)。运行应用程序时,我在JRViewer viewer = on(jasperViewer).call("viewer").get();

处收到错误消息

错误如下

org.joor.ReflectException: java.lang.NoSuchMethodException: No similar method viewer with params [] could be found on type class net.sf.jasperreports.view.JasperViewer.

2 个答案:

答案 0 :(得分:1)

它们被称为JRSaveContributor

您可以设置自己的JRViewer.setSaveContributors或重新排序(删除)的一种简便方法是获取实例化的对象,然后循环检查说明以查看您想要保留/重新排序的内容,然后进行设置回到JasperViewer

快速示例,首先设置pdf。

final JRViewer jrv = new JRViewer(report);
JRSaveContributor[] sv = jrv.getSaveContributors();
List<JRSaveContributor> reorded = new ArrayList<JRSaveContributor>();
for (JRSaveContributor s : sv) {
    if (s.getDescription().contains(".pdf")){
        reorded.add(0,s);
    }else{
        reorded.add(s);
    }
}
jrv.setSaveContributors((JRSaveContributor[]) reorded.toArray(new JRSaveContributor[reorded.size()]));
  

您可能还想跳过.jrprint?如果您使用的是Java8,则可以使用流来改进此代码,我将该练习留给读者。

结果

enter image description here

答案 1 :(得分:0)

经过仔细检查,我意识到自己犯了一个非常愚蠢的错误。之所以会抛出$author = $this->getReference('author-reference'); 是因为以下几行试图访问NoSuchMethodException而不是method

field

然后,我修改了方法,以访问JRViewer viewer = on(jasperViewer).call("viewer").get(); JRViewerToolbar tlbToolBar = on(viewer).call("tlbToolBar").get(); 。整个方法现在看起来像这样:

field

现在,private static void promotePdfSaveFormat(JasperViewer jasperViewer) { /* get via reflection the parameter JasperViewer object's member viewer (of type JRViewer) */ JRViewer viewer = on(jasperViewer).field("viewer").get(); /* get via reflection JRViewer object's member tlbToolBar (of type JRViewerToolbar) */ JRViewerToolbar tlbToolBar = on(viewer).field("tlbToolBar").get(); /* call tlbToolBar's getSaveContributors() */ Arrays.stream(tlbToolBar.getSaveContributors()) /* filter instance of type JRPdfSaveContributor */ .filter(e -> e instanceof JRPdfSaveContributor) /* set JRViewerToolbar object member lastSaveContributor value to the instance of JRPdfSaveContributor */ .forEach(e -> on(tlbToolBar).set("lastSaveContributor", e)); } 显示JasperViewer作为第一个保存选项。 enter image description here