Azure 上的 Syncfusion PdfViewerControl

Posted

技术标签:

【中文标题】Azure 上的 Syncfusion PdfViewerControl【英文标题】:Syncfusion PdfViewerControl on Azure 【发布时间】:2019-01-27 23:16:00 【问题描述】:

我正在利用 Syncfusion 的 PdfViewerControl 和 PdfLoadedDocument 类来生成 PDF 的缩略图。但是,一旦我将项目移动到 Azure 应用服务,PdfViewerControl 在初始化时就会引发异常。我很好奇它是否正在尝试使用系统内存并且 Azure 阻止了这一点。下面是我创建的方法 GenerateThumbnails,在创建新的 PdfViewerControl 时抛出异常。如果有人解决此问题或在迁移到 Azure 时遇到过类似情况,我们将不胜感激。

除此之外,如果有人知道另一种以这种方式从 PDF 创建缩略图的工具,那也会非常有帮助。谢谢!

例外: System.AccessViolationException: '试图读取或写入受保护的内存。这通常表明其他内存已损坏。'

方法:

public static List<Byte[]> GenerateThumbnails(Byte[] file)

    Int32 resizedHeight;
    Int32 resizedWidth;
    List<Byte[]> thumbnails = new List<Byte[]>();

    using (PdfViewerControl pdfViewerControl = new PdfViewerControl())
    using (PdfLoadedDocument pdfLoadedDocument = new PdfLoadedDocument(file, true))
    
        // The PDF Viewer Control must load the PDF from a PdfLoadedDocument, rather than directly from the filename because
        // when loaded from the filename, it is not disposed correctly and causes a file lock.
        pdfViewerControl.Load(pdfLoadedDocument);

        for (Int32 i = 0; i < pdfViewerControl.PageCount; ++i)
        
            using (Bitmap originalBitmap = pdfViewerControl.ExportAsImage(i))
            
                if (pdfViewerControl.LoadedDocument.Pages[i].Size.Width > pdfViewerControl.LoadedDocument.Pages[i].Size.Height)
                
                    resizedHeight = (PdfUtility.TARGET_THUMBNAIL_WIDTH_LANDSCAPE * originalBitmap.Height) / originalBitmap.Width;
                    resizedWidth = PdfUtility.TARGET_THUMBNAIL_WIDTH_LANDSCAPE;
                
                else
                
                    resizedHeight = PdfUtility.TARGET_THUMBNAIL_HEIGHT_PORTRAIT;
                    resizedWidth = (PdfUtility.TARGET_THUMBNAIL_HEIGHT_PORTRAIT * originalBitmap.Width) / originalBitmap.Height;
                

                using (Bitmap resizedBitmap = new Bitmap(originalBitmap, new Size(resizedWidth, resizedHeight)))
                using (MemoryStream memoryStream = new MemoryStream())
                
                    resizedBitmap.Save(memoryStream, ImageFormat.Jpeg);

                    thumbnails.Add(memoryStream.ToArray());
                
            
        
    

    return thumbnails;

【问题讨论】:

【参考方案1】:

更新 现在支持 Windows 上的用于容器的 Web 应用程序。这允许您将自己的 docker 容器带入沙箱之外运行,因此下面描述的限制不会影响您的应用程序。

在运行应用的沙盒中存在一些限制,这些限制会阻止某些 API 调用。

以下是已发现的框架和场景列表 由于上述一项或多项限制,无法使用。它是 可以想象,未来会支持一些作为沙盒 进化。

PDF 生成器因上述限制而失败:

Syncfusion Siberix Spire.PDF 以下 PDF 生成器是 支持:

SQL 报告框架:要求网站在 Basic 或更高版本中运行 (请注意,这目前在 Functions 应用程序中不起作用 消费模式)EVOPDF:见 http://www.evopdf.com/azure-html-to-pdf-converter.aspx 供应商 解决方案 Telerik 报告:要求站点在 Basic 或 更高。更多信息在这里 Rotativa / wkhtmltopdf:需要网站 在 Basic 或更高版本中运行。 NReco PdfGenerator (wkhtmltopdf): 需要 订阅计划 Basic 或更高版本 所有 PDF 生成器的已知问题 基于 wkhtmltopdf 或 phantomjs:不呈现自定义字体 (改为使用系统安装的字体)因为沙盒 GDI API 即使在基于 VM 的 Azure 应用计划(基本或 更高)。

其他不支持的场景:

PhantomJS/Selenium:尝试连接到本地地址,也使用 GDI+。

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox

【讨论】:

以上是关于Azure 上的 Syncfusion PdfViewerControl的主要内容,如果未能解决你的问题,请参考以下文章

Angular syncfusion - 获取折线图选择系列的事件是啥?

Syncfusion 控件未在 iOS 本机 UIWebView 上加载

SyncFusion 的免费电子书

Syncfusion仪表板平台:如何快速制作仪表板?

Xamarin SyncFusion,裁剪图像未正确传递?

Syncfusion SfDataGrid 导出Excel