呈现报告质量 EMF 与 PDF

Posted

技术标签:

【中文标题】呈现报告质量 EMF 与 PDF【英文标题】:Render report quality EMF versus PDF 【发布时间】:2013-07-04 16:14:44 【问题描述】:

我在呈现 s-s-rS 服务器报告并从代码中打印它时遇到了困难。

虽然渲染成功并打印了报表,但图形中的结果质量很差。该报告本身具有用于徽标的高分辨率 6kx1k GIF 图像。

我制作了下面的图片来说明使用 EMF 与 PDF 渲染之间的区别:

如您所见,字体看起来很棒(没有像素化),并且在 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;

这是打印文档的实现

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();
    

【问题讨论】:

报告中的徽标图像类型是什么?过去,我在 PDF 导出中的图像渲染效果很差,将图像从 png 更改为 jpeg 解决了这个问题...这可能不适用于您的情况,特别是因为您的 PDF 似乎是好的,但是可能值得尝试不同的图像文件类型,看看是否有什么不同。 Ian 我实际上使用高分辨率 (6kx1k) GIF 文件来制作徽标。标志只有两种颜色,没有阴影。如果可用,将使用基于矢量的图像。确实先尝试了 PNG,但效果不如 GIF。 你解决过这个问题吗? 【参考方案1】:

尝试在下面从 devInfo 复制的 sn-p 中将“150”替换为所需的 dpi,它应该会有所帮助。将其更改为“300”解决了我的类似问题。

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

请注意,在您的报告中更改此设置可能会令人沮丧,因为报告查看器渲染引擎在预览报告时仍会以 150 dpi 显示,因此您需要在每次更新到rdl.

【讨论】:

以上是关于呈现报告质量 EMF 与 PDF的主要内容,如果未能解决你的问题,请参考以下文章

Access 2019:EMF 文件支持刚刚消失?

s-s-rS 报告 通过 URL 以 PDF 格式呈现报告

ASP.NET 和实体框架:PDF 报告不在本地 iis 服务器上呈现

在 s-s-rS 报告设计中使用 .EMF(Windows 元文件格式)

在 s-s-rS 2008 中呈现 s-s-rS 2005 报告(如 .pdf)时,整个表被推送到下一页

在 ASP.NET Core 中呈现 RDLC 报告时出现索引超出范围异常