使用PdfiumRenderer渲染.ai

时间:2017-05-23 20:41:22

标签: asp.net-mvc adobe-illustrator imageresizer

我尝试使用ImageResizer生成.ai文件(Adobe Illustrator)的缩略图。由于官方Adobe Acrobat Reader实际上可以打开这些文件,我认为PdfiumRenderer也可以这样做。

事实上,我已经通过将.ai文件重命名为.pdf进行了测试,缩略图看起来很好。显然,没有重命名它不起作用,因为没有为该文件扩展名注册插件。以这种方式重命名客户提供的文件似乎也不是一个好的解决方案。

我尝试编写一个继承自PdfiumRenderer的最小自定义插件,但将.ai文件扩展名添加到支持的文件类型列表中。然后,ImageResizer将捕获.ai请求,但显示错误。



const char ca[] = {'h','e','l','l','o', '\0'};




如果对自定义插件有更多经验的人或者Imazen的某些人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

好吧,我终于开始工作了,我的项目现在支持PDF和AI缩略图,包括支持空白修剪,天蓝色存储,磁盘缓存等等。

Nathanael没有直接提供解决方案,但指出了正确的方向(谢谢!)。 DecodeStream方法提供了一个可选的路径字符串,显然,如果该路径没有以.pdf结尾,那么PdfiumRenderer就会吓坏。这里的技巧是隐藏此路径并传递null。

我确实需要编写比以前更多的代码,因为在继承PdfiumRendererPlugin时无法覆盖DecodeStream方法。这是完整的代码:

public class IllustratorPlugin : BuilderExtension, IPlugin, IFileExtensionPlugin, IIssueProvider, IQuerystringPlugin {

    private readonly PdfiumRendererPlugin BasePlugin;

    public IllustratorPlugin() : base() {

        BasePlugin = new PdfiumRendererPlugin();

    }

    public IEnumerable<IIssue> GetIssues()
        => BasePlugin.GetIssues();

    public IEnumerable<string> GetSupportedFileExtensions()
        => new string[] { ".ai" };

    public IEnumerable<string> GetSupportedQuerystringKeys()
        => BasePlugin.GetSupportedQuerystringKeys();

    public IPlugin Install(ImageResizer.Configuration.Config c) {

        BasePlugin.Install(c);
        c.Plugins.add_plugin(this);

        return this;

    }

    public bool Uninstall(ImageResizer.Configuration.Config c) {

        c.Plugins.remove_plugin(this);
        return BasePlugin.Uninstall(c);

    }

    public int MaxHeight {
        get => BasePlugin.MaxHeight;
        set => BasePlugin.MaxHeight = value;
    }

    public int MaxWidth {
        get => BasePlugin.MaxWidth;
        set => BasePlugin.MaxWidth = value;
    }

    public int DefaultHeight {
        get => BasePlugin.DefaultHeight;
        set => BasePlugin.DefaultHeight = value;
    }

    public int DefaultWidth {
        get => BasePlugin.DefaultWidth;
        set => BasePlugin.DefaultWidth = value;
    }

    public override Bitmap DecodeStream(Stream s, ResizeSettings settings, string optionalPath)
        => BasePlugin.DecodeStream(s, settings, null);

}

在global.asax中,我刚添加了这一行:

new IllustratorPlugin().Install(ImageResizer.Configuration.Config.Current);

然后可以从web.config中删除PdfiumRenderer插件。