PDFtk - PDF Formulare automatisch befüllen

Wenn man automatisiert PDF Formulare ausfüllen möchte bietet sich das PDF-Toolkit von Sid Steward an. Es ermöglicht PDF Formulare über fdf Dateien zu befüllen. PDFtk ist erhältlich für Linux und Windows und funktioniert bei beiden Systemen gleich. Zumindest hab ich noch keine Unterschiede festgestellt ;-)

Wie geht man nun vor um pdftk in einem automatischen Prozess zu integrieren ?

1.) Download von PDFTk hier https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ , bei Linux ist PDFTk meist über Repository verfügbar.

Debian
apt-get install pdftk
OpenSuse
zypper install pdftk


Man kann sich natürlich auch das aktuelle PDFTk downloaden und über die Packetverwaltung installieren.

Debian
dpkg -i /download/pdftk-XXXXX.deb
OpenSuse
rpm -i /download/pdftk-XXXXX.rpm

Windows >> PDFTK für Windows Download & Installation


2.) um nun alle Felder zu erhalten die ausgefüllt werden können ruft man PDFtk auf mit diesem Kommando auf :
pdftk FORMULAR.pdf generate_fdf output FORMULAR.fdf

man erhält nun eine Datei mit den Formular Feldern und dem Header & Footer der Datei. Das sieht dann so in der Art aus
%FDF-1.2
%âãÏÓ
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V ()
/T (TEST_NAME)
>> 
<<
/V ()
/T (TEST_ADRESSE)
>> 
]
>>
>>
endobj 
trailer
<<
/Root 1 0 R
>>
%%EOF


3.) Die Werte kann man nun abändern und wieder mit der PDF Datei vereinen. Um das scripting zu vereinfachen habe ich hier die Werte gedreht. /T ist der Feldname /V der Inhalt (Value ?)
In meinem Fall werden die Daten aus einer Oracle Datenbank an ein vbs Skript geschickt was mir die FDF Dateien erzeugt und dann mit der PDF Datei vereint.

%FDF-1.2
%âãÏÓ
1 0 obj 
<<
/FDF 
<<
/Fields [
<< /T (TEST_NAME) /V (Ich bin ein Name im Formular)>>
<< /T (TEST_ADRESSE) /V (Muuuusterway 12,0012412 Irgendwo)>>
]
>>
>>
endobj 
trailer
<<
/Root 1 0 R
>>
%%EOF


Mit diesem Befehl kann man nun die fdf und das PDF Formular zusammenführen und unter neuen Namen abspeichern :
pdftk FORMULAR.pdf fill_form FORMULAR.fdf output FORMULAR_FERTIG.pdf


Bekanntes Problem :

Sollte ein Formular eine gewisse Intelligenz aufweisen , z.B. freischalten von Felder nach anklicken , werden diese Werte nicht sichtbar. Das Feld muss erst manuell angeklickt werden um den Eintrag sichbar zu machen.
Leider blockiert dieser Fehler ca. 10% meiner Formulare aber 90% konnte ich damit automatisch aus der Datenbank befüllen, und die Schreibfehler sind auf null gesunken ;-)

Quelle :

PDFTk download

Excel: Kalenderwoche nach DIN

Problem:
Die Excel-interne Kalenderwochen-Funktion geht nach dem amerikanischen Standard, aber ich lebe in Deutschland!!

Lösung:
Hier einmal die Formel-Lösung:
=KÜRZEN((A1-DATUM(JAHR(A1+3-REST(A1-2;7));1;REST(A1-2;7)-9))/7)


Hier die VBA-Lösung:
Function kalenderwoche_din(Datum As Date) As Integer
''von Christoph Kremer, Aachen
'Berechnt die KW nach DIN 1355
Dim t&
t = DateSerial(Year(Datum + (8 - Weekday(Datum)) Mod 7 - 3), 1, 1)
kalenderwoche_din = (Datum - t - 3 + (Weekday(t) + 1) Mod 7) \ 7 + 1
End Function


Quelle: office-lösungen: Kalenderwoche nach DIN

VBA: Zwischenablage löschen - Beim schließen melde Excel "Bild zu groß..."

Problem:
Beim schließen von Excel mittels Makro bekommt man den Hinweis: "Bild zu groß, kann nicht abgeschnitten werden".
Das Problem ist die Zwischenablage, die noch "voll" ist.
Man möchte nun mittels VBA-Makro die Zwischenablage löschen

Lösung:
Folgendes Makro in den Bereich "Arbeitsmappe" kopieren

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ClearClipboard
end sub

Public Sub ClearClipboard()
OpenClipboard 0&
EmptyClipboard
CloseClipboard
End Sub


Unter "Dekleration" im Modul:
Private Declare Function OpenClipboard& Lib "user32" (ByVal hwnd As Long)
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard& Lib "user32" ()


Quelle: microoft answers: MS Excel 2007 error message - The picture is too large and will be truncated__Not a 'picture' - it's text in MS Excel 2007 that's being copied

