C#: Vorhandene PDFs mit Meta-Tags / Attributen versehen

Wer pflegt schon gerne Meta-Tags bei Dokumenten? Keiner. Es wird vergessen, es wird nur ungern getan und wenn überhaupt, sind die Daten alles andere als brauchbar. Doch gerade Suchmaschinen werten diese Meta-Daten gewissentlich aus und nehmen diese Daten in ihren Suchindex auf. Also ist es an der Zeit, in einem Intranet oder auf der eigenen Webpräsenz die vorhandenen PDFs zu aktualisieren. Beim vorhandenen Projekt konnten gewisse Tags wie „Autor“, „Titel“ und einige Keywords aus einer Datenbank abgefragt werden, so dass nur noch das PDF mit den übergebenen Daten aktualisiert werden musste. Weitere Aufgabenstellung: Das PDF sollte nicht neu generiert und das Dateidatum sollte nicht geändert werden. Um es vorweg zu nehmen. Nicht alles konnte so eingehalten werden.PDFs mit neuen Meta-Tags zu versehen ist per C# nicht machbar. Es gibt jedoch ein Open Source-Projekt namens „pdftk“, das ein kostenloses Kommandozeilentool zur Verfügung stellt, über das die Meta-Tags ausgelesen und neu beschrieben werden können. Jedoch wird dabei ein neues PDF erstellt. Weitere Informationen über „pdftk“ finden sie im Internet. Laden sie sich die kleine Exe herunter und speichern sie diese am besten im Windows/System32-Ordner. Dann haben sie stndig Zugriff auf die Datei.Zur Funktion: Wir übergeben einen Pfad und einen PDF-Namen an die Funktion. Ferner unsere Meta-Tags.Im ersten Schritt fügen wir den PDF-Pfad zusammen und lesen das Dateidatum des PDFs für die spätere Wiederherstellung aus. Dann kommt „pdftk“ zum Einsatz. Es fordert eine kleine Textdatei mit bestimmten Aufbau für die aktualisieren der Meta-Daten (näheres finden Sie in der Doku von „pdftk“). Wir lesen die Original-Meta-Daten nicht aus, sondern erzeugen gleich eine Textdatei mit den Meta-Daten. Achtung: Auch hier sind die Umlaute ein Problem. Sie werden über eine separate Funktion in Hex umgeschlüsselt.Wenn die Text-Datei erzeugt ist, wird per Commandozeile „pdftk“ angesprochen. Der Commandozeile wird der PDF-Originalname, das Textfile, einige Parameter und der Ausgabe-Dateiname („NEW_“) übergeben. Damit legt das Tool los und erzeugt ein neues PDF.Nach getaner Arbeit löschen wir das Original-PDF, benennen das neue PDF mit dem alten Namen um und versehen es mit dem Original-Dateidatum. Und fertig sind die suchmaschinenoptimierten Meta-Tags für das PDF.

private static void pdf_attribut(string sPfad, string sPDFQuellname, string sTitle, string sAuthor, string sSubject, string sKeywords)
{

try
  {
   //Pfad hinzufügen
   string sOriginalname = sPDFQuellname;
   sPDFQuellname = sPfad + sPDFQuellname;
  
   //Prüfe Datei und speichere das Dateidatum
   System.IO.FileInfo file = null;
   file = new System.IO.FileInfo(sPDFQuellname);               
   string sAltesDatum = file.LastWriteTime.ToString();               
   Console.WriteLine("Datei " + sPDFQuellname + " hat das Dateidatum: " + sAltesDatum);               

   //Erzeuge die pdf-info-Datei               
   string sPDFInfoFilename = @"pdfinfo.txt";               
   StreamWriter myWriter = File.CreateText(sPDFInfoFilename);               
   myWriter.WriteLine("InfoKey: Title");               
   myWriter.WriteLine(SetUmlaute("InfoValue: " + sTitle));               
   myWriter.WriteLine("InfoKey: Author");               
   myWriter.WriteLine(SetUmlaute("InfoValue: " + sAuthor));               
   myWriter.WriteLine("InfoKey: Subject");               
   myWriter.WriteLine(SetUmlaute("InfoValue: " + sSubject));               
   myWriter.WriteLine("InfoKey: Keywords");               
   myWriter.WriteLine(SetUmlaute("InfoValue: " + sKeywords));               
   myWriter.Close();               

   //Erzeuge das neue PDF               
   string sCommand = "";               
  
   //Pfad zur Exe von pdftk    
   string sPfad_pdftk = "c:pdftk.exe";               
   sCommand = sPDFQuellname + " update_info " + sPDFInfoFilename + " output  " + sPfad + "NEW_" + sOriginalname;               

   //Command zur Erstellung des neuen PDF               
   ProcessStartInfo info = new ProcessStartInfo(sPfad_pdftk, sCommand);               
   Process p = Process.Start(info);               
   p.WaitForExit();               
   Console.WriteLine("Neues PDF für " + sPDFQuellname + " erstellt. Result: " + p.ExitCode + " (0=OK)");               

   //Lösche die Originaldatei               
   file.Delete();               
   Console.WriteLine("Originaldatei gelöscht.");                               

   //Neues PDF auf alten Namen umnennen               
   File.Move(sPfad + "NEW_" + sOriginalname, sPDFQuellname);               
   Console.WriteLine("Originaltitel wiederhergestellt.");               

   //Altes Datum der neuen Datei verpassen               
   file = new System.IO.FileInfo(sPDFQuellname);               
   DateTime altesdatum = DateTime.Parse(sAltesDatum);               
   file.LastWriteTime = altesdatum;               
   Console.WriteLine("Originaldatum wiederhergestellt.");           
 }           
 catch (Exception ex)           
 {               
  Console.WriteLine("FEHLER in pdf_attribut bei Datei: " + sPDFQuellname);               
  logfile("FEHLER in pdf_attribut bei Datei: " + sPDFQuellname);           

 }
}

private static string SetUmlaute(string value)       
{           
  value = value.Replace("ü", "ü");           
  value = value.Replace("ä", "ä");           
  value = value.Replace("ö", "ö");           
  value = value.Replace("ß", "ß");           
  value = value.Replace("ü", "Ü");           
  value = value.Replace("ö", "Ö");           
  value = value.Replace("ä", "Ä");           
  return value;       
}

Schreibe einen Kommentar