2017-05-27 44 views
0

我正在使用iText7來生成PDF文件。我需要幫助將svg文件添加到PDF文檔。需要使用URL從遠程位置獲取svg文件。使用IText7將SVG圖像添加到PDF

+0

使用Apache蠟染到您的SVG文件轉換成位圖圖像,然後添加到您的PDF文檔。 –

+0

是否有一些可共享的代碼示例?這將有很大的幫助。 –

+0

編寫實際代碼作爲練習留給讀者。 –

回答

1

我能夠使用apache batik庫得到這個工作。這是我如何做到的。

Maven的依賴

<dependency> 
    <groupId>org.apache.xmlgraphics</groupId> 
    <artifactId>batik-transcoder</artifactId> 
    <version>1.9</version> 
</dependency> 

定製ITagWorker爲SVGImage的

import com.itextpdf.html2pdf.attach.ITagWorker; 
import com.itextpdf.html2pdf.attach.ProcessorContext; 
import com.itextpdf.html2pdf.html.node.IElementNode; 
import com.itextpdf.io.image.ImageDataFactory; 
import com.itextpdf.layout.IPropertyContainer; 
import com.itextpdf.layout.element.Image; 
import org.apache.batik.transcoder.TranscoderInput; 
import org.apache.batik.transcoder.TranscoderOutput; 
import org.apache.batik.transcoder.image.JPEGTranscoder; 

import java.io.ByteArrayOutputStream; 

public class SvgImageWorker implements ITagWorker { 

    private Image img; 

    @Override 
    public void processEnd(IElementNode iElementNode, ProcessorContext processorContext) { 
     String url = iElementNode.getAttribute("src"); 

     JPEGTranscoder jpegTranscoder = new JPEGTranscoder(); 

     // Set the transcoding hints. 
     jpegTranscoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); 

     // Create the transcoder input. 
     try { 
      TranscoderInput input = new TranscoderInput(url); 
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(10000); 
      TranscoderOutput output = new TranscoderOutput(byteArrayOutputStream); 

      // Save the image. 
      jpegTranscoder.transcode(input, output); 

      img = new Image(ImageDataFactory.create(byteArrayOutputStream.toByteArray())); 
      byteArrayOutputStream.flush(); 
      byteArrayOutputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public boolean processContent(String s, ProcessorContext processorContext) { 
     return false; 
    } 

    @Override 
    public boolean processTagChild(ITagWorker iTagWorker, ProcessorContext processorContext) { 
     return false; 
    } 

    @Override 
    public IPropertyContainer getElementResult() { 
     return img; 
    } 

}