为了账号安全,请及时绑定邮箱和手机立即绑定

使用 SVGSalamander 将 SVG 转为图像无法正确渲染 SVG

使用 SVGSalamander 将 SVG 转为图像无法正确渲染 SVG

神不在的星期二 2023-10-19 21:02:04
我曾为 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>真实图像上面这段代码的输出图像
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

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

    }


查看完整回答
反对 回复 2023-10-19
  • 1 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信