4

SSRS サーバーレポートのレンダリングとコードからの印刷に問題があります。

レンダリングは成功し、レポートは印刷されますが、グラフィックスの品質は低下します。レポート自体には、ロゴ用の高解像度 6kx1k GIF 画像があります。

EMF と PDF を使用したレンダリングの違いを示すために、以下の画像を作成しました。

(左がPDF、右がEMF)

ご覧のとおり、フォントは見栄えがよく (ピクセル化なし)、PDF ロゴでレンダリングすると見栄えがよくなります。ただし、ロゴの端に見られるように、EMF バージョンは品質が低くなります。

誰かがこれに遭遇して解決しましたか?

SQL Server 2008R2 SP2 (10.50.4000) を実行しています

EMF を使用してレポートを表示するコード

public List<byte[]> Render()
{
    // Setting credentials and reporting services uri
    ReportExecutionService reportService = new ReportExecutionService
        {
            Credentials = _credentials,
            Url = Settings.Default.ReportingService
        };

    // Prepare report parameter.
    ExecutionHeader execHeader = new ExecutionHeader();
    reportService.ExecutionHeaderValue = execHeader;
    reportService.LoadReport(_report, null);
    reportService.SetExecutionParameters(_parameters.ToArray(), "en-us");

    // Render
    bool startup = true;
    List<byte[]> streams = new List<byte[]>();
    int numberOfPages = 0;
    byte[] result = null;
    while (startup || result.Length > 0)
    {
        startup = false;
        string devInfo = String.Format(@"<DeviceInfo><OutputFormat>EMF</OutputFormat><PrintDpiX>150</PrintDpiX><PrintDpiY>150</PrintDpiY><StartPage>{0}</StartPage></DeviceInfo>", numberOfPages + 1);
        string encoding, mimeType, extension;
        string[] streamIDs = null;
        Warning[] warnings = null;
        result = reportService.Render("IMAGE", devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

        if (result.Length > 0)
        {
            streams.Add(result);
        }
        numberOfPages++;
    }
    return streams;
}

これがprintdocumentの実装です

public class PrintReport : PrintDocument
{
    private int _currentPage;
    private  List<byte[]> _pages;

    public PrintReport()
    {
    }

    public List<byte[]> Pages
    {
        get { return _pages; }
        set { _pages = value; }
    }

    protected override void OnBeginPrint(PrintEventArgs e)
    {
        base.OnBeginPrint(e);
        _currentPage = 0;
    }

    protected override void OnPrintPage(PrintPageEventArgs e)
    {
        base.OnPrintPage(e);

        Stream pageToPrint = new MemoryStream(_pages[_currentPage]);
        pageToPrint.Position = 0;

        // Load each page into a Metafile to draw it.
        using (Metafile pageMetaFile = new Metafile(pageToPrint))
        {
            Rectangle adjustedRect = new Rectangle(
                    e.PageBounds.Left - (int)e.PageSettings.HardMarginX,
                    e.PageBounds.Top - (int)e.PageSettings.HardMarginY,
                    e.PageBounds.Width,
                    e.PageBounds.Height);

            // Draw a white background for the report
            e.Graphics.FillRectangle(Brushes.White, adjustedRect);

            // Draw the report content
            e.Graphics.DrawImage(pageMetaFile, adjustedRect);

            // Prepare for next page.  Make sure we haven't hit the end.
            _currentPage++;
            e.HasMorePages = _currentPage < _pages.Count;
        }
    }

    protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
    {
        e.PageSettings = (PageSettings)PrinterSettings.DefaultPageSettings.Clone();
    }
}
4

1 に答える 1

0

以下の devInfo からコピーしたスニペットで、「150」を目的の dpi に置き換えてみてください。「300」に変更すると、同様の問題が解決しました。

<PrintDpiX>150</PrintDpiX><PrintDpiY>150</PrintDpiY>

レポート ビューアーのレンダリング エンジンは、レポートをプレビューするときに 150 dpi で表示されるため、レポートでこれを変更するとイライラする可能性があることに注意してください。そのため、rdl を更新するたびに、テスト用のコードを使用してレイアウトをテストする必要があります。

于 2022-02-16T17:31:21.817 に答える