如何将 custom/dynamic 目标添加到超链接

How to add a custom/dynamic target to a hyperlink

我正在使用 jasperreports-6.14.0。据我所知,只有一种方法可以将自定义超链接目标添加到任何允许超链接的内容。 告诉我有更好的方法(除了将 javascript 放入我的参考表达式之外)。

  1. 实现 net.sf.jasperreports.engine.export.JRHyperlinkTargetProducer 接口,在超链接参数中查找特定的命名参数 return 作为您的目标字符串。
  2. 扩展 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);

如果您想自动检测扩展,您需要创建一个包含 class 的 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);
    }
}

并将 jasperreports_extension.properties 资源放入包含以下行的 jar 的根目录中:

net.sf.jasperreports.extension.registry.factory.my.custom.target.producer=<package>.CustomTargetProducerExtension

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

的元素