Arjun B
Arjun B

Reputation: 41

Adding an SVG image to PDF using IText7

I am using iText7 to generate PDF files. I need help in adding an svg file to the PDF document. The svg file needs to be fetched from a remote location using an URL.

Upvotes: 1

Views: 1375

Answers (1)

Arjun B
Arjun B

Reputation: 41

I was able to get this working using apache batik library. Here is the how I did it.

Maven dependency

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

Custom ITagWorker for 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;
    }

}

Upvotes: 2

Related Questions