Announcement

Collapse
No announcement yet.

Browser unabhängig PDF drucken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Browser unabhängig PDF drucken

    Hallo Community,
    ich hoffe ich erwische mit meinem Problem das richtige Forum, es ist nämlich nicht so ganz eindeutig.

    Ich erkläre mal kurz die Situation.
    Der Benutzer rechnet etwas über meine Anwendung aus und kann sich aus den Ergebnissen ein PDF erstellen, welches ich in einem Fenster (lightbox bzw. von telerik die radwindows, falls die jemand kennt) darstelle.
    Jetzt soll es ihm möglich sein die PDF direkt über einen Druckbutton zu drucken.
    Die PDF sollte direkt an den Drucker weitergeleitet werden. Bisherige Lösungen haben es so gemacht, dass der Adobe Reader aufging und wieder zu gemacht wurde. So ähnlich wäre das gut.
    Ob dabei jetzt der Druck Dialog aufgeht oder nicht, ist mir fast egal.

    Ich habe schon viel ausprobiert, sowohl Serverseitige Lösungen wie auch Clientseitige Lösungen, leider immer mit dem Ergebnis, dass es von PC zu PC und von Browser zu Browser unterschiedlich bis gar nicht funktionierte.

    Clientseitige Lösung z.b. (Funktioniert im Firefox nicht)

    Code:
    <html>
    	<head>
    		<script>
    			function pdfPrint() {
    			var x = document.getElementById("pdf");
    			x.click();
    			x.setActive();
    			x.focus();
    			x.print();
    			}
    		</script>
    	</head>
    	<body>
    		<embed id="pdf" src ="test.pdf" width="550" height="550" name="whatever">
    		<button onclick="pdfPrint()">Drucken</button>
    	</body>
    </html>
    Serverseitige Lösung z.b. (Funktioniert nicht wirklich zuverlässig auf allen PC's - wohl eher ungeeignet)

    Code:
        <form id="frmdruckentest" method="post" runat="server" defaultbutton="lbTESTDrucken" enctype="multipart/form-data">
    		<asp:LinkButton runat="server" Width="100px" ID="lbTESTDrucken" CssClass="button-theme" style="position:absolute;top:500px;left:662px;">
    			<span class="span_outer">
    				<span class="span_right">
    					<span class="span_left">
    						<span style="width: 92px;" class="span_inner">Drucken</span>
    					</span>
    				</span>
    			</span>
    		</asp:LinkButton>
        </form>
    Code:
    Imports MIR.Web.Allgemein.MIRSteuerfunktionen
    Imports Telerik.Web.UI
    Imports System.Globalization
    Imports System.Data.SqlClient
    Imports System.Drawing.Printing
    Imports System.IO
    Imports System.Data
    Imports System.Configuration
    Imports System.Collections
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    Imports System.Diagnostics
    
    Public Class druckentest
        Inherits MIR.Web.Allgemein.MIRBasePage
    
    #Region " eigene Variablen "
    
        Private Const PDFDOCNAME As [String] = "PrintTestFile"
        ' just a name
        Private Const GSWIN32 As String = "C:\Program Files\gs\gs8.70\bin\gswin32c.exe"
        Private Const PRINTERNAME As String = "HP psc 1600 series"
        Private Const ACROPATH As String = "C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"
        Private GSWINARGS As String = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile=""\\spool\{0}"" ""{1}"""
        ' 0... printer name, 1... pdf file
        'private string DOSPRNTARGS = "/p /h \"{0}\" \"{1}\""; // 0... pdf file, 1... printer name
        Private DOSPRNTARGS As String = " /D:""\\COMPUTERNAME\{1}"" ""{0}"""
        ' 1... printer name, 0... pdf file
        Private ACROREADERARGS As String = "/s /o /h /p {0}"
        ' 0... pdf file
        Private pdStreamToPrint As StreamReader
    
        Protected gsTb As String = String.Empty
        Protected gsArgTb As String = String.Empty
        Protected argTb As String = String.Empty
        Protected prtTb As String = String.Empty
        Protected adbPTb As String = String.Empty
        Protected adbPtb2 As String = String.Empty
        Protected prtTb2 As String = String.Empty
        Protected argTb1 As String = String.Empty
    
    #End Region
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            ' Hier Benutzercode zur Seiteninitialisierung einfügen
    
            If Not IsPostBack Then
                ' Hier steht der Code, der nur beim ersten Laden 
                ' der Seite ausgeführt wird, z. B. kann die Seite
                ' hier mit Startwerten etc. initialisiert werden.
    
                InitData()
    
            Else
                ' Hier steht der Code, der nach dem 
                ' Formularversand ausgeführt wird, d. h. hier 
                ' werden die Eingaben des Anwenders verarbeitet.
            End If
        End Sub
    
        Private Sub InitData()
            gsTb = GSWIN32
            gsArgTb = [String].Format(GSWINARGS, PRINTERNAME, PDFFileName)
            argTb = [String].Format(DOSPRNTARGS, PDFFileName, PRINTERNAME)
            prtTb = PRINTERNAME
            adbPTb = ACROPATH
            adbPtb2 = ACROPATH
            prtTb2 = PRINTERNAME
            argTb1 = [String].Format(ACROREADERARGS, PDFFileName)
        End Sub
    
        Private Sub lbTESTDrucken_Click(sender As Object, e As System.EventArgs) Handles lbTESTDrucken.Click
    
            Try
                DoShellPrint("Print")
            Catch ex As Exception
    			'Fehler abfangen
            End Try
    
        End Sub
    
        Private Sub DoShellPrint(verb As String)
            Dim psInfo As New ProcessStartInfo()
            psInfo.Verb = verb
            psInfo.FileName = PDFFileName
            psInfo.Arguments = argTb
            psInfo.WindowStyle = ProcessWindowStyle.Hidden
            psInfo.CreateNoWindow = True
            psInfo.UseShellExecute = True
            Dim process__1 As Process = Process.Start(psInfo)
            If Not process__1.WaitForExit(3000) Then
                process__1.Kill()
            End If
        End Sub
    
    	'Das ist ein Virtueller Pfad. Die pdf muss im Projektordner liegen. Das kann man später ja anpassen
        Private ReadOnly Property PDFFileName() As String
            Get
                Return MapPath("~/test.pdf")
            End Get
        End Property
    
    End Class
    Jetzt ist die Frage, kennt jemand eine Korrektur meiner zwei Versuche oder kennt jemand eine andere Lösung die funktioniert. Oder irgendwelche anderen Tipps vielleicht? Ich wäre für alles offen.

    Ich könnte mir auch sowas wie von www.pdfsharp.com vorstellen. (Das ist allerdings ungeeignet, weil es nicht drucken kann ^^)

    Ich hoffe wirklich, dass mir jemand helfen kann und bedanken mich schon einmal.

    Viele Grüße,
    boozone

  • #2
    Was ist, wenn jemand keinen Acrobat benutzt? Ich kann es kaum glauben, dass du es schaffst, mit dem serverseitigen VB-Code ein drucken auf dem Client anzustossen. M.E. durckt dein Server. Das drucken auf dem Client sollte nicht möglich sein. IMHO ist das drucken einer HTML-Seite oder eines anderen Objektes welches über den Response kommen, nicht möglich.
    Christian

    Comment


    • #3
      Ja du hast recht, ich hab auch schon gerätselt ob der letztere Versuch schwachsinn ist. ^^

      Die Aussage habe ich schon öfter gelesen. Allerdings habe ich dazu noch eine Frage.

      Wieso funktioniert es damit im Internet Explorer:

      Code:
      <html>
      	<head>
      		<script>
      			function pdfPrint() {
      			var x = document.getElementById("pdf");
      			x.click();
      			x.setActive();
      			x.focus();
      			x.print();
      			}
      		</script>
      	</head>
      	<body>
      		<embed id="pdf" src ="test.pdf" width="550" height="550" name="whatever">
      		<button onclick="pdfPrint()">Drucken</button>
      	</body>
      </html>

      Comment


      • #4
        Weil der IE m.E. dafür ein AddOn hat.
        Christian

        Comment


        • #5
          Ah, super danke für die Info.

          Ich schätze falls nicht jemand noch eine wunder Lösung hat, ist das hiermit wohl gegessen.

          Danke für deine Hilfen.

          EDIT:// Was nicht heißen soll, dass ich kein interesse mehr daran hätte
          Zuletzt editiert von boozone; 03.06.2013, 11:59.

          Comment


          • #6
            hallo, kannst du nicht eine serverseitige Komponente/Control verwendet welche das erstellte PDF anzeigt? PDF-Viewer für ASP.NET. Quasi PDF-Reader der das dann direkt anzeigen kann. Dabei eben einen der auch drucken kann.

            Alternativ fällt mir nur Crystal Reports ein. Das bringt auch einen Viewer mit, wo du die Icons konfigurieren kannst. Oder aber den Viewer ausblendest und direkt ein PDF generierst, wobei du mit PDF dann wohl aber wieder das gleiche Problem hättest.

            Einen Downloadlink für das PDf und nebendran einen Link für PDF Reader reicht nicht aus?

            Comment


            • #7
              hallo, kannst du nicht eine serverseitige Komponente/Control verwendet welche das erstellte PDF anzeigt?
              Ein Server kann nichts anzeigen. Der Content muss zum Client. Dabei kann der Mimetyp mitgegeben werden. Was der Client damit macht, kann der Server nicht bestimmen
              Christian

              Comment


              • #8
                Ein großteil der relevanten Browser (Chrome/Firefox) kann mitlerweile PDF direkt ohne externe Apps wie Adobe Reader direkt anzeigen).

                Comment


                • #9
                  Originally posted by Christian Marquardt View Post
                  Ein Server kann nichts anzeigen. Der Content muss zum Client. Dabei kann der Mimetyp mitgegeben werden. Was der Client damit macht, kann der Server nicht bestimmen
                  Die Serverkomponenten werden es so machen dass sie die Inhalt einlesen und in etwas darstellen was der Browser kann. HTML, CSS, JS. Vielleicht sogar Flash. Sowas wie bei Google Büchersuche, meinte ich. Da wird das auch in einem Viewer dargestellt.

                  Comment


                  • #10
                    Dann ist es wohl kein PDF mehr, sondern eben HTML oder FLASH. Da war jedoch nicht die Frage, sondern den Client ein PDF ausdrucken zu lassen. Ansonsten könnte er ein JavaApplet schreiben, welches das PDF von Server herunterläd und auf dem Client ausdruckt. Vorausgesetzt es hat die Rechte.....die google Bildersuche ist kein Viewer, sondern ganz normales HTML. Selbst wenn es den ein anderer Viewer wäre, müsste der Client diesen erstmal installiert haben. das wäre dann ein PDF ausgeben als XXX-Format und der Client bräuchte den XXX Viewer. Es gibt einfach Grenzen, die so in Ordnung sind. Und dazu gehört, dass nicht der x-beliebige Server irgendwas auf meinem Drucker drucken kann.
                    Christian

                    Comment

                    Working...
                    X