简体   繁体   English

托管到IIS时无法访问打印机

[英]Unable to access the printer when hosting to iis

I am using rdlc report in MVC,Printing operation works perfectly when running in visual studio, but when published to iis which is set up in the same machine,printing operation is not taking place.But when I return the report as pdf the report it is there,and I can print the file using javascript.But I actually need not want to display the report but want to print from server..Thanks For help in advance 我在MVC中使用rdlc报表,在Visual Studio中运行时打印操作完美运行,但是当发布到同一台机器上设置的iis时,则不会进行打印操作。但是当我将报表以pdf格式返回时,报表会在那里,我可以使用javascript打印文件。但是我实际上不需要显示报告,而是希望从服务器打印。。谢谢您的帮助

  public ActionResult GenerateOrder()
    {


        try
        {

            LocalReport report = new LocalReport();
            report.ReportPath = (Server.MapPath("~/Reports/Report1.rdlc"));
            Export(report);
            Print();
        }
        catch (Exception Ex)
        {

        }

        return View();
    }

    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 int m_currentPageIndex;
    private IList<Stream> m_streams;

    private void PrintPage(object sender, PrintPageEventArgs ev)
    {
        try
        {
            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);
        }
        catch (Exception ex)
        {

        }

    }
   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
        {

            PrinterSettings pset = new PrinterSettings();
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            m_currentPageIndex = 0;
            printDoc.PrinterSettings.PrinterName = pset.PrinterName;
            printDoc.Print();
        }
    }

I think you want to print the page from Server itself. 我认为您想从服务器本身打印页面。 Check the Identity under which your application is running. 检查运行应用程序的身份 If it is running under default account then change it to either your account or to a different account that has printer access. 如果它在默认帐户下运行,则将其更改为您的帐户或具有打印机访问权限的其他帐户

Go to IIS, (a) First find the Application Pool your app is using (b) And then go to Application Pool details and find the Identity it is using. 转到IIS,(a)首先找到您的应用程序正在使用的应用程序池 (b),然后转到“ 应用程序池”详细信息并找到它正在使用的标识 (c) Change this Identity to your/some other account that has printer access. (c)将此身份更改为您/其他具有打印机访问权限的帐户。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM