We'll use the support of .ico files — Windows native icons — as an example of extending the graphic capabilities of XMLmind XSL-FO Converter.
Implementing a IGraphicFactory is straightforward. You just need to implement 4 methods: GetInputFormats, GetOutputFormats, CreateGraphic and ConvertGraphic.
Excerpts of samples/dotnet/IcoGraphicFactory.cs:
... using XmlMind.FoConverter; public class IcoGraphicFactory : IGraphicFactory { private static readonly string[] inputFormats = { "image/vnd.microsoft.icon" }; private static readonly string[] outputFormats = { "image/png" }; public string[] GetInputFormats(){ return inputFormats; } public string[] GetOutputFormats()
{ return outputFormats; } ...
| GetInputFormats returns the list of the media types (AKA MIME types) that the  | |
| GetOutputFormats returns the list of the media types that the  | 
    ...
    public IGraphic CreateGraphic(string location, string format, 
                                  object clientData, IGraphicEnv env) {
        Image image = LoadImage(location);
        double xRes = 0;
        double yRes = 0;
        if ((image.Flags & ((int) ImageFlags.HasRealDpi)) != 0) {
            xRes = image.HorizontalResolution;
            yRes = image.VerticalResolution;
        }
        return new Graphic(location, format, image.Width, image.Height, 
                           xRes, yRes, GraphicType.Raster, clientData);
    {
        Image image = LoadImage(location);
        double xRes = 0;
        double yRes = 0;
        if ((image.Flags & ((int) ImageFlags.HasRealDpi)) != 0) {
            xRes = image.HorizontalResolution;
            yRes = image.VerticalResolution;
        }
        return new Graphic(location, format, image.Width, image.Height, 
                           xRes, yRes, GraphicType.Raster, clientData); }
    private static Image LoadImage(String location) {
        Image image = null;
        Stream stream = GraphicUtil.OpenStream(location);
    }
    private static Image LoadImage(String location) {
        Image image = null;
        Stream stream = GraphicUtil.OpenStream(location); try {
            image = Image.FromStream(stream);
        } finally {
            stream.Close();
        }
        return image;
    }
    ...
        try {
            image = Image.FromStream(stream);
        } finally {
            stream.Close();
        }
        return image;
    }
    ...| Method CreateGraphic basically needs to parse the image file found at absolute URI  Note that argument  | |
| Class Graphic is a simple implementation of interface  | |
| In order to obtain the dimension of the image ( | 
    ...
    public IGraphic ConvertGraphic(IGraphic graphic, string format,
                                   double xScale, double yScale,
                                   object clientData, IGraphicEnv env) {
        int width = graphic.GetWidth();
        int height = graphic.GetHeight();
        double xRes = graphic.GetXResolution();
        double yRes = graphic.GetYResolution();
        Image image = LoadImage(graphic.GetLocation());
        if (xScale != 1) {
            width = (int) Math.Round(width * xScale);
        }
        if (yScale != 1) {
            height = (int) Math.Round(height * yScale);
        }
        Bitmap bitmap = new Bitmap(image, width, height);
        if (xRes > 0 && yRes > 0) {
            bitmap.SetResolution((float) xRes, (float) yRes);
        }
        string outPath = env.CreateTempFile(".png");
    {
        int width = graphic.GetWidth();
        int height = graphic.GetHeight();
        double xRes = graphic.GetXResolution();
        double yRes = graphic.GetYResolution();
        Image image = LoadImage(graphic.GetLocation());
        if (xScale != 1) {
            width = (int) Math.Round(width * xScale);
        }
        if (yScale != 1) {
            height = (int) Math.Round(height * yScale);
        }
        Bitmap bitmap = new Bitmap(image, width, height);
        if (xRes > 0 && yRes > 0) {
            bitmap.SetResolution((float) xRes, (float) yRes);
        }
        string outPath = env.CreateTempFile(".png"); bitmap.Save(outPath, ImageFormat.Png);
        return new Graphic(GraphicUtil.FilenameToLocation(outPath), format,
        bitmap.Save(outPath, ImageFormat.Png);
        return new Graphic(GraphicUtil.FilenameToLocation(outPath), format, width, height, xRes, yRes, 
                           GraphicType.Raster, clientData);
    }
    ...
 
                           width, height, xRes, yRes, 
                           GraphicType.Raster, clientData);
    }
    ...| Method ConvertGraphic is invoked to convert its  Note that argument  | |
| The converted image file must be stored in a temporary file created using method IGraphicEnv.CreateTempFile. Such temporary files are automatically deleted when no longer needed. | |
| Class GraphicUtil contains several useful helper functions, among them  | 
public static int Main(string[] args) { ... GraphicFactories.Register(new IcoGraphicFactory());... converter.SetInput(inUri); converter.SetOutput(outPath); converter.Convert(); ...
| For an implementation of  |