VB .NET: Dateien mit PDFCreator drucken

Mit den folgenden Funktionen kann man mit Visual Basic .NET unter Verwendung der PDFCreator Library (Verweis!) PDF-Dateien drucken.

Die erste Funktion schickt dabei einfach alle gefundenen Dateien eines beliebigen Verzeichnisses an die Funktion "PrintPDFFile", welche letztendlich die PDF Datei erstellt.

Public Sub PrintDirectory(ByVal aSourceDirectory As String, ByVal aFileFilter As String)
 
    Dim lstFiles As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = _
    My.Computer.FileSystem.GetFiles(aSourceDirectory, FileIO.SearchOption.SearchAllSubDirectories, aFileFilter)
 
    Dim fi As System.IO.FileInfo
    Dim fnnew As String
    Dim dirnew As String
 
    Dim pdfjob As New PDFCreator.clsPDFCreator
 
    If pdfjob.cStart("/NoProcessingAtStartup") = False Then
      MsgBox("Can't initialize PDFCreator.", vbCritical & vbOKOnly)
      Exit Sub
    End If
 
    For Each fn As String In lstFiles
      ' Create new filename
      fi = My.Computer.FileSystem.GetFileInfo(fn)
      fnnew = fi.Name
      fnnew = Replace(fnnew, fi.Extension, "") ' Remove old extension. Don't add new extension!
      dirnew = fi.Directory.FullName & "\"
 
      Me.PDFPrintFile(pdfjob, fi.FullName, fnnew, dirnew)
    Next
 
    pdfjob.cClose()
    pdfjob = Nothing
  End Sub
Public Sub PDFPrintFile(ByRef aPDFJob As PDFCreator.clsPDFCreator, ByVal aFilename As String, ByVal aOutputFilename As String, ByVal aOutputPath As String)
 
    ' Exit it output filename already exists
    If System.IO.File.Exists(aOutputPath & aOutputFilename) Then
      Exit Sub
    End If
 
    ' Create Outputdirectory if not existant
    If Not System.IO.Directory.Exists(aOutputPath) Then
      System.IO.Directory.CreateDirectory(aOutputPath)
    End If
 
    With aPDFJob
      .cOption("UseAutosave") = 1
      .cOption("UseAutosaveDirectory") = 1
      .cOption("AutosaveDirectory") = aOutputPath
      .cOption("AutosaveFilename") = aOutputFilename
      .cOption("AutosaveFormat") = 0    ' 0 = PDF
      .cClearCache()
    End With
 
    'Print the document to PDF
    aPDFJob.cPrintFile(aFilename)
 
    'Wait until the print job has entered the print queue
    Do Until aPDFJob.cCountOfPrintjobs = 1
      ' My.Application.DoEvents.DoEvents()
    Loop
 
    aPDFJob.cPrinterStop = False
 
    'Wait until PDF creator is finished then release the objects
    Do Until aPDFJob.cCountOfPrintjobs = 0
      ' My.Application.DoEvents()
    Loop
 
  End Sub

Aktualisierung vom 03.08.2009:

Wie ich heute leider mal wieder feststellen musste, funktioniert obiger Code bei einer großen Menge an umzuwandelnden Dateien nicht sonderlich.

Das unten aufgeführte "Modul" hat bei mir soeben 1400 Word-Dokumente erfolgreich in PDF umgenwandelt.

Public Module modPrintPDF
 
  Public Sub Main()
 
    Dim strDir As String = "C:\Word\Serienbriefe\Einzelbriefe"
    PrintDirectoryPDF(strDir, "*.doc", strDir)
 
  End Sub
 
  Public Function PrintDirectoryPDF(ByVal aInputDirectory As String, ByVal aFilter As String, ByVal aOutputDirectory As String)
 
    Dim lstFiles As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = _
    My.Computer.FileSystem.GetFiles(aInputDirectory, FileIO.SearchOption.SearchAllSubDirectories, aFilter)
 
    Dim pdfc As New PDFCreator.clsPDFCreator
    pdfc.cStart(, True)
 
    For Each fn As String In lstFiles
 
      ' Generate New Filename
      Dim fi As New IO.FileInfo(fn)
      Dim strNewFilename As String = fi.Name
      strNewFilename = Replace(strNewFilename, fi.Extension, ".pdf")
 
      ' Print File
      PrintPDF(pdfc, fn, aOutputDirectory, strNewFilename)
    Next
 
    Return True
 
  End Function
 
  Public Function PrintPDF(ByRef aPDFCreator As PDFCreator.clsPDFCreator, ByVal aPDFFile As String, ByVal aOutputPath As String, ByVal aOutputFilename As String) As Integer
 
    With aPDFCreator
      .cOption("UseAutosave") = 1
      .cOption("UseAutosaveDirectory") = 1
      .cOption("AutosaveFormat") = 0 ' 0 = PDF
      .cOption("AutosaveDirectory") = aOutputPath
      .cOption("AutosaveFilename") = aOutputFilename
      .cClearCache()
      .cPrintFile(aPDFFile)
    End With
 
  End Function
 
