Распечатайте ReportViewer Report в PDF в Azure WebApp. Получить общую ошибку GDI - PullRequest
0 голосов
/ 16 мая 2018

У меня есть код, который возьмет отчет ReportViewer и распечатает его через PrintDialog.Однако когда я перемещаю его в Azure WebApp, я получаю общую ошибку GDI.Я искал решение, но обнаружил, что Azure блокирует большинство вызовов GDI.Это относится к методу экспорта ниже.Любая рекомендованная работа вокруг?

    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
    {
        try
        {
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }
        catch (Exception ex)
        {
            throw new Exception("CreateStream: " + ex.Message, ex.InnerException);
        }
    }

    public void Export(LocalReport report)
    {
        try
        {
            string deviceInfo =
              @"<DeviceInfo>
            <OutputFormat>EMF</OutputFormat>
            <PageWidth>8.5in</PageWidth>
            <PageHeight>11in</PageHeight>
            <MarginTop>0.25in</MarginTop>
            <MarginLeft>0.25in</MarginLeft>
            <MarginRight>0.25in</MarginRight>
            <MarginBottom>0.25in</MarginBottom>
        </DeviceInfo>";
            Warning[] warnings;
            m_streams = new List<Stream>();
            report.Render("Image", deviceInfo, CreateStream, out warnings);
            foreach (Stream stream in m_streams)
                stream.Position = 0;
        }
        catch (Exception ex)
        {
            throw new Exception("Export: " + ex.Message, ex.InnerException);
        }

    }

Ответы [ 2 ]

0 голосов
/ 16 июля 2018

На самом деле я считаю, что проблема в том, что GDI Azure не поддерживает EMF, который используется программами просмотра рабочего стола Telerik Reporting и ReportProcessor при печати.Однако в R2 2018 SP1 проблема устранена, и формат печати можно настроить таким образом, чтобы механизм печати печатал с использованием растрового изображения вместо метафайла, который поддерживается Azure.Рассматриваемое расширение рендеринга называется ImagePrint и может быть настроено через файл конфигурации приложения следующим образом:

<configuration> 
  <!-- The configSectins element should be the first child element of configuration --> 
  <configSections>
  <section
    name="Telerik.Reporting"
    type="Telerik.Reporting.Configuration.ReportingConfigurationSection, Telerik.Reporting, Version=x.x.x.x, Culture=neutral, PublicKeyToken=a9d7983dfcc261be"
    allowLocation="true"
    allowDefinition="Everywhere"/>
  </configSections>
       
  <Telerik.Reporting> 
    <extensions> 
      <render> 
        <extension name="IMAGEPrint"> 
          <parameters> 
            <parameter name="OutputFormat" value="PNG"/> 
            <parameter name="DpiX" value="300"/> 
            <parameter name="DpiY" value="300"/> 
          </parameters> 
        </extension> 
      </render> 
    </extensions> 
  </Telerik.Reporting> 
</configuration> 

Параметры DpiX и DpiY не являются обязательными, но поскольку они по умолчанию установлены на 96, это может привести кпиксельное изображение, особенно при печати на принтере с более высоким разрешением, поэтому лучше настраивать его также через app.config.

0 голосов
/ 17 мая 2018

Все веб-приложения Azure работают в безопасной среде, называемой песочницей.Каждое приложение запускается в своей собственной изолированной программной среде, изолируя его выполнение от других экземпляров на том же компьютере, а также обеспечивая дополнительную степень безопасности и конфиденциальности, которые в противном случае были бы недоступны.

Ради радикального уменьшения площади поверхности атаки песочница предотвращает вызов почти всех API-интерфейсов Win32k.sys, что практически означает, что большинство системных вызовов User32 / GDI32 блокируются.Для большинства приложений это не проблема, поскольку большинству веб-приложений Azure не требуется доступ к функциям пользовательского интерфейса Windows.Тем не менее, один общий шаблон, на который влияют, - это создание файла PDF

. Как упомянуто в этом документе https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox - Поддерживаются следующие генераторы PDF:

• Платформа отчетов SQL: требуетсясайт, работающий в режиме Basic или выше (обратите внимание, что в настоящее время он не работает в приложениях функций в режиме потребления)

• EVOPDF: см. http://www.evopdf.com/azure-html-to-pdf-converter.aspx для решения поставщика

• Telerik report: требует, чтобы сайт работал на Basic или выше.

• Rotativa / wkhtmltopdf: требует, чтобы сайт работал на Basic или выше.

• NReco PdfGenerator (wkhtmltopdf): требуется план подписки Basic иливыше

...