Relatório Jasper: Como personalizar o JasperViewer para que ele só pudesse exportar em um formato?
-
24-09-2019 - |
Pergunta
Nosso cliente está amando o espectador Jasper, mas temos um problema. Ele exporta dados para vários formatos diferentes (PDF, Excel, CSV, HTML, etc.), mas nosso cliente só deseja exportar para o PDF.
Como podemos personalizar o visualizador Jasper para que o único formato que nossos usuários possam optar por exportar dados é PDF?
Solução
Encontrei uma solução que, na minha opinião, é terrível, mas trabalhei no meu caso.
Bem: Lendo o código -fonte da classe JasperViewer, encontrei um campo protegido chamado Viewer nessa classe.
Então, tudo o que eu precisava fazer era escrever um código como este:
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();
}
Não é uma solução bonita, mas pelo menos funcionou com a versão 3.7.1 do Jasper Reports. Ele não tem garantia que possa funcionar com outras versões do sistema, por isso desencorajo alguém a usar esta solução, apenas se esse for o seu último recurso.
Outras dicas
Por que não definir um produtor de SafeContributle que permite apenas PDFs? Por exemplo. O JRPDFSAVECONTRIBUTOR.
JRViewer viewer = new JRViewer(jrPrint);
viewer.setSaveContributors(new JRSaveContributor[] { new JRPdfSaveContributor(Locale.getDefault(), null) });
Open up viewReportsbean.xml de apache-tomcat-7.0.12 webApps jasserverver web-inf fluxos
Continue rolando para baixo até o final do documento, você verá as seguintes linhas
<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>
Basta adicionar uma etiqueta de comentário para desativá -los e pronto !! Codificação feliz ...
<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>