Bilder auf Fileserver über VBS mit ImageMagick automatisch verkleinern

Problem :

Welcher Admin kennst das nicht , die Benutzer machen Bilder mit einer 12 MP Kamera und legen die Bilder auch in dieser Auflösung auf dem Fileserver ab. Sicherlich ist das in dem einen oder anderen Fall sinnvoll , jedoch nicht immer. In meinem Fall ist es nicht nötig die Bilder in der höchsten Auflösung zu speichern da diese weder ausgedruckt noch weiterverarbeitet werden. Um die Dateigröße von Anfang an auf ein erträgliches Maß zu reduzieren habe ich dieses Skript erstellt. Es verwendet Imagemagick und benötigt eine Installation auf dem Rechner auf dem das Skript laufen soll.
Dieses Skript läuft bei mir einmal in der Woche um alle Bilder im Ordner und allen Unterordnern zu verkleinern. Es wird ein rekursiver Dateidurchlauf auf die definierte Erweiterung ausgeführt

Dieses Skript stellt folgende Parameter bereit

------------------------------------------------------------------------------------------
-q: = Quelle zum Startordner
-e: = Welche Datei Typen sollen konvertiert werden
-s: = Auflösung der Konvertierten Bilder
-j: = Qualität für die Output Bilder (JPG 1-100 , PNG 1-9)
-l: = Schreibt ein Logfile mit an den angegeben Ort
wenn kein Wert übergeben wird , wird kein Logfile erzeugt
------------------------------------------------------------------------------------------


Download :

ImageMagick
konvPic.vbs

Erklärung :

Um über ImageMagick zu konvertieren muss folgendes Object instanziert werden.
Dim ObjImg  : Set ObjImg = CreateObject("ImageMagickObject.MagickImage.1")


Dies kann dann so angesprochen werden.
ObjImg.Convert QUELLDATEI , "-resize" , AUFLÖSUNG , "-format" , "jpg" , "-quality" , QUALITÄT , ZIELDATEI

man kann auch anstelle von ObjImg.Convert die Funktion ObjImg.Mogrify verwenden. Der Unterschied zwischen .Convert und .Mogrify liegt darin das .Convert eine neue Datei anlegt und .Mogrify die vorhandene überschreibt.

Sollte ein Fehler auftreten das das ActiveX Element nicht erstellt werden kann liegt das daran das entweder die falsche Imagemagick Version installiert ist oder das Skript über den Pfad C:\Windows\SysWOW64\cscript.exe gestartet werden muss.

Outlook VBA: Importieren von mehreren VCF-Dateien in Outlook-Kontakte

Problem:
Sie haben viele Kontakte als VCF-Dateien gespeichert und möchten diese alle in Ihre Outlook-Kontakte importieren. Generell kann man nur eine einzelne VCF-Datei öffrenn und diese dann in den Kontakten speichern, was eventuell sehr aufwendig sein kann, wenn es sich um einige hundert Kontakte handelt.

Lösung:
Hier finden Sie ein Skript, dass im Outlook-VBA verfasst ist, welches alle VCF-Dateien, die im Ordner "C:\VCARDS" liegen, automatsich in die Outlook-Kontakte importiert. Einfach im Outlook ALT+F11 drücken und den Code hineinkopieren und das Skript abstarten.
Hinweis: Die VCF-Dateien werden in den persönlichen Kontakte-Ordner gespeichert. Bitte diesen vorher sichern und leeren, wenn man ein vermischen der Kontakte nicht wünscht.
Selbstverständlich kann der Pfad zu den VCF-Dateien im Skript angepaßt werden.
Ich selbst habe damit 880 VCF-Dateien in mein Outlook problemlos importieren können! Zuvor hatte ich es mit einigen Freetools vergeblich versucht!


Sub OpenSaveVCard()

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsDir = fso.GetFolder("C:\VCARDS")

For Each fsFile In fsDir.Files

strVCName = "C:\VCARDS\" & fsFile.Name
Set objOL = CreateObject("Outlook.Application")
Set colInsp = objOL.Inspectors
If colInsp.Count = 0 Then

Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.Run Chr(34) & strVCName & Chr(34)
DoEvents
Set colInsp = objOL.Inspectors
If Err = 0 Then

Do Until colInsp.Count = 1
DoEvents
Loop

colInsp.Item(1).CurrentItem.Save
colInsp.Item(1).Close olDiscard
Set colInsp = Nothing
Set objOL = Nothing
Set objWSHShell = Nothing

End If

End If

Next

End Sub


Quelle des Skripts: Tech Support Guy Forum: Import multiple .vCard files in Outlook
“Die Organisationen stecken Millionen von Dollars in Firewalls und Sicherheitssysteme und verschwenden ihr Geld, da keine dieser Maßnahmen das schwächste Glied der Sicherheitskette berücksichtigt: Die Anwender und Systemadministratoren.”
Kevin Mitnick