对“位图”类型的引用声称它在“System.Drawing”中定义,但找不到

Posted

技术标签:

【中文标题】对“位图”类型的引用声称它在“System.Drawing”中定义,但找不到【英文标题】:Reference to type 'Bitmap' claims it is defined in 'System.Drawing', but it could not be found 【发布时间】:2019-08-07 09:46:59 【问题描述】:

我正在尝试使用 .Net Core 项目中的 Open XML 电动工具将 DOCX 文件转换为 html。一切都很顺利,直到我在文档文件中遇到图像。 我尝试使用以下代码使用开放 XML 电动工具导出图像

using (WordprocessingDocument wDoc = 
   WordprocessingDocument.Open(memoryStream, true))


WmlToHtmlConverterSettings settings = new WmlToHtmlConverterSettings()


    ImageHandler = imageInfo =>
    

        imageInfo.Bitmap.Save([...]);

        ImageFormat format = imageInfo.Bitmap.RawFormat;

    


XElement htmlElement = WmlToHtmlConverter.ConvertToHtml(wDoc, settings);


当我在 ImageHandler 中使用 imageInfo.Bitmap.Save(ms, imageFormat);' 时。我确实尝试从 nuget 添加 System.Drawing.Common 包,但这并没有解决错误。

【问题讨论】:

【参考方案1】:

您的精简样本应该可以工作。您可能会看到解决 system.drawing.common 的问题。检查你的构建输出,我的显示

warning NU1701: Package 'OpenXmlPowerTools 4.5.3.2' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' instead of the project target framework '.NETCoreApp,Version=v3.1'. This package may not be fully compatible with your project.

此代码适用于 Windows 上的 .net core 3.1,其行为会因您使用的目标/操作系统而异:

      private static void Main(string[] args)
        
            byte[] byteArray = File.ReadAllBytes(args[0]);
            using MemoryStream memoryStream = new MemoryStream();
            memoryStream.Write(byteArray, 0, byteArray.Length);
            using WordprocessingDocument wDoc = WordprocessingDocument.Open(memoryStream, true);
            HtmlConverterSettings htmlConverterSettings = new HtmlConverterSettings
            
                ImageHandler = ImageHandler
            ;

            WmlToHtmlConverterSettings settings = new WmlToHtmlConverterSettings(htmlConverterSettings);
            XElement htmlElement = WmlToHtmlConverter.ConvertToHtml(wDoc, settings);
            XDocument html = new XDocument(new XDocumentType("html", null, null, null), htmlElement);
            string htmlString = html.ToString(SaveOptions.DisableFormatting);
            File.WriteAllText(args[1], htmlString, Encoding.UTF8);
        

        private static XElement ImageHandler(ImageInfo imageInfo)
        
            using MemoryStream memoryStream = new MemoryStream();
            imageInfo.Bitmap.Save(memoryStream, imageInfo.Bitmap.RawFormat);
            string base64 = Convert.ToBase64String(memoryStream.ToArray());

            ImageFormat format = imageInfo.Bitmap.RawFormat;
            ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().First(imageCodecInfo => imageCodecInfo.FormatID == format.Guid);
            string mimeType = codec.MimeType;

            string imageSource = $"data:mimeType;base64,base64";

            return new XElement(Xhtml.img, new XAttribute(NoNamespace.src, imageSource), imageInfo.ImgStyleAttribute, imageInfo.AltText != null ? new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
        

考虑切换到支持 .net > 4.x 和 Windows 以外的操作系统的 OpenXmlPowerTools 的一些分支。

【讨论】:

以上是关于对“位图”类型的引用声称它在“System.Drawing”中定义,但找不到的主要内容,如果未能解决你的问题,请参考以下文章

对类型“Assembly”的引用声称它在“System.Runtime”中定义,但在 Xamarin UWP 中找不到

CS1684 对 System.Windows.Input.ICommand 类型的引用声称它在“xxx”中定义但找不到

对“MarshalByRefObject”类型的引用声称它是在“System.Runtime”中定义的,但找不到

如何修复“对类型 'IAsyncEnumerable<>' 的引用声称它是在 'System.Interactive.Async' 中定义的,但找不到它”?

Swift 声称我引用的类中没有方法

请使用CGBitmapContext和16位图像帮助