Jasper reports 如何将自定义/动态目标添加到超链接

Jasper reports 如何将自定义/动态目标添加到超链接,jasper-reports,Jasper Reports,我正在使用jasperreports-6.14.0。就我所知,只有一种方法可以将自定义超链接目标添加到任何允许超链接的对象请告诉我有更好的方法(除了将javascript放入我的引用表达式中) 实现net.sf.jasperreports.engine.export.JRHyperlinkTargetProducer接口,在超链接参数中查找要作为目标字符串返回的特定命名参数 扩展net.sf.jasperreports.engine.export.HtmlExporter并将其targetPro

我正在使用jasperreports-6.14.0。就我所知,只有一种方法可以将自定义超链接目标添加到任何允许超链接的对象请告诉我有更好的方法(除了将javascript放入我的引用表达式中)

  • 实现net.sf.jasperreports.engine.export.JRHyperlinkTargetProducer接口,在超链接参数中查找要作为目标字符串返回的特定命名参数
  • 扩展net.sf.jasperreports.engine.export.HtmlExporter并将其targetProducerFactory保护字段设置为新自定义超链接目标生产者的实例
  • 看起来这是唯一的选项,但感觉应该有一种方法可以跳过步骤2,只需设置targetProducerFactory。这几乎就像Jasper开发人员开始做的一样,他们想“不,我只是觉得不对劲。让我们把它拿出来。”


    除非某个善良的灵魂能告诉我一个更好的方法,否则我将执行上述操作。

    自定义目标生产者由HTML导出器作为扩展加载。您可以通过使用自己的
    JasperReportsContext
    实例创建HTML导出器,以编程方式注册扩展,也可以将扩展打包到jar中,并由导出器自动检测

    如果控制HTML导出器的创建,则可以通过编程方式传递扩展:

    JRHyperlinkTargetProducer targetProducer = new JRHyperlinkTargetProducer() {            
        @Override
        public String getHyperlinkTarget(JRPrintHyperlink hyperlink) {
            return "foo";
        }
    };
    JRHyperlinkTargetProducerMapFactory targetProducerFactory = new JRHyperlinkTargetProducerMapFactory();
    targetProducerFactory.addProducer("mycustomtarget", targetProducer);
    
    SimpleJasperReportsContext jasperReportsContext = new SimpleJasperReportsContext();
    jasperReportsContext.setExtensions(JRHyperlinkTargetProducerFactory.class, 
            Collections.singletonList(targetProducerFactory));
    
    HtmlExporter htmlExporter = new HtmlExporter(jasperReportsContext);
    
    如果要自动检测扩展,需要创建一个包含如下类的jar:

    public class CustomTargetProducerExtension implements ExtensionsRegistryFactory {
        @Override
        public ExtensionsRegistry createRegistry(String registryId, JRPropertiesMap properties) {
            JRHyperlinkTargetProducer targetProducer = new JRHyperlinkTargetProducer() {            
                @Override
                public String getHyperlinkTarget(JRPrintHyperlink hyperlink) {
                    return "bar";
                }
            };
            JRHyperlinkTargetProducerMapFactory targetProducerFactory = new JRHyperlinkTargetProducerMapFactory();
            targetProducerFactory.addProducer("mycustomtarget", targetProducer);
            
            return new SingletonExtensionRegistry<>(JRHyperlinkTargetProducerFactory.class, targetProducerFactory);
        }
    }
    

    然后,您的自定义目标生产者将自动检测到具有
    hyperlinkTarget=“mycustomtarget”

    的元素,这正是我所需要的。非常感谢。
    net.sf.jasperreports.extension.registry.factory.my.custom.target.producer=<package>.CustomTargetProducerExtension