【问题标题】:SVG to Image Using SVGSalamander not rendering SVG correctlySVG to Image 使用 SVGSalamander 不能正确渲染 SVG
【发布时间】:2020-02-10 21:43:12
【问题描述】:

我曾为 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>

真实图像

以上代码输出图片

【问题讨论】:

    标签: java image svg converters svg-salamander


    【解决方案1】:

    我真的不知道为什么这个库会发生这种情况,因为没有答案我已将 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 2021-06-04
      • 2014-12-24
      • 2012-06-16
      • 2022-11-15
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多