微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果使用自定义的genericElement,如何解决“找不到用于名称命名的通用元素处理程序”错误?

如何解决如果使用自定义的genericElement,如何解决“找不到用于名称命名的通用元素处理程序”错误?

我正在尝试修改jasper报告的example,以将带有HTML处理程序的通用元素定制为带有PDF处理程序的Example。但是在尝试运行

时,我总是得到相同的错误消息。
net.sf.jasperreports.engine.JRRuntimeException: No generic element handlers found for namespace http://jasperreports.sourceforge.net/jasperreports/customPDFexpoter.
at net.sf.jasperreports.engine.export.GenericElementHandlerEnviroment.getElementHandler(GenericElementHandlerEnviroment.java:112)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportGenericElement(JRPdfExporter.java:4136)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1290)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1210)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:1074)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:691)
at com.jaspersoft.studio.editor.preview.actions.export.AExportAction.exportWithProgress(AExportAction.java:223)
at com.jaspersoft.studio.editor.preview.actions.export.AExportAction.doPreview(AExportAction.java:347)
at com.jaspersoft.studio.editor.preview.actions.export.AExportAction$3.run(AExportAction.java:191)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

我也遵循了这个example方法,如何将控制器嵌入PDF中,但没有成功。此外,找不到命名空间。我在项目配置中错过了什么吗?

这是我的JRXML:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.14.0.final using JasperReports Library version 6.14.0-2ab0d8625be255bf609c78e1181801213e51db8f  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Blank_A4" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="c685fd77-7e9f-4762-9a4a-422d1c15aed0">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="500" splitType="Stretch">
            <property name="com.jaspersoft.studio.unit.height" value="px"/>
            <genericElement>
                <reportElement x="94" y="93" width="236" height="107" uuid="0dbdbc2d-cead-47eb-8605-e18cc325259a"/>
                <genericElementType namespace="http://jasperreports.sourceforge.net/jasperreports/customPDFexpoter" name="print"/>
            </genericElement>
        </band>
    </title>
</jasperReport>

我的jasperreports_extension.properties (在src-Folder内)

net.sf.jasperreports.extension.registry.factory.jr.statistics=net.sf.jasperreports.extensions.SpringExtensionsRegistryFactory
net.sf.jasperreports.extension.jr.statistics.spring.beans.resource=com/test/beans.xml

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="pdfExportHandlerBundle" 
        class="net.sf.jasperreports.engine.export.DefaultElementHandlerBundle">
    <property name="namespace" value="http://jasperreports.sourceforge.net/jasperreports/customPDFexpoter"/>
    <property name="elementHandlers">
        <map>
            <entry key="print">
                <map>
                    <entry key="net.sf.jasperreports.pdf">
                        <ref bean="basePdfExportHandler"/>
                    </entry>
                </map>
            </entry>
        </map>
    </property>
</bean>
<bean id="basePdfExportHandler" class="com.test.TestPDFHandler"
        abstract="true">
</bean>

Java文件(src / com / test)

package com.test;

import net.sf.jasperreports.engine.JRGenericPrintElement;
import net.sf.jasperreports.engine.JRPropertiesMap;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.export.GenericElementHandler;
import net.sf.jasperreports.engine.export.GenericElementHandlerBundle;
import net.sf.jasperreports.engine.export.GenericElementPdfHandler;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRPdfExporterContext;
import net.sf.jasperreports.extensions.ExtensionsRegistry;
import net.sf.jasperreports.extensions.ExtensionsRegistryFactory;
import net.sf.jasperreports.extensions.SingletonExtensionRegistry;

import com.lowagie.text.Chunk;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfAction;

