Avatar billede dennisjuul Nybegynder
21. oktober 2004 - 12:02 Der er 18 kommentarer og
1 løsning

Printfunktion i C#.NET i web-applikationer

Hej!!!

Jeg vil gerne vide om det er muligt at printe direkte i en webapplikation i C#.NET? (dvs. ikke med f.eks. Javascript)

Har set flere eksempler på at det kan lade sig gøre i Windows-forms, men det duer jo ikke her.

Hvis det kan lade sig gøre, vil jeg gerne have eksempler...

Hilsen Dennis.
Avatar billede guidmaster Nybegynder
21. oktober 2004 - 12:44 #1
Kommer jo an på hvor du vil printe ;)

Hvis det er på klienten kan det kun ske gennem javascript da C# koden bliver afviklet på serveren ;)
Avatar billede burningice Nybegynder
21. oktober 2004 - 12:57 #2
ja... hvad vil du printe? du kan jo lave en applet der kører på klienten og har adgang til lidt mere end javascript (hvis brugeren altså giver lov)
Avatar billede dennisjuul Nybegynder
21. oktober 2004 - 13:04 #3
Jeg skal dels printe almindelig HTML (nogle tabeller), hvis indhold er fra en DB og også et datagrid.

Grunden til at jeg helst vil undgå Javascript, er at man ikke kan indstille printersettings gennem det (så vidt jeg er orienteret).
Avatar billede burningice Nybegynder
21. oktober 2004 - 13:07 #4
så er eneste mulighed at bruge et applet (har selv lavet et i C# der kan bruges), der findes også nogle lavet i ActiveX.
Avatar billede dennisjuul Nybegynder
21. oktober 2004 - 13:09 #5
har du noget kildekode eller et link...?
Avatar billede burningice Nybegynder
21. oktober 2004 - 13:16 #6
filerne ligger her: http://www.burningice.dk/sjov/csharp%20applet/

eksempel på en side:

<html>
<head>
<title>C# Applet</title>
</head>

<script>

function Init() {

t.Url = prompt("Siden der skal printes");
t.PrinterName = prompt("hvilken printer");

}

function Print() {

t.Print();

}

</script>

<body onLoad="Init();">
Tjek the printer<br />

<hr>
<input type="button" onClick="java script:Print();" value="Print" />

<object id="t" classid="http:PrintWithoutPrompt.dll#PrintWithoutPrompt.Class2" />

<br>
</body>
</html>
Avatar billede dennisjuul Nybegynder
21. oktober 2004 - 13:27 #7
Ok, tak...


Skal bare lige vide, hvad der skal stå ved t.Url og t.PrinterName, tænker på formatet af indholdet.

Skal alle filer bare ligge i samme folder og så kører det bare??
Avatar billede burningice Nybegynder
21. oktober 2004 - 13:47 #8
de skal bare ligge i samme mappe, ja... PrinterName skal være det exacte navn på din printer (hvis intet defineres bruges default-printer). URL skal være en adresse til siden der skal printes, typisk siden man står på (med http://). Der er også nogle indstillinger for margin af siden, og andre ting. Har ikke source-koden liggende lige her, men kan poste den når jeg kommer hjem.
Avatar billede burningice Nybegynder
21. oktober 2004 - 13:47 #9
forresten, det virker kun i IE
Avatar billede dennisjuul Nybegynder
21. oktober 2004 - 14:19 #10
Der kommer stadig ikke noget ud af printeren, den prompter bare efter side og printer, men ingen udskrift.
Avatar billede burningice Nybegynder
21. oktober 2004 - 17:54 #11
og du husker at kalde t.Print(); ??
Avatar billede dennisjuul Nybegynder
22. oktober 2004 - 08:09 #12
Har forsøgt at kalde t.Print() inde fra funktionen Print, lige efter alert'en, men den fejler på det.
Avatar billede burningice Nybegynder
22. oktober 2004 - 11:27 #13
kan du uddybe hvilken fejl det er?
Avatar billede burningice Nybegynder
22. oktober 2004 - 11:32 #14
source koden er her, hvis du kan bruge det til noget. Jeg har selv brugt komponenten i forbindelse med et webbaseret kasseapparat, så det burde virke

using System;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Microsoft.Win32;

namespace PrintWithoutPrompt
{
    /// <summary>
    ///
    /// </summary>
    public class Class2 : System.Windows.Forms.Control
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="printerName"></param>
        /// <returns></returns>
        [DllImport("Winspool.drv")]
        public static extern bool SetDefaultPrinter(string printerName);

        private AxSHDocVw.AxWebBrowser wb;
        private string sUrl;
        private string sPrinterName;

        private string orig_marginBottom;
        private string orig_marginTop;
        private string orig_marginLeft;
        private string orig_marginRight;

        private string marginBottom;
        private string marginTop;
        private string marginLeft;
        private string marginRight;

        private System.ComponentModel.Container components = null;
       
        /// <summary>
        ///
        /// </summary>
        public Class2()
        {
            InitializeComponent();

            // Load default margin values
            loadDefaultMargins();
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Class2));
            this.wb = new AxSHDocVw.AxWebBrowser();
            ((System.ComponentModel.ISupportInitialize)(this.wb)).BeginInit();
            this.SuspendLayout();
            //
            // wb
            //
            this.wb.Enabled = true;
            this.wb.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("wb.OcxState")));
            this.wb.Size = new System.Drawing.Size(0, 0);
            this.wb.TabIndex = 0;
            this.wb.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.wb_DocumentComplete);
            //
            // Class2
            //
            this.Controls.Add(this.wb);
            this.Size = new System.Drawing.Size(0, 0);
            ((System.ComponentModel.ISupportInitialize)(this.wb)).EndInit();
            this.ResumeLayout(false);

        }
        #endregion

        private bool IsPrinterEnabled()
        {
            int response =  (int) wb.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_PRINT);
            return (response & (int) SHDocVw.OLECMDF.OLECMDF_ENABLED) != 0 ? true : false;
        }

        private void PrintPage()
        {
            if (!IsPrinterEnabled())
            {
                return;
            }

            object o = "";
           
            SHDocVw.OLECMDID print = SHDocVw.OLECMDID.OLECMDID_PRINT;
            SHDocVw.OLECMDEXECOPT dontPromptUser = SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER;

            // write new margins
            RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Internet Explorer\PageSetup");

            key.SetValue("margin_bottom", marginBottom);
            key.SetValue("margin_top", marginTop);
            key.SetValue("margin_left", marginLeft);
            key.SetValue("margin_right", marginRight);
           
            wb.ExecWB(print, dontPromptUser, ref o, ref o);

            // write original margins
            restoreDefaultMargins();
           
        }

        private void loadDefaultMargins()
        {
            RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Internet Explorer\PageSetup");

            orig_marginBottom = marginBottom = key.GetValue("margin_bottom").ToString();
            orig_marginTop = marginTop = key.GetValue("margin_top").ToString();
            orig_marginLeft = marginLeft = key.GetValue("margin_left").ToString();
            orig_marginRight = marginRight = key.GetValue("margin_right").ToString();
        }

        private void restoreDefaultMargins()
        {
            RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Internet Explorer\PageSetup");

            key.SetValue("margin_bottom", orig_marginBottom);
            key.SetValue("margin_top", orig_marginTop);
            key.SetValue("margin_left", orig_marginLeft);
            key.SetValue("margin_right", orig_marginRight);
        }

        private void wb_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
        {
            PrintPage();
        }
       
        /// <summary>
        /// Prints the page set by the <see cref="Url"/> url-property to the default printer set by the <see cref="PrinterName"/> PrinterName-property.
        /// </summary>
        public void Print()
        {
            object o = null;
            wb.GoHome();
            wb.Navigate(sUrl, ref o, ref o, ref o, ref o);
        }
       
        /// <summary>
        /// Sets the url which the <see cref="Print"/> Print-procedure will print.
        /// </summary>
        public string Url
        {
            set
            {
                this.sUrl = value;
            }

            get
            {
                return sUrl;
            }
        }
       
        /// <summary>
        /// Set the default printer. This is the printer which the <see cref="Print"/> print-procedure prints the page to. For a list of printers use <see cref="InstalledPrinters"/> InstalledPrinters.
        /// </summary>
        public string PrinterName
        {
            get
            {
                return this.sPrinterName;
            }

            set
            {
                bool success = SetDefaultPrinter(value);

                if (!success)
                {
                    throw new Exception("No such printer");
                }
                else
                {
                    this.sPrinterName = value;
                }
            }
        }
       
        /// <summary>
        /// Returns all the installed printers as a comma-separated string. If you wan't the number of installed printers use <see cref="NumberOfInstalledPrinters"/> NumberOfInstalledPrinters.
        /// </summary>
        public string InstalledPrinters
        {
            get
            {
                string output = "";
               
                foreach (string s in PrinterSettings.InstalledPrinters)
                {
                    output += s +",";   
                }

                return output;
            }
        }
       
        /// <summary>
        /// Returns the number of installed printers. If you want the names of the printers use <see cref="InstalledPrinters "/> InstalledPrinters, wich returns the names in a comma-separated string.
        /// </summary>
        public int NumberOfInstalledPrinters
        {
            get
            {
                return PrinterSettings.InstalledPrinters.Count;
            }
        }
       
        /// <summary>
        ///
        /// </summary>
        public string MarginTop
        {
            get
            {
                return marginTop;
            }

            set
            {
                marginTop = value;               
            }
        }
       
        /// <summary>
        ///
        /// </summary>
        public string MarginBottom
        {
            get
            {
                return marginBottom;
            }

            set
            {
                marginBottom = value;
            }
        }
       
        /// <summary>
        ///
        /// </summary>
        public string MarginLeft
        {
            get
            {
                return marginLeft;
            }

            set
            {
                marginLeft = value;
            }
        }
       
        /// <summary>
        ///
        /// </summary>
        public string MarginRight
        {
            get
            {
                return marginRight;
            }

            set
            {
                marginRight = value;
            }
        }
    }
}
Avatar billede dennisjuul Nybegynder
22. oktober 2004 - 11:39 #15
Når jeg kører denne kode:

