cbe*_*der 6 java arrays svg jasper-reports
我将图像保存为a byte[],我想将其显示为JasperReport中的图像.我试过从Java方法获取数据:
public InputStream getImage(){
return new ByteArrayInputStream(getImageByteArray());
}
Run Code Online (Sandbox Code Playgroud)
和
public Image getImage() throws IOException{
return ImageIO.read(new ByteArrayInputStream(getImageByteArray()));
}
Run Code Online (Sandbox Code Playgroud)
和
public String getImage(){
return new String((new org.apache.commons.codec.binary.Base64()).encode(getImageByteArray()));
}
Run Code Online (Sandbox Code Playgroud)
但他们似乎都没有工作.
jrxml看起来像这样:
<image hAlign="Center" vAlign="Middle" isUsingCache="true" isLazy="true">
<reportElement positionType="Float" x="0" y="0" width="164" height="32" isRemoveLineWhenBlank="true" isPrintWhenDetailOverflows="true" uuid="c63c84a8-41c7-4ca3-8451-751d43fa8a9e"/>
<imageExpression><![CDATA[$P{paramObject}.getImage()]]></imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)
我尝试的一些东西得到了异常,有些打印了JasperReport但是图像应该是空白的区域.我知道图像数据存在,因为我可以在JSF页面中显示它.图像数据是SVG数据.
编写一个自定义图像转码器,可以读取SVG文件并将该资源转换为PNG或SVG文件.导出为PDF时,可以直接使用SVG文件.考虑:
import java.awt.Color;
import java.io.*;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.util.JRLoader;
import org.apache.batik.transcoder.*;
import static org.apache.batik.transcoder.image.ImageTranscoder.*;
import org.apache.batik.transcoder.image.PNGTranscoder;
public class ImageTranscoder {
public static InputStream asSVG(final String file) throws JRException {
return new ByteArrayInputStream(load(file));
}
public static InputStream asPNG(final String file)
throws TranscoderException, JRException {
return asPNG(load(file));
}
public static InputStream asPNG(final byte[] svg)
throws TranscoderException {
final ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
final ByteArrayInputStream inBytes = new ByteArrayInputStream(svg);
final TranscoderInput input = new TranscoderInput(inBytes);
final TranscoderOutput output = new TranscoderOutput(outBytes);
final PNGTranscoder transcoder = new PNGTranscoder();
transcoder.addTranscodingHint(KEY_BACKGROUND_COLOR, Color.white);
transcoder.addTranscodingHint(KEY_FORCE_TRANSPARENT_WHITE, true);
transcoder.transcode(input, output);
final byte[] bytes = outBytes.toByteArray();
return new ByteArrayInputStream(bytes);
}
private static byte[] load(final String file) throws JRException {
return JRLoader.loadBytesFromResource(file);
}
}
Run Code Online (Sandbox Code Playgroud)
在JRXML文件中,导入完全限定的类:
<import value="com.company.jasper.ImageTranscoder"/>
Run Code Online (Sandbox Code Playgroud)
按照惯例,将图像从调色板拖放到报表上.将其表达式设置为:
ImageTranscoder.asSVG($P{IMAGES_PATH} + $P{IMAGE_FILENAME} + ".svg")
Run Code Online (Sandbox Code Playgroud)
如果您绝对需要PNG版本,请立即对其进行转码:
ImageTranscoder.asPNG($P{IMAGES_PATH} + $P{IMAGE_FILENAME} + ".svg")
Run Code Online (Sandbox Code Playgroud)
使用HTML,通常首选PNG图像.您可以采用多种方法来区分HTML(PNG)和PDF(SVG).一种简单的方法是将两个不同的键值分配给两个不同的Image元素.例如:
<image scaleImage="RetainShape" onErrorType="Blank">
<reportElement key="IMAGE_PNG"/>
<imageExpression><![CDATA[ImageTranscoder.asPNG(...)]]></imageExpression>
</image>
<image scaleImage="RetainShape" onErrorType="Blank">
<reportElement key="IMAGE_SVG"/>
<imageExpression><![CDATA[ImageTranscoder.asSVG(...)]]></imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据导出类型排除其中一个:
<property name="net.sf.jasperreports.export.html.exclude.key.IMAGE_SVG"/>
<property name="net.sf.jasperreports.export.pdf.exclude.key.IMAGE_PNG"/>
Run Code Online (Sandbox Code Playgroud)
虽然包含PNG图像更简单,但从SVG转换PNG图像是可以避免的额外步骤.由于JasperReports Library使用Batik引擎渲染图像,因此在生成报告时利用它将SVG文件转换为PNG.
这样,无论报告中是否使用了PNG或SVG文件,SVG都可以作为所有格式的单一来源.
务必根据需要设置IMAGES_PATH和IMAGE_FILENAME参数.
使用以下方法强制嵌入图像:
<property name="net.sf.jasperreports.export.html.embed.image" value="true"/>
Run Code Online (Sandbox Code Playgroud)
PNG图像成为Base64编码的字符串:
<img src="data:image/png;base64,..."/>
Run Code Online (Sandbox Code Playgroud)
这将使报告加载更快(没有对图像的额外HTTP请求)并简化体系结构,因为它消除了外部依赖性.也就是说,不再需要Web服务器来提供图像,因为它是完全嵌入的.
假设您有 base64 编码的图像字节,您可以使用以下
<image>
<reportElement/>
<imageExpression>
<![CDATA[javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(new sun.misc.BASE64Decoder().decodeBuffer("/9j/4AAQ .... "))) ]]>
</imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)
你可以试试这个:
将图像参数(此处为img)设置为InputStream
<parameter name="img" class="java.io.InputStream">
<parameterDescription><![CDATA[]]></parameterDescription>
</parameter>
Run Code Online (Sandbox Code Playgroud)
然后将onErrorType="Blank"设置为您的图像元素(实际上不知道这样做的原因:))
<image onErrorType="Blank">
<reportElement x="2" y="4" width="119" height="62" uuid="66857471-6aa2-4ff0-be59-e2e1b0214bfc"/>
<imageExpression><![CDATA[$P{img}]]></imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14251 次 |
| 最近记录: |