End Module

Howto: Anti Hotlinking

Was ist Hotlinking?

Hotlinking oder Inline Linking bezeichnet das Einbetten von Medien in eine Webseite, die auf einem anderen Host als die sie enthaltende Seite gespeichert sind. Oft handelt es sich bei den Medien um Bilder, aber auch das Referenzieren von Sound, Videos oder Text ist üblich.

Quelle: Wikipedia

Etwas einfacher formuliert:

Möchte ich beispielsweise das Firefox Logo von der offiziellen Webseite auf meiner eigenen Seite anzeigen, könnte ich dies unter Verwendung folgender URL tun:

http://www.mozilla.org/images/feature-logos1.png

Ich wuerde also die Grafik auf meiner Seite anzeigen, der Browser lädt die Grafik allerdings direkt vom Mozilla Server und verursacht dort (je nach Besuchermenge auf meiner Seite) nicht unerheblichen Datenverkehr (Traffic) auf dem Mozilla Server.

Warum sollte man nicht heiß verlinken?

1.) Es kostet die Person Geld, die die Grafik auf seinem/ihrem Server hostet. Diese Person bekommt dann als Dank höheren Traffic, ohne jedoch mehr Besucher zu erhalten. Dass das nicht fair ist, sollte eigentlich jedem klar sein.

2.) Sollten die Mozilla Jungs und Mädels irgendwann einmal auf die Idee kommen, und Ihre Grafik nicht mehr

"feature-logos1.png"

sondern beispielsweise

"feature-logo2007.png"

nennen, verlinkt die Hotlinking Seite (im o. g. Beispiel also meine Seite) auf eine nicht existente Grafik. Das sieht natürlich unschön aus und wirkt auch nicht gerade professional.

Was noch passieren kann, wenn sich Webmaster einen Scherz daraus machen, kann man hier bewundern.

Nun, wie verhindert man so etwas?

Auf der Webseite Alt Lab.com wird folgender Weg über die htaccess Datei beschrieben.

Dazu erstellt man eine neue, leere Datei mit den Namen ".htaccess" und lädt diese in das Hauptverzeichnis (Root-Verzeichnis) seiner Webseite (Hinweis: Wichtig ist der Punkt vor "htaccess". Unter Windows kann man diesen Punkt nur über die Kommandozeile hinzufügen).

Inhalt der .htaccess Datei:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?meineseite\.de/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpg|jpeg|gif|bmp|png)$ - [F]

Was macht das Listing?

Die erste Zeile startet das sogenannte Rewrite.

Die zweite Zeile betrifft alle Zugriffe der eigenen Seite (meineseite). Der Zusatz "[NC]" steht für "No Case" und bedeutet, dass Groß- und Kleinschreibung ignoriert werden können.

Die dritte Zeile sagt dem Server, dass leere Referer erlaubt sind und die letzte Zeile setzt die Regel für alle Dateien mit den Endungen *.jpg, *.jpeg, *.gif, *.bmp und *.png in Kraft.

Ruft nun ein fremder Server (Webseite) eine Datei, die den oben genannten Bedingungen entspricht auf, erhält diese Server die Fehlermeldung "403 Forbidden". Es wird also entweder diese Fehlermeldung ausgegeben, oder einfach keine Grafik angezeigt.

Anpassungen:

Was man beim obigen Listing ändern muss, ist das Wort "meineseite" in den Namen der URL der eigenen Seite (in meinem Fall dahead) sowie die Domain ".de" (beispielsweise in ".com" oder ".info").

Test:

Vor einem Test ob das oben genannte Listing funktioniert, sollte der Browser Cache geleert werden. Damit wird sichergestellt, dass die zu testende Datei nicht aus Versehen aus dem Zwischenspeicher des Browsers von der eigenen Festplatte geladen wird.

Nachdem dies erledigt ist, kann über die o. g. Webseite Alt Lab.com der Aufruf getestet werden.