2017-07-29 35 views
8

我正在使用this文章打印我的rdlc直接打印機,但當我試圖創建Metafile對象通過stream它給我錯誤。打印沒有預覽的本地報告 - 流大小超出或在GDI + C發生一般錯誤#

using System; 
    using System.IO; 
    using System.Data; 
    using System.Text; 
    using System.Drawing.Imaging; 
    using System.Drawing.Printing; 
    using System.Collections.Generic; 
    using System.Windows.Forms; 
    using Microsoft.Reporting.WinForms; 

    public class Demo : IDisposable 
    { 
     private int m_currentPageIndex; 
     private IList<Stream> m_streams; 

     // Routine to provide to the report renderer, in order to 
     // save an image for each page of the report. 
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) 
     { 
      DataSet ds = new DataSet(); 
      ds.Tables.Add(dsData.Tables[0].Copy()); 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       IFormatter bf = new BinaryFormatter(); 
       ds.RemotingFormat = SerializationFormat.Binary; 
       bf.Serialize(stream, ds); 
       data = stream.ToArray(); 
      } 

      Stream stream1 = new MemoryStream(data); 
      m_streams.Add(stream1); 
      return stream1; 
     } 
     // Export the given report as an EMF (Enhanced Metafile) file. 
     private void Export(LocalReport report) 
     { 
      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; 
     } 
     // Handler for PrintPageEvents 
     private void PrintPage(object sender, PrintPageEventArgs ev) 
     { 
      Metafile pageImage = new 
       Metafile(m_streams[m_currentPageIndex]); 

      // Adjust rectangular area with printer margins. 
      Rectangle adjustedRect = new Rectangle(
       ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX, 
       ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, 
       ev.PageBounds.Width, 
       ev.PageBounds.Height); 

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

      // Draw the report content 
      ev.Graphics.DrawImage(pageImage, adjustedRect); 

      // Prepare for the next page. Make sure we haven't hit the end. 
      m_currentPageIndex++; 
      ev.HasMorePages = (m_currentPageIndex < m_streams.Count); 
     } 

     private void Print() 
     { 
      if (m_streams == null || m_streams.Count == 0) 
       throw new Exception("Error: no stream to print."); 
      PrintDocument printDoc = new PrintDocument(); 
      if (!printDoc.PrinterSettings.IsValid) 
      { 
       throw new Exception("Error: cannot find the default printer."); 
      } 
      else 
      { 
       printDoc.PrintPage += new PrintPageEventHandler(PrintPage); 
       m_currentPageIndex = 0; 
       printDoc.Print(); 
      } 
     } 
     // Create a local report for Report.rdlc, load the data, 
     // export the report to an .emf file, and print it. 
     private void Run() 
     { 
      LocalReport report = new LocalReport(); 
      LocalReport report = new LocalReport(); 
      report.ReportPath = @"Reports\InvoiceReportTest.rdlc"; 
      report.DataSources.Add(
       new ReportDataSource("DataSet1", dsPrintDetails)); 
      Export(report); 
      Print(); 
     } 

     public void Dispose() 
     { 
      if (m_streams != null) 
      { 
       foreach (Stream stream in m_streams) 
        stream.Close(); 
       m_streams = null; 
      } 
     } 

     public static void Main(string[] args) 
     { 
      using (Demo demo = new Demo()) 
      { 
       demo.Run(); 
      } 
     } 
    } 

它給了我錯誤時流大小超過或者信用證靜態內容更:

代碼(GDI +發生一般性錯誤)。

我的數據集,我用它來創建它的流: enter image description here

我不知道靜態內容是否應該不會影響流大小與否,但它不給我任何錯誤,如果我刪除某些內容從RDLC但是當我補充一點,再次拋出錯誤

+0

該代碼正在從xml文件生成html。 xml可能包含特殊字符(https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references),所以你可能需要使用System.Net.WebUtility.HtmlEncode() – jdweng

+0

@jdweng如果我說我已經通過了流列表從字節數組到流,而不是在打印事件處理程序中創建圖元文件,我必須照你說的先生一樣去做嗎?請參閱我已更新的問題。請參閱CreateStream函數。 –

+0

其實這個代碼的工作原理和打印,但如果我添加更多的內容,它是靜態的或從數據集在rdlc它給我錯誤在GDI + C#發生一般性錯誤。 –

回答

相關問題