public class TestPDFHandler implements GenericElementPdfHandler {

@Override
public boolean toExport(JRGenericPrintElement element) {
    return true;
}

@Override
public void exportElement(JRPdfExporterContext exporterContext,JRGenericPrintElement element) {
    Phrase phrase = new Phrase();
    Chunk chunk = new Chunk("print me");
    chunk.setAction(PdfAction.javaScript("this.print(null,this.pageNum,this.pageNum)",exporterContext.getPdfWriter()));
    phrase.add(chunk);

    ColumnText colText = new ColumnText(exporterContext.getPdfWriter().getDirectContent());
    colText.setSimpleColumn(phrase,element.getX(),exporterContext.getExportedReport().getPageHeight() - element.getY(),element.getX() + element.getWidth(),exporterContext.getExportedReport().getPageHeight() - element.getY() - element.getHeight(),Element.ALIGN_LEFT);

    try {
        colText.go();
    } catch (DocumentException e) {
        throw new JRRuntimeException(e);
    }

}
/*
@Override
public String getNamespace() {
    return "helloWorld";
}

@Override
public GenericElementHandler getHandler(String elementName,String exporterKey) {
    if (elementName.equals("print") && exporterKey.equals(JRPdfExporter.PDF_EXPORTER_KEY)) {
        return this;
    }
    
    return null;
}

@Override
public ExtensionsRegistry createRegistry(String registryId,JRPropertiesMap properties) {
    return new SingletonExtensionRegistry<GenericElementHandlerBundle>(GenericElementHandlerBundle.class,this);
}*/
}

解决方法

您需要在jasperreports_extension.properties添加中将其注册为工厂

net.sf.jasperreports.extension.registry.factory.me=com.test.TestPDFHandler

完成此操作后,您需要实现TestPDFHandler中缺少的接口,并且getNamespace()需要与您为genericElementType *提供的名称空间相对应

public class TestPDFHandler implements GenericElementPdfHandler,GenericElementHandlerBundle,ExtensionsRegistryFactory {

    @Override
    public boolean toExport(JRGenericPrintElement element) {
        return true;
    }

    @Override
    public void exportElement(JRPdfExporterContext exporterContext,JRGenericPrintElement element) {
        Phrase phrase = new Phrase();
        Chunk chunk = new Chunk("print me");
        chunk.setAction(PdfAction.javaScript("this.print(null,this.pageNum,this.pageNum)",exporterContext.getPdfWriter()));
        phrase.add(chunk);

        ColumnText colText = new ColumnText(exporterContext.getPdfWriter().getDirectContent());
        colText.setSimpleColumn(phrase,element.getX(),exporterContext.getExportedReport().getPageHeight() - element.getY(),element.getX() + element.getWidth(),exporterContext.getExportedReport().getPageHeight() - element.getY() - element.getHeight(),Element.ALIGN_LEFT);

        try {
            colText.go();
        } catch (DocumentException e) {
            throw new JRRuntimeException(e);
        }

    }

    @Override
    public String getNamespace() {
        return "http://jasperreports.sourceforge.net/jasperreports/customPDFexpoter";
    }

    @Override
    public GenericElementHandler getHandler(String elementName,String exporterKey) {
        if (elementName.equals("print") && exporterKey.equals(JRPdfExporter.PDF_EXPORTER_KEY)) {
            return this;
        }

        return null;
    }

    @Override
    public ExtensionsRegistry createRegistry(String registryId,JRPropertiesMap properties) {
        return new SingletonExtensionRegistry<GenericElementHandlerBundle>(GenericElementHandlerBundle.class,this);
    }
}

*您可以指定任何名称空间,我不会使用http://jasperreports.sourceforge.net/jasperreports/customPDFexpoter,因为它不是我的域,而是为了遵循您的代码,在下面的示例中使用它

,

我是山姆;

  • 下载 .JAR jasperreports-htmlcomponent-5.0.1.jar ,并保存在任何文件夹中。
  • 使用终端 o 控制台输入 cd ANYFOLDER
  • 在终端上执行
mvn install:install-file \
-Dfile=jasperreports-htmlcomponent-5.0.1.jar \
-DgroupId=net.sf.jasperreports \
-DartifactId=jasperreports-htmlcomponent \
-Dversion=5.0.1 \
-Dpackaging=jar  \
-DgeneratePom=true
  • 转到 pom.xml 中的项目
 <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-htmlcomponent</artifactId>
            <version>5.0.1</version>
        </dependency>
  • 编译。
  • 准备好......享受。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。