## IResourceSavingCallback interface

Implement this interface if you want to control how Aspose.Words saves external resources (images, fonts and css) when saving a document to fixed page HTML or SVG.

```csharp
public interface IResourceSavingCallback
```

## Methods

| Name | Description |
| --- | --- |
| [ResourceSaving](../../aspose.words.saving/iresourcesavingcallback/resourcesaving/)(*[ResourceSavingArgs](../resourcesavingargs/)*) | Called when Aspose.Words saves an external resource to fixed page HTML or SVG formats. |

## Examples

Shows how to use a callback to track external resources created while converting a document to HTML.

```csharp
Document doc = new Document(MyDir + "Bullet points with alternative font.docx");

FontSavingCallback callback = new FontSavingCallback();

HtmlFixedSaveOptions saveOptions = new HtmlFixedSaveOptions
{
    ResourceSavingCallback = callback
};

doc.Save(ArtifactsDir + "HtmlFixedSaveOptions.UsingMachineFonts.html", saveOptions);

Console.WriteLine(callback.GetText());
```

Shows how to use a callback to track external resources created while converting a document to HTML (FontSavingCallback).

```csharp
private class FontSavingCallback : IResourceSavingCallback
{
    /// <summary>
    /// Called when Aspose.Words saves an external resource to fixed page HTML or SVG.
    /// </summary>
    public void ResourceSaving(ResourceSavingArgs args)
    {
        mText.AppendLine($"Original document URI:\t{args.Document.OriginalFileName}");
        mText.AppendLine($"Resource being saved:\t{args.ResourceFileName}");
        mText.AppendLine($"Full uri after saving:\t{args.ResourceFileUri}\n");
    }

    public string GetText()
    {
        return mText.ToString();
    }

    private readonly StringBuilder mText = new StringBuilder();
}
```

Shows how to use a callback to print the URIs of external resources created while converting a document to HTML.

```csharp
Document doc = new Document(MyDir + "Rendering.docx");

ResourceUriPrinter callback = new ResourceUriPrinter();

HtmlFixedSaveOptions options = new HtmlFixedSaveOptions
{
    SaveFormat = SaveFormat.HtmlFixed,
    ExportEmbeddedImages = false,
    ResourcesFolder = ArtifactsDir + "HtmlFixedResourceFolder",
    ResourcesFolderAlias = ArtifactsDir + "HtmlFixedResourceFolderAlias",
    ShowPageBorder = false,
    ResourceSavingCallback = callback
};

// A folder specified by ResourcesFolderAlias will contain the resources instead of ResourcesFolder.
// We must ensure the folder exists before the streams can put their resources into it.
Directory.CreateDirectory(options.ResourcesFolderAlias);

doc.Save(ArtifactsDir + "HtmlFixedSaveOptions.HtmlFixedResourceFolder.html", options);

Console.WriteLine(callback.GetText());

string[] resourceFiles = Directory.GetFiles(ArtifactsDir + "HtmlFixedResourceFolderAlias");

Assert.That(Directory.Exists(ArtifactsDir + "HtmlFixedResourceFolder"), Is.False);
Assert.That(resourceFiles.Count(f => f.EndsWith(".jpeg") || f.EndsWith(".png") || f.EndsWith(".css")), Is.EqualTo(6));
```

Shows how to use a callback to print the URIs of external resources created while converting a document to HTML (ResourceUriPrinter).

```csharp
/// <summary>
/// Counts and prints URIs of resources contained by as they are converted to fixed HTML.
/// </summary>
private class ResourceUriPrinter : IResourceSavingCallback
{
    void IResourceSavingCallback.ResourceSaving(ResourceSavingArgs args)
    {
        // If we set a folder alias in the SaveOptions object, we will be able to print it from here.
        mText.AppendLine($"Resource #{++mSavedResourceCount} \"{args.ResourceFileName}\"");

        string extension = Path.GetExtension(args.ResourceFileName);
        switch (extension)
        {
            case ".ttf":
            case ".woff":
            {
                // By default, 'ResourceFileUri' uses system folder for fonts.
                // To avoid problems in other platforms you must explicitly specify the path for the fonts.
                args.ResourceFileUri = ArtifactsDir + Path.DirectorySeparatorChar + args.ResourceFileName;
                break;
            }
        }

        mText.AppendLine("\t" + args.ResourceFileUri);

        // If we have specified a folder in the "ResourcesFolderAlias" property,
        // we will also need to redirect each stream to put its resource in that folder.
        args.ResourceStream = new FileStream(args.ResourceFileUri, FileMode.Create);
        args.KeepResourceStreamOpen = false;
    }

    public string GetText()
    {
        return mText.ToString();
    }

    private int mSavedResourceCount;
    private readonly StringBuilder mText = new StringBuilder();
}
```

Shows how to use a callback to change the resource URI.

```csharp
public void ResourceSavingCallback()
{
    string outputPath = ArtifactsDir + "MarkdownSaveOptions.ResourceSavingCallback.md";

    Document doc = new Document(MyDir + "Rendering.docx");

    MarkdownSaveOptions saveOptions = new MarkdownSaveOptions();
    saveOptions.ResourceSavingCallback = new ChangeUriPath();

    doc.Save(outputPath, saveOptions);

    DocumentHelper.FindTextInFile(outputPath, "/uri/for/");
}

/// <summary>
/// Class implementing <see cref="IResourceSavingCallback"/>.
/// </summary>
private class ChangeUriPath : IResourceSavingCallback
{
    public void ResourceSaving(ResourceSavingArgs args)
    {
        args.ResourceFileUri = string.Format("/uri/for/{0}", args.ResourceFileName);
    }
}
```

### See Also

* namespace [Aspose.Words.Saving](../../aspose.words.saving/)
* assembly [Aspose.Words](../../)
