2013-06-05 36 views
0

我有一個Web應用程序,當用戶單擊某個按鈕時,它將打印一個.rdlc直接打印到打印機而不打印對話框。當我在本地運行它時工作正常,但是當我將其上傳到Intranet時根本無法工作。有人可以解釋如何在內部網上做這項工作嗎?如何在ASP.net中打印.rdlc時點擊按鈕

UPDATE

 private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) 
    { 
     Stream stream = new MemoryStream(); 
     m_streams.Add(stream); 
     return stream; 
    } 

    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; 
     } 
    } 
    private void PrintPage(object sender, PrintPageEventArgs ev) 
    { 
     Metafile pageImage = new Metafile(m_streams[currentPageIndex]); 
     ev.Graphics.DrawImage(pageImage,ev.PageBounds); 
     currentPageIndex++; 
     ev.HasMorePages = (currentPageIndex < m_streams.Count); 
    } 
    private void Print_Ticket() 
    { 

     const string printerName = "HPLaser" 
     if (m_streams == null || m_streams.Count == 0) 
      return; 
     PrintDocument printDoc = new PrintDocument(); 
     printDoc.PrinterSettings.PrinterName = printerName; 
     if (!printDoc.PrinterSettings.IsValid) 
     { 
      string msg = String.Format("Can't find printer \"{0}\".", printerName); 
      Console.WriteLine(msg); 
      return; 
     } 
     printDoc.PrintPage += new PrintPageEventHandler(PrintPage); 
     printDoc.Print(); //Prints Document 
    } 
    public void WriteTicket(string ticket_number, string queue) 
    { 
     LocalReport report = new LocalReport(); 
     //Displays ticket letter and number in ticket 
     report.ReportPath = "PrintTicket.rdlc"; 
     ReportParameter ticket_parameter = new ReportParameter(); 
     ticket_parameter.Name = "Ticket"; 
     ticket_parameter.Values.Add(ticket_number); 
     report.SetParameters(new ReportParameter[] { ticket_parameter }); 

     //Displays date and time in ticket 
     ReportParameter date = new ReportParameter(); 
     date.Name = "Date_Time"; 
     date.Values.Add(System.DateTime.Now.ToString()); 
     report.SetParameters(new ReportParameter[] { date }); 

     //Displays branch location in ticket 
     ReportParameter location_parameter = new ReportParameter(); 
     location_parameter.Name = "Location"; 
     location_parameter.Values.Add(queue); 
     report.SetParameters(new ReportParameter[] { location_parameter }); 

     Export(report); 
     currentPageIndex = 0; 
     Print_Ticket(); 
    } 
    //Clears stream 
    public new void Dispose() 
    { 
     if (m_streams != null) 
     { 
      foreach (Stream stream in m_streams) 
       stream.Close(); 
     } 
    } 
+0

這是「ReportViewer」控件或其他按鈕的打印按鈕嗎?看起來像它的自定義打印權? – MisterIsaak

+0

yes是自定義打印。它是我在頁面上創建的一個按鈕。 – Apollo

+0

@ bastos.sergio代碼已發佈。就像我說的這個代碼工作正常,打印罰款時,它在本地啓動。當我上傳到服務器時,它不打印。 – Apollo

回答

0

看起來你的IIS應用程序是一個最負責啓動打印作業。用戶無法控制打印。

雖然這是可行的,你需要在IIS服務器上的第一個執行以下步驟:

  1. 與新的用戶帳戶創建IIS服務器
  2. 登錄本地用戶帳戶,並設置(確保它設置爲默認打印機)
  3. 打印測試頁(如果不起作用,請檢查服務器使用哪些端口與打印機通信並確保這些端口已打開)
  4. 設置IIS應用程序池以使用新的我們的憑據運行呃帳戶,您創建(它必須是一個互動的帳戶 - 鴕鳥政策運行在網絡服務網站,或LocalService例如)
  5. 嘗試從你的aspx頁面
0

打印您需要導出報告以PDF格式,然後使用iTextSharp進行打印。客戶也需要安裝PDF閱讀器。

創建隱藏的iFrame如下:

<iframe id="frmPrint" name="IframeName" width="500" 
    height="200" runat="server" 
    style="display: none" runat="server"></iframe> 

添加ASP.NET按鈕:

<asp:ImageButton ID="btnPrint" runat="server" OnClick="btnPrint_Click" /> 

添加以下引用:

using iTextSharp.text.pdf; 
using iTextSharp.text; 
using System.IO; 

下面的代碼添加到按鈕點擊事件:

Warning[] warnings;    
string[] streamids; 
string mimeType; 
string encoding; 
string extension; 

byte[] bytes = View.ReportViewer.LocalReport.Render("PDF", null, out mimeType, 
       out encoding, out extension, out streamids, out warnings); 

FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("output.pdf"), 
FileMode.Create); 
fs.Write(bytes, 0, bytes.Length); 
fs.Close(); 

//Open existing PDF 
Document document = new Document(PageSize.LETTER); 
PdfReader reader = new PdfReader(HttpContext.Current.Server.MapPath("output.pdf")); 
//Getting a instance of new PDF writer 
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(
    HttpContext.Current.Server.MapPath("Print.pdf"), FileMode.Create)); 
document.Open(); 
PdfContentByte cb = writer.DirectContent; 

int i = 0; 
int p = 0; 
int n = reader.NumberOfPages; 
Rectangle psize = reader.GetPageSize(1); 

float width = psize.Width;    
float height = psize.Height; 

//Add Page to new document 
while (i < n) 
{ 
    document.NewPage(); 
    p++; 
    i++; 

    PdfImportedPage page1 = writer.GetImportedPage(reader, i); 
    cb.AddTemplate(page1, 0, 0); 
} 

//Attach javascript to the document 
PdfAction jAction = PdfAction.JavaScript("this.print(true);\r", writer); 
writer.AddJavaScript(jAction); 
document.Close(); 

//Attach pdf to the iframe 
frmPrint.Attributes["src"] = "Print.pdf"; 

`

相關問題