Zum Inhalt springen

Scans archivieren oder: wie bekomme ich PDF-Dateien in eine Hi-Drive? (Teil 1: Grundlagen und Mail)

  • von

In letzter Zeit haben wir an der Uni sehr viele Übungsblätter, Probeklausuren, … bekommen. Aber wer möchte schon jeden Tag viele Seiten mitschleppen, von denen man die meisten sowieso nicht nutzt? Außerdem habe ich sowieso jeden Tag mein Laptop dabei und hätte deshalb gerne Zugriff auf alle Seiten mit meinem Laptop.

Wenn man aber so viele verschiedene Dokumente hat und nicht jeden Nachmittag erstmal Zettel scannen, umbenennen und sortieren möchte, gibt es nicht viele Möglichkeiten. Deshalb habe ich für mich (und vielleicht auch für dich) eine Platform entwickelt, die auf meinem Server läuft und mir einfachen Zugriff auch die Daten gibt. Besonders ist hier, dass die gescannten Dateien automatisch in reinen Text umgewandelt werden, der durchsuchbar ist, und auch die Möglichkeit bieten wird, Dateien aufgrund des Inhalts automatisch sortieren zu lassen.

Voraussetzungen für das System:

  • Internetfähiger Scanner, der e-Mails versenden kann und man den Betreff verändern kann
  • Server, der die Platform hostet, die PDF-Dateien sind hier aber nicht gespeichert (z.B. Raspberrypi)
  • Cloudspeicher mit ausreichen Speicherplatz für die PDF-Dateien (vielleicht auch auf dem Server???)
  • E-Mail Adresse mit IMAP und SMTP

Ich nutze hierfür einen HP Officejet Pro 8600 Plus, und die Strato HiDrive mit dem Protokollpaket. Außerdem einen VServer mit Ubuntu 16.04.3 LTS‬ und Plesk Onyx.

Die Grundlage für dieses System ist das Empfangen von Mails mit PHP dafür habe ich mich stark an folgendem Beitrag orientiert: https://www.sitepoint.com/exploring-phps-imap-library-1/

Damit bin ich zu folgendem Code gekommen:

$imap = imap_open(ServerAddr."INBOX", Username, Passwd);
$numMessages = imap_num_msg($imap);

function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false) {
if (!$structure) {
$structure = imap_fetchstructure($imap, $uid, FT_UID);
}
if ($structure) {
if ($mimetype == get_mime_type($structure)) {
if (!$partNumber) {
$partNumber = 1;
}
$text = imap_fetchbody($imap, $uid, $partNumber, FT_UID);
switch ($structure->encoding) {
case 3: return imap_base64($text);
case 4: return imap_qprint($text);
default: return $text;
}
}

// multipart
if ($structure->type == 1) {
foreach ($structure->parts as $index => $subStruct) {
$prefix = "";
if ($partNumber) {
$prefix = $partNumber . ".";
}
$data = get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
if ($data) {
return $data;
}
}
}
}
return false;
}

function get_mime_type($structure) {
$primaryMimetype = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");

if ($structure->subtype) {
return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype;
}
return "TEXT/PLAIN";
}
function fix_text($str)
{
$subject = '';
$subject_array = imap_mime_header_decode($str);

foreach ($subject_array AS $obj)
$subject .= rtrim($obj->text, "\t");

return $subject;
}$uid = imap_uid($imap, $i);
$header = imap_header($imap, $i);

$subject = fix_text($header->subject);
echo($subject);
$title=$subject;
//echo(getBody($uid, $imap));
$data=get_part($imap,$uid,"APPLICATION/PDF");
if(strlen($data)<10){
echo("Keine gültige Nachricht!
");
continue;
}

Dabei werden immer alle e-Mails in einer Mailbox überprüft. Um zu identifizieren, ob es sich um ein gültiges e-Mail handelt, wird der der Teil aus der Mail extrahiert, der den MIME-Type <code>APPLICATION/PDF</code> besitzt. Wenn dieser Teil mehr als 10 Zeichen beinhaltet, handelt es sich vermutlich um eine gültige Mail. Der Inhalt dieses Teils wird dann direkt gespeichert:

 file_put_contents("tmp/$title.pdf",$data); 

 

Wie diese Datei dann weiterverarbeitet wird, seht ihr im 2. Teil.

 

Noch ein kurzes Wort zur Ordnerstruktur:

Ich habe mich dazu entschieden, das Backend in einen Unterordner auszulagern und nur das Frontend direkt im Stammverzeichnis des Webservers zu speichern. Außerdem existiert noch ein Unterordner für das Zwischenspeichern der Dateien.

 

Schlagwörter:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert