Juni 20, 2022

PythonDF

PDF hacking in Python

Weiterlesen
März 17, 2022

Typeisch C#

Lovely ArrayList

Weiterlesen
Februar 19, 2021

Fun with Excel - Heute: Das liebe Komma

Excel Formeltrenner unterschied C# zur Exceloberfläche

Weiterlesen
Cover Image

PythonDF

PDF hacking in Python

Juni 20, 2022 - Lesezeit: 11 Minuten

Das PDF Format ist ein hervorragendes Format um Dokumente nicht nur per Email zu transportieren, sondern auch zum Drucken oder Archivieren. Die Unterstützung dieses Formats ist inzwischen so ziemlich überall verfügbar. Daher ist es naheliegend, dass auch Symolo dieses Format vollständig unterstützt. Intern wird zum Beispiel jeder einzelne Druckauftrag zuerst als PDF abgebildet und dann an den Drucker weitergereicht. Das bedeutet, dass immer die Möglichkeit zur Verfügung steht, dass gegebenenfalls das Dokument auch nur gespeichert wird oder zusätzlich als Archiveintrag hinterlegt werden kann. Zudem ist das zu erwartende Druckbild immer schon vorher ersichtlich. C# bietet hier schon seit langem Bibliotheken, die aus Java übernommen wurden. Jetzt ist es immer recht aufwendig in C# einfache Aufgaben mit PDFs zu erledigen, da dann immer erstmal ein komplettes Projekt aufgemacht werden muss und wir die ganzen großartigen Typenprüfungen haben. Mit Python kann man meistens schneller ein Prototyp entwickeln und die Logik grundsätzlich mal prüfen, bevor das Ganze dann sauber als C# in den Symoloserver wandert. Alternativ kann man natürlich auch das Python in de Server verfrachten und nutzen. Dazu ist gar nicht so viel notwendig.

Wie immer geht es mit entsprechenden Bibliotheken los:

import pdfplumber
from PyPDF2 import PdfFileWriter, PdfFileReader  # pip install PyPDF2

Plumber wird hierbei für die Analyse verwendet und PyPDF2 für die Verwaltung der Datei.

Fangen wir mal mit der Verwaltung an. Möchte man z.B. die Dateien in einzelne Seiten splitten ist das jetzt ganz einfach:

infile = "<myFile>.pdf"

input_pdf = PdfFileReader(open(infile, "rb"))

counter = 0

for p in input_pdf.pages:
    outfile = "data/Output_" + str(counter) + ".pdf"
    output_file = open(outfile, "wb")
    output = PdfFileWriter()
    output.addPage(p)
    counter += 1
    output.write(output_file)

Die Analyse des Inhaltes kann, mithilfe von pdfplumber, genauso einfach erfolgen:

FileToUse = "<myFileToUse>.pdf"  # sys.argv[1]

pdfText = ""

with pdfplumber.open(FileToUse) as pdf:

    for page in pdf.pages:
        pdfText += page.extract_text()

print(pdfText)

Und schon kann man die Text zum Beispiel mithilfe von Regex einfach analysieren und Informationen aus den Dateien gewinnen.

Hier sollte vielleicht noch erwähnt werden, dass das Verfahren so nicht auf Bilder in PDFs anwendbar ist. Entweder ist die PDF Datei einen elektronisch erstellte Datei oder es wurde nachträglich entsprechende OCR Daten angefügt. Für einen schnellen Test ist dieses Verfahren aber mehr als ausreichend. Wenn eine OCR Analyse benötigt wird, bringt der Symoloserver dafür bereits passende Funktionen mit. Da der Server ja unkompliziert via Python angesprochen werden kann, ist auch dann immer noch ein schnelles Prototypen unkompliziert realisierbar.


Cover Image

Typeisch C#

Lovely ArrayList

März 17, 2022 - Lesezeit: ~1 Minute

Arraylist ist der tollste Datentyp überhaupt. Ich mag normale Arrays. Wie machen wir da jetzt ein draus. Ganz einfach:

ArrayList newList = new ArrayList();
newList.Add("1");
newList.Add("2");
string[] ParamNameListArray = (string[])newList.ToArray(typeof(string));
object[] ParamDataListArray = (object[])newList.ToArray(typeof(object));
Console.WriteLine(ParamNameListArray);
Console.WriteLine(ParamDataListArray);

C# und die Typen. Wenn man fast nur noch in JavaScript unterwegs ist, ist das schon fast eine Tortur.


Cover Image

Fun with Excel - Heute: Das liebe Komma

Excel Formeltrenner unterschied C# zur Exceloberfläche

Februar 19, 2021 - Lesezeit: ~1 Minute

Bei Excel wird bei den Trennoperatoren ein Unterschied zwischen der Oberfläche und Quellcode in Open.Xml gemacht.

QuellCode:

   SUM(A1 , A2)

Oberfläche:

   SUM(A1 ; A2)

In der Öberfläche wird ein Strichpunkt (;) erwartet. Im Quellcode ein Komma (,).