0

我有一个 Web 应用程序,当用户单击按钮时,它会在没有打印对话框的情况下直接将 .rdlc 打印到打印机。当我在本地运行它时它工作正常,但是当我将它上传到 Intranet 时根本不工作。有人可以解释如何在 Intranet 中进行这项工作吗?

更新

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

2 回答 2

0

看起来您的 IIS 应用程序是负责启动打印作业的应用程序。用户无法控制打印。

虽然这是可行的,但您需要首先在 IIS 服务器上执行以下步骤:

  1. 在 IIS 服务器上创建本地用户帐户
  2. 使用新用户帐户登录,并设置打印机(确保将其设置为默认打印机)
  3. 打印出测试页(如果它不起作用,请检查服务器用于与打印机通信的端口并确保这些端口已打开)
  4. 设置 IIS 应用程序池以使用您创建的新用户帐户的凭据运行(它必须是交互式帐户 - 不要在 networkservice 或 localservice 下运行站点。)
  5. 尝试从您的 aspx 页面打印
于 2013-06-05T20:16:15.360 回答
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";

`

于 2015-04-08T13:04:10.307 回答