Textdatei einlesen und an Thermodrucker weiterleiten (XML)

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Snkt.

    Textdatei einlesen und an Thermodrucker weiterleiten (XML)

    Hallo,
    wie die Überschrift schon sagt möchte ich eine Textdatei mit Visual Basic einlesen und die darin enthaltenen Angaben an einen Thermo- Drucker weiterleiten.
    Dieser unterstützt XML.

    Die Textdatei einzulesen stellt kein Problem dar jedoch die Ausgabe bzw. weiterleitung, vielleicht erkennt ja jemand denn Fehler und kann mir weiter helfen.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System
    3. Imports System.Linq
    4. Imports System.Net
    5. Imports System.Windows.Forms
    6. Imports System.Xml.Linq
    7. Public Class Form1
    8. ' URL of ePOS-Print supported TM printer
    9. Private address As String = "http://192.168.178.24/cgi-bin/epos/service.cgi?devid=local_printer&timeout=10000"
    10. ' XML namespace
    11. Private soap As XNamespace = "http://schemas.xmlsoap.org/soap/envelope/"
    12. Private epos As XNamespace = "http://www.epson-pos.com/schemas/2011/03/epos-print"
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Print.Click
    14. Dim fs As New FileStream("ein.txt", FileMode.Open)
    15. Dim z(100) As String
    16. Dim i As Integer
    17. Dim sr As New StreamReader(fs)
    18. Dim reqbeg As String
    19. Dim reqend As String
    20. Dim req1 As String
    21. Dim req2 As String
    22. 'Bondrucker Textdatei einlesen
    23. Dim req As String
    24. i = 0
    25. Do Until i = 2
    26. z(i) = sr.ReadLine
    27. i = i + 1
    28. Loop
    29. i = 0
    30. Do While i < 2
    31. 'MessageBox.Show(z(i))
    32. i = i + 1
    33. Loop
    34. ' Create print document
    35. Dim reqbeg As String =
    36. <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    37. <s:Body>
    38. <epos-print xmlns="http://www.epson-pos.com/schemas/2011/03/epos-print">
    39. <image width="512" height="102" color="color_1" mode="gray16">Logo</image>
    40. <text lang="en" smooth="true" align="center">Straße Nr.</text>
    41. <feed unit="30"/>
    42. <text lang="en" smooth="true" align="center">PLZ Ort</text>
    43. <feed unit="50"/>
    44. req1 = <text lang="en" smooth="true" align="center"></text>
    45. req2 = <text lang="en" smooth="true" align="center"></text>
    46. <feed unit="50"/>
    47. reqend = <text lang="en" smooth="true" align="center">Datum</text>
    48. <feed unit="30"/>
    49. <text lang="en" smooth="true" align="center">Uhrzeit</text>
    50. <feed unit="50"/>
    51. <cut/>
    52. </s:Body>
    53. </s:Envelope>
    54. </s:Envelope>
    55. req = reqbeg + req1 + z(i) + req2 & reqend
    56. ' Send print document
    57. Dim client As WebClient = New WebClient()
    58. client.Headers.Set("Content-Type", "text/xml; charset=utf-8")
    59. AddHandler client.UploadStringCompleted, AddressOf UploadStringCompletedEventHandler
    60. client.UploadStringAsync(New Uri(address, UriKind.Absolute), req.ToString())
    61. End Sub


    Vielen Dank schon mal!

    Edith: Ja es handelt sich um einen Epson Drucker um genau zu sein den "Epson TMT 88 i".
    Unter download.epson-biz.com/modules…age=prod&pcat=52&pid=2773 gibt es Beispielprogramme.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snkt“ ()

    @Snkt:: Willkommen im Forum. :thumbup:
    1. Editiere bitte Deinen 1. Post (Button Bearbeiten) und formatiere Deinen Quelltext als VB-Code - gugst Du hier.
    2. Gibt es zu diesem Drucker keinen Windows-Druckertreiber?
    3. Wenn nein: Gibt es eine Page, auf der die Kommunikation mit diesem Drucker beschrieben ist?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nicht

    Snkt schrieb:

    Einen herkömmlichen Druckertreiber von Microsoft
    sondern einen speziellen für Deinen Drucker unter Windows.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn der Drucker lokal angeschlossen ist, würde ich es mit dem Epson Acvanced Printer Driver versuchen.
    Der unterstützt zumindest die aktuellen POS-Drucker.

    Aber solange du keine Informationen wie Printertyp und Anschlussart preis gibst, ist das alles nur Stochern im Nebel.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke, denn Treiber habe ich ausprobiert er funktioniert
    auch nur ist er für meine Zwecke ungeeignet.

    Der Drucker befindet sich im lokalen Netzwerk, jedoch wird die Textdatei bzw.
    werden die zu druckenden Inhalte auf einem Server erzeugt.

    Ziel ist es ohne manuelles handeln den Druck direkt über den Server aus einer
    Datenbank heraus auszuführen.
    Mein bisheriges Problem konnte ich lösen indem ich die Variablen für jede Zeile einzeln zugewiesen habe.
    Es scheitert nun aber an der Konvertierung von String zu XML. Ich bekomme die Meldung: "Der Wert vom Typ "String" kann nicht in "System.Xml.Linq.XElement" konvertiert werden.".

    Betroffen sind reqbeg0 + reqbeg1 + reqbeg2 + reqbeg3 und req + reqend0 etc.
    Außerdem ist mir unklar wie ich die Uhrzeit und das Datum in die XML bekommen soll hat da jemand eine Idee(Zeile 78 und 80)?

    VB.NET-Quellcode

    1. req = reqbeg0 + reqbeg1 + reqbeg2 + reqbeg3 + reqbeg4 + reqbeg5 + reqbeg6 + reqbeg7
    2. Do While i < 2
    3. req = req + req1 + z(i) + req2 + req22
    4. Loop
    5. req = req + reqend0 + reqend1 + reqend2 + reqend3 + reqend4 + reqend5 + reqend6 + reqend7


    Anbei nochmal der aktuelle Code.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System
    3. Imports System.Linq
    4. Imports System.Net
    5. Imports System.Windows.Forms
    6. Imports System.Xml.Linq
    7. Public Class Form1
    8. ' URL of ePOS-Print supported TM printer
    9. Private address As String = "http://192.168.178.24/cgi-bin/epos/service.cgi?devid=local_printer&timeout=10000"
    10. ' XML namespace
    11. Private soap As XNamespace = "http://schemas.xmlsoap.org/soap/envelope/"
    12. Private epos As XNamespace = "http://www.epson-pos.com/schemas/2011/03/epos-print"
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Print.Click
    14. Dim fs As New FileStream("ein.txt", FileMode.Open)
    15. Dim z(100) As String
    16. Dim i As Integer
    17. Dim sr As New StreamReader(fs)
    18. Dim reqbeg0 As String
    19. Dim reqbeg1 As String
    20. Dim reqbeg2 As String
    21. Dim reqbeg3 As String
    22. Dim reqbeg4 As String
    23. Dim reqbeg5 As String
    24. Dim reqbeg6 As String
    25. Dim reqbeg7 As String
    26. Dim reqend0 As String
    27. Dim reqend1 As String
    28. Dim reqend2 As String
    29. Dim reqend3 As String
    30. Dim reqend4 As String
    31. Dim reqend5 As String
    32. Dim reqend6 As String
    33. Dim reqend7 As String
    34. Dim req1 As String
    35. Dim req2 As String
    36. Dim req22 As String
    37. 'Bondrucker Textdatei einlesen
    38. Dim req As XElement
    39. i = 0
    40. Do Until i = 2
    41. z(i) = sr.ReadLine
    42. i = i + 1
    43. Loop
    44. i = 0
    45. Do While i < 2
    46. 'MessageBox.Show(z(i))
    47. i = i + 1
    48. Loop
    49. ' Create print document
    50. reqbeg0 = "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>"
    51. reqbeg1 = "<s:Body>"
    52. reqbeg2 = "<epos-print xmlns='http://www.epson-pos.com/schemas/2011/03/epos-print'>"
    53. reqbeg3 = "<image width='512' height='102' color='color_1' mode='gray16'>Logo</image>"
    54. reqbeg4 = "<text lang='en' smooth='true' align='center'>Straße</text>"
    55. reqbeg5 = "<feed unit='30'/>"
    56. reqbeg6 = "<text lang='en' smooth='true' align='center'>PLZ Ort</text>"
    57. reqbeg7 = "<feed unit='50'/>"
    58. req1 = "<text lang='en' smooth='true' align='center'></text>"
    59. req2 = "<text lang='en' smooth='true' align='center'></text>"
    60. req22 = "<feed unit='50'/>"
    61. reqend0 = "<text lang='en' smooth='true' align='center'>Datum</text>"
    62. reqend1 = "<feed unit='30'/>"
    63. reqend2 = "<text lang='en' smooth='true' align='center'>Uhrzeit</text>"
    64. reqend3 = "<feed unit='50'/>"
    65. reqend4 = "<cut/>"
    66. reqend5 = "</epos-print>"
    67. reqend6 = "</s:Body>"
    68. reqend7 = "</s:Envelope>"
    69. req = reqbeg0 + reqbeg1 + reqbeg2 + reqbeg3 + reqbeg4 + reqbeg5 + reqbeg6 + reqbeg7
    70. Do While i < 2
    71. req = req + req1 + z(i) + req2 + req22
    72. Loop
    73. req = req + reqend0 + reqend1 + reqend2 + reqend3 + reqend4 + reqend5 + reqend6 + reqend7
    74. ' Send print document
    75. Dim client As WebClient = New WebClient()
    76. client.Headers.Set("Content-Type", "text/xml; charset=utf-8")
    77. AddHandler client.UploadStringCompleted, AddressOf UploadStringCompletedEventHandler
    78. client.UploadStringAsync(New Uri(address, UriKind.Absolute), req.ToString())
    79. End Sub
    80. ' Receive response document
    81. Private Sub UploadStringCompletedEventHandler(sender As Object, e As UploadStringCompletedEventArgs)
    82. If (e.Error IsNot Nothing) Then
    83. MessageBox.Show(e.Error.Message)
    84. Else
    85. 'Parse response document
    86. Dim res As XElement = XElement.Parse(e.Result)
    87. Dim c = From el In res.Descendants(epos + "response") Select el.Attribute("success")
    88. MessageBox.Show(c.First().Value)
    89. End If
    90. End Sub

    Viele Grüße

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snkt“ ()

    Ich sag ja:
    Du möchtest nicht mit dem Drucker kommunizieren, sondern mit einem Webservice, der den Drucker bedient.

    Versuch nicht, das SOAP-Protokoll von Hand nachzubilden, sondern binde den Webservice als solchen ein.
    Da liegt bestimmt die entsprechende WSDL auf dem Server rum (oder ist anderweitig verfügbar).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Leider habe ich keine Ahnung von WSDL und ähnlichem. Ich habe nur den Auftrag das Programm mit VB umzusetzen mit anderen Vorschlägen bin ich abgeprallt.

    Mein Programm funktioniert jetzt soweit auch ich habe nur noch ein kleines Problem.
    Das Programm soll ja von allein starten wenn die .exe angesprochen wird. Deshalb habe ich das ganze in ein Modul verpackt.

    Die Private Sub hatte ich zunächst in eine Sub main() umgewandelt.
    Nur leider bezieht die Private Sub Bondruck_Click befehle von der Private Sub UploadStringCompletedEventHandler und ich nehme an das durch das fehlende Private diese nicht mehr bezogen werden können?

    Also wollte ich in der Sub main() einfach die Private Sub Bondruck_Click starten, das funktioniert aber leider nicht er erwartet mit Call Bondruck_Click(?) irgendwelche Attribute anstelle von dem Fragezeichen.

    ich weiß leider nicht mehr weiter bin auch für komplett andere Lösungsansätze offen. Vielen Dank schon mal.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System
    3. Imports System.Linq
    4. Imports System.Net
    5. Imports System.Windows.Forms
    6. Imports System.Xml.Linq
    7. Module Module1
    8. ' URL of ePOS-Print supported TM printer
    9. Private address As String = "http://192.168.178.20/cgi-bin/epos/service.cgi?devid=local_printer&timeout=10000"
    10. ' XML namespace
    11. Private soap As XNamespace = "http://schemas.xmlsoap.org/soap/envelope/"
    12. Private epos As XNamespace = "http://www.epson-pos.com/schemas/2011/03/epos-print"
    13. Sub mains()
    14. Call Bondruck_Click(?)
    15. End Sub
    16. Private Sub Bondruck_Click(sender As Object, e As EventArgs)
    17. Dim fs As New FileStream("C:\temp\bonkuech.txt", FileMode.Open)
    18. Dim z(100) As String
    19. Dim i As Integer
    20. Dim sr As New StreamReader(fs)
    21. Dim reqbeg0 As String
    22. Dim reqbeg1 As String
    23. Dim reqbeg2 As String
    24. Dim reqbeg3 As String
    25. Dim reqbeg4 As String
    26. Dim reqbeg5 As String
    27. Dim reqbeg6 As String
    28. Dim reqbeg7 As String
    29. Dim reqend0 As String
    30. Dim reqend1 As String
    31. Dim reqend2 As String
    32. Dim reqend3 As String
    33. Dim reqend4 As String
    34. Dim reqend5 As String
    35. Dim reqend6 As String
    36. Dim reqend7 As String
    37. Dim req0 As String
    38. Dim req1 As String
    39. Dim req2 As String
    40. Dim req22 As String
    41. Dim req As XElement
    42. 'Bondrucker Textdatei einlesen
    43. i = 0
    44. Do Until i = 2
    45. z(i) = sr.ReadLine
    46. i = i + 1
    47. Loop
    48. i = 0
    49. Do While i < 2
    50. MessageBox.Show(z(i))
    51. i = i + 1
    52. Loop
    53. ' Create print document
    54. reqbeg0 = "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>"
    55. reqbeg1 = "<s:Body>"
    56. reqbeg2 = "<epos-print xmlns='http://www.epson-pos.com/schemas/2011/03/epos-print'>"
    57. reqbeg3 = "<image width='512' height='102' color='color_1' mode='gray16'>Logo</image>"
    58. reqbeg4 = "<text lang='en' smooth='true' align='center'>Straße</text>"
    59. reqbeg5 = "<feed unit='30'/>"
    60. reqbeg6 = "<text lang='en' smooth='true' align='center'>PLZ Ort</text>"
    61. reqbeg7 = "<feed unit='50'/>"
    62. req1 = "<text lang='en' smooth='true' align='left'>"
    63. req2 = "</text>"
    64. req22 = "<feed unit='30'/>"
    65. reqend3 = "<feed unit='50'/>"
    66. reqend4 = "<cut/>"
    67. reqend5 = "</epos-print>"
    68. reqend6 = "</s:Body>"
    69. reqend7 = "</s:Envelope>"
    70. req0 = reqbeg0 + reqbeg1 + reqbeg2 + reqbeg3 + reqbeg4 + reqbeg5 + reqbeg6 + reqbeg7
    71. i = 0
    72. Do While i < 2
    73. req0 = req0 + req1 + z(i) + req2 + req22
    74. 'Label1.Text = req0.ToString
    75. i = i + 1
    76. Loop
    77. req0 = req0 + reqend3 + reqend4 + reqend5 + reqend6 + reqend7
    78. req = XElement.Parse(req0, LoadOptions.PreserveWhitespace)
    79. ' Send print document
    80. Dim client As WebClient = New WebClient()
    81. client.Headers.Set("Content-Type", "text/xml; charset=utf-8")
    82. AddHandler client.UploadStringCompleted, AddressOf UploadStringCompletedEventHandler
    83. client.UploadStringAsync(New Uri(address, UriKind.Absolute), req.ToString())
    84. End Sub
    85. ' Receive response document
    86. Private Sub UploadStringCompletedEventHandler(sender As Object, e As UploadStringCompletedEventArgs)
    87. If (e.Error IsNot Nothing) Then
    88. MessageBox.Show(e.Error.Message)
    89. Else
    90. 'Parse response document
    91. Dim res As XElement = XElement.Parse(e.Result)
    92. Dim c = From el In res.Descendants(epos + "response") Select el.Attribute("success")
    93. 'MessageBox.Show(c.First().Value)
    94. End If
    95. End
    96. End Sub
    97. End Module


    Viele Grüße


    Was darf ich mir hierunter vorstellen?

    Snkt schrieb:

    Das Programm soll ja von allein starten wenn die .exe angesprochen wird.
    Mach Dir eien WinForm-Anwendung, mit der Du zumindest den Druckvorgang über einen Button starten kannst. Außerdem lässt sich solch wesentlich einfacher debuggen.
    Dein Code als solcher ist eher suboptimal.

    VB.NET-Quellcode

    1. i = 0
    2. Do Until i = 2
    3. z(i) = sr.ReadLine
    4. i = i + 1
    5. Loop
    6. i = 0
    7. Do While i < 2
    8. MessageBox.Show(z(i))
    9. i = i + 1
    10. Loop
    könnte so aussehen, wenn wir davon ausgehen, dass die Anzahl der Zeilen nicht permanent auf 2 festgelegt ist:

    VB.NET-Quellcode

    1. Dim z() = IO.File.ReadAllLines("C:\temp\bonkuech.txt")
    2. TextBox.Lines = z
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Was darf ich mir hierunter vorstellen?

    Snkt schrieb:

    Das Programm soll ja von allein starten wenn die .exe angesprochen wird.
    Mach Dir eien WinForm-Anwendung, mit der Du zumindest den Druckvorgang über einen Button starten kannst. Außerdem lässt sich solch wesentlich einfacher debuggen.
    Dein Code als solcher ist eher suboptimal.

    Ich hatte ja zunächst eine WinForm-Anwendung aber ich möchte den Druckvorgang nicht durch das betätigen eines Buttons auslösen.
    Mein Programm soll vom Server aus gestartet werden ohne das der Nutzer unter Windows noch einen Button betätigen muss.

    Die MessageBox ist aktuell übrigens auskommentiert diente nur zur überprüfung.

    Vielen Dank für den Code- Vorschlag!

    Snkt schrieb:

    aber ich möchte den Druckvorgang nicht durch das betätigen eines Buttons auslösen.
    Das ist doch kein Grund, eine Console-Anwendung zu verwenden.
    In das Form_Shown-Event kannst Du reinpacken, was "Autostart" sein soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Snkt schrieb:

    Nur wie genau kann ich das umsetzen?
    Generier Dir den Handler zum Form_Shown-Event:

    und ruf von da aus Deinen Code auf und feddich.

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    2. mains()
    3. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!