SVG 到图像使用 SVGSalamander 无法正确渲染 SVG
SVG to Image Using SVGSalamander not rendering SVG correctly
我曾为 iText PDF 文档进行 SVG 图像渲染。
为此,我使用 SVGSalamander 将 SVG 转换为图像格式。
它工作正常,但有一个奇怪的行为,即某些 SVG 图像在某些图像渲染时无法正确渲染。那些错误渲染的 svg 与真实图像不对齐。
我试过了,但我不明白为什么它只发生在某些图像上。
如果有人帮我解决这个问题,我将不胜感激。
Java代码:
private static Image createSVGImage(PdfWriter pdfWriter, String imageEntry) throws BadElementException {
Image image = null;
Graphics2D g2dgraphics =null;
PdfTemplate template = null;
try{
SVGDiagram diagram = SVGCache.getSVGUniverse().getDiagram( new java.io.File( imageEntry ).toURI() );
template = pdfWriter.getDirectContent().createTemplate( diagram.getWidth(), diagram.getHeight());
diagram.setIgnoringClipHeuristic(true);
g2dgraphics= new PdfGraphics2D(template, diagram.getWidth(), diagram.getHeight());
diagram.render(g2dgraphics);
}catch( Exception e ){
e.printStackTrace();
} finally {
if( g2dgraphics != null ){
g2dgraphics.dispose();
image = Image.getInstance(template);
}
g2dgraphics.dispose();
}
return image;
}
SVG xml 未对齐的代码
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<path d="M19,16a46,46 0,1,0 62,0l-8,8a34,34 0,1,1-46,0z" fill="#069"/>
<path d="M46,43v35a28,28 0,0,1-14-49zM54,43v35a28,28 0,0,0 14-49z" fill="#396"/>
<circle r="15" cx="50" cy="18" fill="#900"/>
</svg>
实拍
上面这段代码的输出图像
我真的不知道为什么这个库会发生这种情况,因为没有答案我已经将 SVGSalamendar 更改为 Batik 库,如果有人需要,这是它的工作代码
Maven 依赖关系
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svggen</artifactId>
<version>1.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/batik/batik-transcoder -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/batik/batik-rasterizer -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-rasterizer</artifactId>
<version>1.11</version>
</dependency>
Java 代码以反映与上面相同的结果:
private static Image createSVGImage(PdfWriter pdfWriter, String imageEntry) throws BadElementException, IOException {
Image image = null;
final BufferedImage[] imagePointer = new BufferedImage[1];
PdfContentByte pdfCB = new PdfContentByte(pdfWriter);
try {
TranscoderInput input = new TranscoderInput(new FileInputStream(imageEntry));
ImageTranscoder t = new ImageTranscoder() {
@Override
public BufferedImage createImage(int w, int h) {
return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
}
@Override
public void writeImage(BufferedImage img, TranscoderOutput output) throws TranscoderException {
// TODO Auto-generated method stub
imagePointer[0] = img;
}
};
t.addTranscodingHint(ImageTranscoder.KEY_FORCE_TRANSPARENT_WHITE,
Boolean.FALSE);
t.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, Color.white);
t.transcode(input, null);
}
catch (TranscoderException ex) {
// Requires Java 6
ex.printStackTrace();
throw new IOException("Couldn't convert ");
}
image = Image.getInstance(pdfCB, imagePointer[0], 1);
return image;
}
我曾为 iText PDF 文档进行 SVG 图像渲染。 为此,我使用 SVGSalamander 将 SVG 转换为图像格式。 它工作正常,但有一个奇怪的行为,即某些 SVG 图像在某些图像渲染时无法正确渲染。那些错误渲染的 svg 与真实图像不对齐。 我试过了,但我不明白为什么它只发生在某些图像上。
如果有人帮我解决这个问题,我将不胜感激。
Java代码:
private static Image createSVGImage(PdfWriter pdfWriter, String imageEntry) throws BadElementException {
Image image = null;
Graphics2D g2dgraphics =null;
PdfTemplate template = null;
try{
SVGDiagram diagram = SVGCache.getSVGUniverse().getDiagram( new java.io.File( imageEntry ).toURI() );
template = pdfWriter.getDirectContent().createTemplate( diagram.getWidth(), diagram.getHeight());
diagram.setIgnoringClipHeuristic(true);
g2dgraphics= new PdfGraphics2D(template, diagram.getWidth(), diagram.getHeight());
diagram.render(g2dgraphics);
}catch( Exception e ){
e.printStackTrace();
} finally {
if( g2dgraphics != null ){
g2dgraphics.dispose();
image = Image.getInstance(template);
}
g2dgraphics.dispose();
}
return image;
}
SVG xml 未对齐的代码
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<path d="M19,16a46,46 0,1,0 62,0l-8,8a34,34 0,1,1-46,0z" fill="#069"/>
<path d="M46,43v35a28,28 0,0,1-14-49zM54,43v35a28,28 0,0,0 14-49z" fill="#396"/>
<circle r="15" cx="50" cy="18" fill="#900"/>
</svg>
实拍
上面这段代码的输出图像
我真的不知道为什么这个库会发生这种情况,因为没有答案我已经将 SVGSalamendar 更改为 Batik 库,如果有人需要,这是它的工作代码
Maven 依赖关系
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svggen</artifactId>
<version>1.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/batik/batik-transcoder -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/batik/batik-rasterizer -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-rasterizer</artifactId>
<version>1.11</version>
</dependency>
Java 代码以反映与上面相同的结果:
private static Image createSVGImage(PdfWriter pdfWriter, String imageEntry) throws BadElementException, IOException {
Image image = null;
final BufferedImage[] imagePointer = new BufferedImage[1];
PdfContentByte pdfCB = new PdfContentByte(pdfWriter);
try {
TranscoderInput input = new TranscoderInput(new FileInputStream(imageEntry));
ImageTranscoder t = new ImageTranscoder() {
@Override
public BufferedImage createImage(int w, int h) {
return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
}
@Override
public void writeImage(BufferedImage img, TranscoderOutput output) throws TranscoderException {
// TODO Auto-generated method stub
imagePointer[0] = img;
}
};
t.addTranscodingHint(ImageTranscoder.KEY_FORCE_TRANSPARENT_WHITE,
Boolean.FALSE);
t.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, Color.white);
t.transcode(input, null);
}
catch (TranscoderException ex) {
// Requires Java 6
ex.printStackTrace();
throw new IOException("Couldn't convert ");
}
image = Image.getInstance(pdfCB, imagePointer[0], 1);
return image;
}