2013-06-05 5 views
0

У меня есть веб-приложение, которое, когда пользователь нажимает кнопку, печатает .rdlc непосредственно на принтер без диалогового окна «Печать». Это отлично работает, когда я запускаю его локально, но когда я загрузил его в интрасеть, он не работает вообще. Может кто-нибудь объяснить, как сделать эту работу в интрасети?Как печатать .rdlc в ASP.net при нажатии кнопки

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

есть обычная печать. Его кнопка, которую я создал на странице. – Apollo

+0

@ bastos.sergio код опубликован. Как я уже сказал, этот код отлично работает и отлично печатает, когда он запускается локально. Когда я загружаюсь на сервер, он не печатает. – Apollo

ответ

0

Похоже, ваше приложение IIS является тот, который отвечает за запуск заданий на печать. Пользователь не имеет контроля над печатью.

Хотя это выполнимо, необходимо сначала выполнить следующие действия на сервере IIS:

  1. Создание локальной учетной записи пользователя на сервере IIS
  2. Войти с использованием новой учетной записи пользователя и настройки принтер (убедитесь, что он настроен как принтер по умолчанию)
  3. Распечатайте тестовую страницу (если она не работает, проверьте, какие порты сервер использует для связи с принтером и убедитесь, что эти порты открыты)
  4. Настройка пула приложений IIS для запуска с учетными данными нового пользователя эр счета вы создали (он должен быть интерактивным счетом. - don't запустить сайт под NetworkService или 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"; 

`

Смежные вопросы