<html>
    <head>
        <title>C# Applet</title>
        <script>

function Init() {

t.Url = prompt("Siden der skal printes");
t.PrinterName = prompt("hvilken printer");

}

function Print() {

alert('Preparing to print '+ t.Url +' on printer '+ t.PrinterName);

t.Print();
}

        </script>
    </head>
    <body onLoad="Init();">
        Tjek the printer<br>
        <hr>
        <input id="knap" name="knap" type="button" onClick="java script:Print();" value="Print">
        <OBJECT id="t" classid="http:PrintWithoutPrompt.dll#PrintWithoutPrompt.Class2" VIEWASTEXT>
        </OBJECT>
        <br>
    </body>
</html>

Skriver den: "Object doesn't support this property or method" og henviser til linien hvor t.Print() står i funktionen Print().
Avatar billede dennisjuul Nybegynder
13. januar 2005 - 11:21 #16
Jeg skal bede om svar fra deltagere, for at kune give point, tak.
Avatar billede burningice Nybegynder
13. januar 2005 - 15:27 #17
svar
Avatar billede burningice Nybegynder
13. januar 2005 - 15:27 #18
hvad endte det forresten med?
Avatar billede dennisjuul Nybegynder
17. januar 2005 - 12:35 #19
Den fejler stadig som beskrivet længere oppe. Men jeg synes dog stadig at du skal have point for din tid.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Teknisk systemansvarlig / ingeniør inden for taktisk datalink

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Sektionschef til Cyber Security Guidance ved Cyberdivisionen i Forsvaret

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger AI forretningskonsulent i Ballerup

IT-Universitetet i København

CIO