Как я могу заставить JasperViewer установить приоритет сохранения в PDF - PullRequest
0 голосов
/ 01 марта 2019

У меня есть реализация, где 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 голосов
/ 03 марта 2019

После тщательного осмотра я понял, что совершаю действительно глупую ошибку.Он должен был выбросить 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 показывает PDF в качестве первой опции сохранения.enter image description here

0 голосов
/ 02 марта 2019

Они называются 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...