Daten|teiler
Kopieren als Kulturtechnik

Ein Powershell-Modul konvertiert PDFs zu Text

3. Dezember 2012 von Christian Imhorst

Die Powershell bietet von sich aus leider keine Möglichkeit, den Text aus einer PDF-Datei zu ziehen, um ihn weiterzuverarbeiten. Deshalb habe ich mir selber ein Modul gebastelt, das diese Arbeit übernimmt. Damit die Umwandlung funktioniert, benötigt man allerdings ein externes Tool wie pdftotext.exe, zum Beispiel aus den Poppler-Utils. Nur bieten die Poppler-Entwickler selbst keine ausführbare Datei für Windows an. Also muss man entweder selber den Compiler anwerfen, was den Vorteil hat, dass man eine aktuelle Version erstellen kann, oder eine fertige Datei herunterladen, in diesem Fall die Version 0.15 der Poppler-Utils.

Die Datei pdftotext.exe wird zusammen mit dem Powershell-Modul ConvertFromPDF.psm1, das die unten stehende Funktion ConvertFrom-Pdf enthält, in das Verzeichnis ConvertFromPDF kopiert. Bis auf die Endung muss der Name der Modul-Datei mit dem des -Verzeichnisses identisch sein.

Function ConvertFrom-Pdf {
 
<#  
.SYNOPSIS  
This function converts PDFs to text 
 
.DESCRIPTION  
The function has one parameter which is mandatory: 
-pdfs .\path\to\file.pdf 
 
The following parameter is optional:
-vebose 
 
.EXAMPLE 
ConvertFrom-Pdf -pdfs first-file.pdf
 
Convert a PDF file to text.
 
.EXAMPLE 
ConvertFrom-Pdf -pdfs first-file.pdf, second-file.pdf
 
Convert two or more PDF files to text.
 
.EXAMPLE 
ConvertFrom-Pdf -pdfs first-file.pdf -verbose
 
Show verbose output.
#> 
 
[cmdletbinding()]
 
param(
[Parameter(Mandatory=$true)][String[]] $pdfs,
[switch]$VerboseDetail
)
 
# Get path to pdftotext.exe
$modulepath = (get-module -list -name ConvertFromPDF).path
$convertfrompdfpath = Split-Path ($modulepath)
$pdftotext = "$convertfrompdfpath\pdftotext.exe"
 
# Convert PDFs to text
foreach($pdf in $pdfs){
   $cmd="$pdftotext $pdf"
   $pdf_file=Split-Path ($pdf) -leaf -resolve
   $text_file=$pdf_file.Replace( '.pdf', '.txt')
   Write-Verbose "Convert $pdf_file to $text_file"
   Invoke-Expression $cmd 
}
} # End function

Der Ordner muss anschließend in ein Modulverzeichnis der Powershell kopiert werden. Um die Speicherorte für Powershell-Module herauszufinden, kann man folgenden Befehl benutzen:

Write-Host $env:PSModulePath
C:\Users\Benutzer\Documents\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

Wenn man das Modul zu den anderen Modulen in das System-Verzeichnis der Powershell kopiert, kann man es anschließend mit folgendem Aufruf importieren:

Import-Module ConvertFromPDF

Kopiert man das Modul allerdings in das Benutzer- oder irgendein anderes Verzeichnis, muss man es mit dem vollständigen Pfad aufrufen, zum Beispiel:

Import-Module C:\Pfad\zu\Modul\ConvertFromPDF

Nachdem man das Modul in der Powershell importiert hat, erfährt man mehr über die Funktion ConvertFrom-PDF, wenn man die Hilfe aufruft:

Get-Help ConvertFrom-PDF -Examples

Dabei kann man feststellen, dass man eine ganze Reihe von PDF-Dateien zum Besipiel mit diesem Aufruf in Text-Dateien umwandeln kann:

ConvertFrom-Pdf -pdfs first-file.pdf, second-file.pdf -verbose

Der Parameter für die PDF-Datei oder -Dateien ist -pdfs, wobei mehrere Dateien durch ein Komma getrennt werden. Wenn man es genauer wissen will, benötigt man zusätzlich noch den Parameter -verbose. Der erste Parameter wird im Skript mit param definiert, für die Verbose-Ausgabe folgt ein Switch, der benötigt allerdings recht am Anfang des Skripts folgende Zeile:

[CmdletBinding()]

Die Zeile muss als erste Zeile, gleich nach allen einleitenden Kommentaren, oder auch als erste Zeile in eine Funktion eingefügt werden. Das Skript wird danach automatisch um die zwei neuen Parameter -verbose und -debug erweitert. Weiter unten im Skript gibt dann der Befehl Write-Verbose die dazugehörige Information aus.

Das Modul kann man aber auch hier herunterladen und zum Beispiel in das Modul-Verzeichnis C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ entpacken.

Geschrieben in Open Source, Powershell, Windows