简体   繁体   中英

Print PDF without print dialog in asp.net

I have a button in ASP.NET that when its clicked it gets a rdlc file and generates a PDF file with a print dialog screen. What I want is to print it directly without the print dialog, I know it can be done with Javascript but I dont have any idea how to do this in javascript.

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

Code in aspx.cs

public void PrintTicket()
    {
        string[] streamids;
        string reportType = "PDF";
        string mimeType;
        string encoding;
        //string fileNameExtension = "pdf";
        string extension;

        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(TicketNo);
        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(location);
        report.SetParameters(new ReportParameter[] { location_parameter });


        string deviceInfo =
          "<DeviceInfo>" +
          "  <OutputFormat>EMF</OutputFormat>" +
          "  <PageWidth>8.5in</PageWidth>" +
          "  <PageHeight>11in</PageHeight>" +
          "  <MarginTop>0.10in</MarginTop>" +
          "  <MarginLeft>0.02in</MarginLeft>" +
          "  <MarginRight>0.25in</MarginRight>" +
          "  <MarginBottom>0.15in</MarginBottom>" +
          "</DeviceInfo>";

        Warning[] warnings;
        byte[] bytes = report.Render("PDF", deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings);

        FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("output2.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("output2.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;
        iTextSharp.text.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";
    }  

Like Steven V said, JavaScript on it`s own will never ever print without a dialog box. Can you imagine your creepy printer suddenly printing strange pages all of the sudden?

I can suggest an alternative however. Since you are using ASP.NET why not use a third party PDF generator, generate a PDF file on the serverside, then ajax back a link to the user. User will see a button: "Get PDF," he will click on it and a link to real PDF appears! Voila!

PS: You can look at some third party pdf-generators here: How to create PDF in ASP.NET

I think that a generic solution working for every browser is very difficult to implement, but there are some browser-specific workarounds that may work.

For example in Firefox you can activate silent printing following these steps:

  1. In the address bar type about:config then enter
  2. Right click in the white space and select New > Boolean
  3. Create a new string called print.always_print_silent and set it to True

In Internet Explorer you can use this VBScript sub:

<script language='VBScript'>
Sub Print()
       OLECMDID_PRINT = 6
       OLECMDEXECOPT_DONTPROMPTUSER = 2
       OLECMDEXECOPT_PROMPTUSER = 1
       call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
End Sub
document.write "<object ID='WB' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>"
</script>

Then you can print via Javascript using:

window.print(); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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