Das Internet ausdrucken

An einschlägigen IT-Stammtischen kreisen immer wieder Witze mit der Quintessenz: das Internet backupen, das Internet löschen oder das Internet ausdrucken. Mit dem letzteren habe ich mich beschäftigt. Völlig am Zeitgeist vorbei, wird mit einem Thermodrucker und Visual Basic Winforms ein Twitter Stream gedruckt.

Dafür habe ich mich wirklich in Unkosten gestürzt und den Thermopapier-Drucker Modell D10 aus dem Hause Celectronic für 11,90€ bestellt.

Der Drucker kommt mit einer Parallelschnittstelle und einem USB Adapter. Windows 8.1 erkennt diesen und trägt in den Gerätemanager ein USB Device ein.

image

Als nächstes wird manuell ein Drucker hinzugefügt, der ebendiese Schnittstelle nutzt.

image

Der Thermotransferdrucker kann eigentlich nur ASCII Zeichen mit vordefiniertem Zeichensatz. Deshalb wird der generische Text Only Drucker Treiber gewählt.

image

Im nächsten Schritt wird mit Visual Studio 2013 ein Visual Basic Winforms Projekt erstellt. Die Twitter REST API 1.1 erfordert einen OAuth autorisierten Zugriff. Dazu muss man mit einem Twitter Account die Applikation im Web Interface anlegen und erhält Token und Security Credentials. Diese insgesamt vier Parameter werden von der Anwendung bei jedem Abruf benötigt.

Um mit Twitter, der Authentifizierung und der API so wenig Aufwand wie möglich zu haben, wurde die Library Tweetinvi per Nuget zum Projekt hinzugefügt. Ein Test mit einer alternativen Library LINQ2Twitter schlug fehl.

Es wird die Twitter Search API genutzt, um alle 15 Sekunden eine Suche auf einen Hashtag abzusetzen. Um auf jeden Fall die wichtigen Nachrichten im Fehlerfall nicht zu verpassen, werden immer einfach alle Tweets, die Twitter hergibt, geladen. Mit Hilfe einer separaten Liste, in der anhand der Tweet ID doppelte Einträge vermieden werden, werden dann die Einträge eindeutig gehalten. Diese Liste weiß auch, ob der Eintrag bereits gedruckt wurde. Für die Persistenz wird beim Beenden und Starten die Liste serialisiert bzw. deserialisiert , so dass niemals etwas doppelt gedruckt werden sollte..

Wer schon einmal mit XAML gedruckt hat, wird völlig entgeistert feststellen, wie einfach das unter Winforms läuft.

Der Testaufbau mit einem Acer W3 Tablet mit Windows 8.1:

printtwitter

nun noch der VB.NET Beispiel Code

   1:  Imports Newtonsoft.Json
   2:  Imports System.IO
   3:  Imports Microsoft.VisualBasic.PowerPacks.Printing
   4:  Imports System.Drawing.Printing
   5:  Imports Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6
   6:   
   7:  Public Class Form1
   8:      Dim key As String = "oY...............3"
   9:      Dim secret As String = "rqV..................................u"
  10:      Dim atoken As String = "155...........................CB"
  11:      Dim stoken As String = "y9.................................bx"
  12:      Dim tweetlist As New List(Of twittermsg)
  13:   
  14:     
  15:   
  16:      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  17:          On Error Resume Next
  18:          tweetlist = JsonConvert.DeserializeObject(
Of List(Of twittermsg))(File.ReadAllText("daten.json"))
  19:      End Sub
  20:      Private Sub Form1_Closing(sender As Object, 
e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
  21:          File.WriteAllText("daten.json", JsonConvert.SerializeObject(tweetlist))
  22:      End Sub
  23:   
  24:      Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  25:          TwitterCredentials.SetCredentials(atoken, stoken, key, secret)
  26:          Dim tweets = Search.SearchTweets(TextBox1.Text)
  27:          Dim n = tweets.Count
  28:          For Each t In tweets
  29:              If IsNothing(tweetlist.Find(Function(c) c.id = t.IdStr)) Then
  30:                  tweetlist.Add(New twittermsg With 
{.id = t.IdStr, .text = t.Text, .printed = False})
  31:              End If
  32:          Next
  33:          Dim nn = tweetlist.Count
  34:          For Each x In tweetlist
  35:              If x.printed = False Then
  36:                  ListBox1.Items.Add(x.text)
  37:                  Dim Printer As New Printer()
  38:                  Printer.PrintQuality = vbPRPQDraft
  39:                  Printer.Print(x.text)
  40:                  Printer.EndDoc()
  41:                  x.printed = True
  42:              End If
  43:          Next
  44:      End Sub
  45:      Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
  46:          Timer1.Enabled = True
  47:          ListBox1.Visible = True
  48:      End Sub
  49:  End Class
  50:  Class twittermsg
  51:      Public Property id As String
  52:      Public Property printed As Boolean
  53:      Public Property text As String
  54:  End Class
Kommentare sind geschlossen