2016-08-09 71 views
2

Bei dem Versuch, PDF zu erzeugen, die zu PDF entspricht/A-Standard Jasper Reports verwenden, habe ichWie lade ich ein ICC-Profil vom Klassenpfad?

net.sf.jasperreports.engine.util.JRPdfaIccProfileNotFoundException. 

Dies ist leicht fixiert

<property name="net.sf.jasperreports.export.pdfa.icc.profile.path" value="/stuff/myicc.icc"/> 

Konfiguration, aber ich brauche das ICC-Profil mit dem Rest zu bündeln der WAR wie die Schriften, die der Bericht einbettet. Wie kann das gemacht werden? Ich suche so etwas wie

<property name="net.sf.jasperreports.export.pdfa.icc.profile.path" value="classpath:/jasper/someicc.icc"/> 

Aber das hat nicht funktioniert, noch ICC-Profil relativ zum Bericht selbst. Kann ich den InputStream als Parameter an den PDFGenerator übergeben?

Antwort

0

Am Ende haben wir unsere eigene Erweiterung zu schaffen Classpath Laden zu behandeln, um es stärker zentralisiert zu werden.

Der Code Classpath Erweiterung zu implementieren ist hier:

package com.somepackage; 

import java.io.InputStream; 
import java.util.Collections; 
import java.util.List; 

import net.sf.jasperreports.engine.JRPropertiesMap; 
import net.sf.jasperreports.extensions.ExtensionsRegistry; 
import net.sf.jasperreports.extensions.ExtensionsRegistryFactory; 
import net.sf.jasperreports.repo.InputStreamResource; 
import net.sf.jasperreports.repo.RepositoryService; 
import net.sf.jasperreports.repo.Resource; 

/** 
* JasperReports extension factory that enables to read from classpath. Only tries to resolve URLs that start with "classpath:". 
*/ 
public class ClasspathExtensionsRegistryFactory implements ExtensionsRegistryFactory { 

    @Override 
    public ExtensionsRegistry createRegistry(String registryId, JRPropertiesMap properties) { 
     return extFactory; 
    } 

    private static final ClasspathRepositoryService service = new ClasspathRepositoryService(); 
    private static final List<ClasspathRepositoryService> services = Collections.singletonList(service); 
    private static final ExtensionsRegistry extFactory = new ExtensionsRegistry() { 
     @SuppressWarnings("unchecked") 
     @Override 
     public <T> List<T> getExtensions(Class<T> extensionType) { 
         if (RepositoryService.class.equals(extensionType)) { 
          return (List<T>) services; 
         } 
         return null; 
       } 
    }; 

    /** 
    * RepositoryService that reads resources from classpath. 
    */ 
    public static class ClasspathRepositoryService implements RepositoryService { 

     private static final String CLASSPATH_PREFIX = "classpath:"; 
     private static final int CLASSPATH_PREFIX_LENGTH = CLASSPATH_PREFIX.length(); 

     @Override 
     public Resource getResource(String uri) { 
      return getResource(uri, InputStreamResource.class); 
     } 

     @Override 
     public void saveResource(String uri, Resource resource) { 
      //No-op 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     public <K extends Resource> K getResource(String uri, Class<K> resourceType) { 
      if (resourceType != null && InputStreamResource.class.equals(resourceType) && uri != null && uri.trim().startsWith(CLASSPATH_PREFIX)) { 
       InputStream is = this.getClass().getResourceAsStream(uri.trim().substring(CLASSPATH_PREFIX_LENGTH)); 
       if (is != null) { 
        InputStreamResource isr = new InputStreamResource(); 
        isr.setInputStream(is); 
        isr.setName(uri); 
        return (K)isr; 
       } 
      } 
      return null; 
     } 

    } 

} 

Danach das einzige, was noch zu tun jasperreports_extension.properties Datei hinzufügen, die net.sf.jasperreports.extension.registry.factory enthält. classpathresourcereader = com.somepackage.ClasspathExtensionsRegistryFactory

Dies ermöglicht es, die Exporteur wie diese cONF:

SimplePdfExporterConfiguration pec = new SimplePdfExporterConfiguration(); 
. 
. 
. 
pec.setIccProfilePath("classpath:/somefolder/iccprofile.icc"); 
1

Wenn Sie von Java-Code exportieren, können Sie die verwenden, um den absoluten Pfad zur Datei zu erhalten.

Beispiel mit JRPdfExporter

JRPdfExporter exporter = new JRPdfExporter(); 
//... your input and output 
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration(); 
URL path = this.getClass().getClassLoader().getResource("jasper/someicc.icc"); 
configuration.setIccProfilePath(path.getFile()); 
//other settings 
exporter.setConfiguration(configuration); 
exporter.exportReport();