Zellen aus PDF-Dokument auslesen und in Excel-Datei übertragen
Hallo liebe Forenuser,
ich habe ein ausfüllbares PDF-Dokument erstellt.
Dort können in einem Bereich verschiedene Einträge gemacht werden (Zahlen und Euro-Werte).
Hier der Screenshot dazu:
Die Daten aus diesen Feldern (der Screenshot ist nur ein Ausschnitt - es geht nach unten noch weiter) sollen dann in eine Excel-Datei übernommen werden. Dort haben die jeweiligen Spalten die gleiche Überschrift, wie im PDF-Dokument.
Beispielsweise könnte man die jeweilige PDF-Datei dann auf dem Desktop speichern... immer unter dem gleichen Namen.
Dann könnte es vielleicht einen Script-Button ebenfalls auf dem Desktop geben, mit dem man die Daten dann überträgt.
Wäre es möglich, diese Daten irgendwie automatisiert (z.B. per Script etc.) in die Excel-Datei zu übernehmen?
Und wenn ja... könnt Ihr mir bei der Erstellung eines solchen Scripts helfen?
Freue mich auf Eure Antwort.
Grüße,
BN
ich habe ein ausfüllbares PDF-Dokument erstellt.
Dort können in einem Bereich verschiedene Einträge gemacht werden (Zahlen und Euro-Werte).
Hier der Screenshot dazu:
Die Daten aus diesen Feldern (der Screenshot ist nur ein Ausschnitt - es geht nach unten noch weiter) sollen dann in eine Excel-Datei übernommen werden. Dort haben die jeweiligen Spalten die gleiche Überschrift, wie im PDF-Dokument.
Beispielsweise könnte man die jeweilige PDF-Datei dann auf dem Desktop speichern... immer unter dem gleichen Namen.
Dann könnte es vielleicht einen Script-Button ebenfalls auf dem Desktop geben, mit dem man die Daten dann überträgt.
Wäre es möglich, diese Daten irgendwie automatisiert (z.B. per Script etc.) in die Excel-Datei zu übernehmen?
Und wenn ja... könnt Ihr mir bei der Erstellung eines solchen Scripts helfen?
Freue mich auf Eure Antwort.
Grüße,
BN
Please also mark the comments that contributed to the solution of the article
Content-ID: 668689
Url: https://administrator.de/contentid/668689
Printed on: November 13, 2024 at 11:11 o'clock
13 Comments
Latest comment
Leider geht es da oft um den umgekehrten Weg - also Exceldaten nach PDF.
Öhm, nö, hier steht es doch auch in der Richtung die du willstDas ganze auch in die andere Richtung PDF-Formularfelder => CSV
Servus,
Schau mal ob die folgenden PowerShell Skripte passen. Die erste Variante arbeitet mit dem Excel Com-Object und setzt ein installiertes Office mit Excel voraus, die zweite Variante weiter unten nutzt das "ImportExcel" Powershell Modul was kein installiertes Office benötigt.
Die iTextSharp.dll wird wenn das Skript gespeichert wurde einmalig in den Ordner des Skripts heruntergeladen und von dort geladen. Das lässt sich aber nach belieben anpassen.
Beide Versionen basieren auf den Inhalten deiner bereitgestellten Testdateien.
Zusätzlich kann ich folgenden Beitrag empfehlen wenn es mal nicht um Formularfelder in PDF Dateien geht
Powershell: Text anhand seiner Position aus PDF-Dokumenten auslesen
Viel Spaß damit.
Grüße Uwe
Schau mal ob die folgenden PowerShell Skripte passen. Die erste Variante arbeitet mit dem Excel Com-Object und setzt ein installiertes Office mit Excel voraus, die zweite Variante weiter unten nutzt das "ImportExcel" Powershell Modul was kein installiertes Office benötigt.
Die iTextSharp.dll wird wenn das Skript gespeichert wurde einmalig in den Ordner des Skripts heruntergeladen und von dort geladen. Das lässt sich aber nach belieben anpassen.
Beide Versionen basieren auf den Inhalten deiner bereitgestellten Testdateien.
# Variablen bitte anpassen ---------------------------
# Pfad zur PDF Datei
$sourcefile = "C:\data\quelle.pdf"
# Pfad zum Excel-Template
$templatefile = "c:\data\template.xlsx"
# ------------------------------------------------------
$ErrorActionPreference = 'Stop'
# Funktion zum Laden des iTextSharp Assemblies
function Load-iTextLibrary {
if($psscriptroot -ne ''){
$localpath = join-path $psscriptroot 'itextsharp.dll'
}else{
$localpath = join-path $env:TEMP 'itextsharp.dll'
}
$zip = $null;$tmp = ''
try{
if(!(Test-Path $localpath)){
Add-Type -A System.IO.Compression.FileSystem
$tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"
write-host "Downloading and extracting required 'iTextSharp.dll' ... " -F Green -NoNewline
(New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/iTextSharp/5.5.13.1', $tmp)
$zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
$zip.Entries | ?{$_.Fullname -eq 'lib/itextsharp.dll'} | %{
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
}
write-host "OK" -F Green
}
if (Get-Item $localpath -Stream zone.identifier -ea SilentlyContinue){
Unblock-File -Path $localpath
}
Add-Type -Path $localpath
}catch{
throw "Error: $($_.Exception.Message)"
}finally{
if ($zip){$zip.Dispose()}
if ($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}
}
}
# iText Library laden
Load-iTextLibrary
# auch geschütze PDFs öffnen aktivieren
[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true
$reader = $null; $xl = $null
try {
# Excel Object erstellen
$xl = New-Object -Com Excel.Application -P @{Visible = $false}
# workbook öffnen
$wb = $xl.Workbooks.Open($templatefile)
# wir arbeiten auf dem ersten Arbeitsblatt
$ws = $wb.Sheets.Item(1)
write-host "Exportiere Daten aus '$($sourcefile)' ... " -F Green -NoNewline
# PDF Reader Object erstellen
$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile
# Gesamtergebnisse aus dem PDF in die entsprechenden Felder der Exceldatei übertragen
$ws.Range("E7").Value = $reader.AcroFields.GetField("GESAMT")
$ws.Range("I4").Value = $reader.AcroFields.GetField("GESAMT_2")
$ws.Range("B10").Value = $reader.AcroFields.GetField("GESAMT_3")
$ws.Range("K7").Value = $reader.AcroFields.GetField("GESAMT_4")
# Arbeitsmappe speichern und schließen
$wb.Save();$wb.Close($true)
# reader schließen und ressourcen freigeben
$reader.Close(); $reader.Dispose()
}catch{
write-host $_.Exception.Message -F Red
}finally{
# cleanup
if($reader){$reader.Dispose()}
# Excel schließen
$xl.Quit()
# release com resources
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($xl)
}
Variante mit "ImportExcel" Modul (Powershell-Modul wird für den aktuellen User installiert, falls es noch nicht vorhanden ist)
# Variablen bitte anpassen ---------------------------
# Pfad zur PDF Datei
$sourcefile = "C:\data\quelle.pdf"
# Pfad zum Excel-Template
$templatefile = "c:\data\template.xlsx"
# ------------------------------------------------------
$ErrorActionPreference = 'Stop'
# install ImportExcel module
If(!(Get-Module -ListAvailable -Name ImportExcel)){
write-host "Installing 'ImportExcel' module ..." -F Green
Install-Module -Name ImportExcel -Scope CurrentUser -Force
}
# Funktion zum Laden des iTextSharp Assemblies
function Load-iTextLibrary {
if($psscriptroot -ne ''){
$localpath = join-path $psscriptroot 'itextsharp.dll'
}else{
$localpath = join-path $env:TEMP 'itextsharp.dll'
}
$zip = $null;$tmp = ''
try{
if(!(Test-Path $localpath)){
Add-Type -A System.IO.Compression.FileSystem
$tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"
write-host "Downloading and extracting required 'iTextSharp.dll' ... " -F Green -NoNewline
(New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/iTextSharp/5.5.13.1', $tmp)
$zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
$zip.Entries | ?{$_.Fullname -eq 'lib/itextsharp.dll'} | %{
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
}
write-host "OK" -F Green
}
if (Get-Item $localpath -Stream zone.identifier -ea SilentlyContinue){
Unblock-File -Path $localpath
}
Add-Type -Path $localpath
}catch{
throw "Error: $($_.Exception.Message)"
}finally{
if ($zip){$zip.Dispose()}
if ($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}
}
}
# iText Library laden
Load-iTextLibrary
# auch geschütze PDFs öffnen aktivieren
[iTextSharp.text.pdf.PdfReader]::unethicalreading = $true
$reader = $null; $xl = $null
try {
# Excelmappe öffnen
$xl = Open-ExcelPackage -Path $templatefile
# Benutze das erste Arbeitsblatt für die Ausgabe
$ws = $xl.Workbook.Worksheets[1]
write-host "Exportiere Daten aus '$($sourcefile)' ... " -F Green -NoNewline
# PDF Reader Object erstellen
$reader = New-Object iTextSharp.text.pdf.PdfReader $sourcefile
# Gesamtergebnisse aus dem PDF in die Exceldatei übertragen
$ws.Cells['E7'].Value = [int]$reader.AcroFields.GetField("GESAMT")
$ws.Cells['I4'].Value = [int]$reader.AcroFields.GetField("GESAMT_2")
$ws.Cells['B10'].Value = [int]$reader.AcroFields.GetField("GESAMT_3")
$ws.Cells['K7'].Value = [int]$reader.AcroFields.GetField("GESAMT_4")
# reader schließen und ressourcen freigeben
$reader.Close(); $reader.Dispose()
}catch{
write-host $_.Exception.Message -F Red
}finally{
# cleanup
if($reader){
$reader.Dispose()
}
# close excel session
if($xl){
Close-ExcelPackage -ExcelPackage $xl
}
}
Zusätzlich kann ich folgenden Beitrag empfehlen wenn es mal nicht um Formularfelder in PDF Dateien geht
Powershell: Text anhand seiner Position aus PDF-Dokumenten auslesen
Viel Spaß damit.
Grüße Uwe
Korrekt.
Müssen die 3 Dateien (PDF, Excel, Powershell) alle im selben Verzeichnis liegen?
Nein, du kannst die Pfade in den Variablen im Kopf des Skriptes an deine Bedürfnisse anpassen.Nur frage ich mich, wo die Bereiche angegeben wurden, aus denen die PDF-Inhalte genommen werden? Dazu habe ich nichts gefunden. Ggf. würde ich die gerne erweitern können... deshalb frage ich.
Da es sich bei deinem PDF Dokument um ein Formular mit richtigen Eingabefeldern handelt sind diese ganz einfach über deren eindeutige Bezeichnung abrufbar. Jedes Formularfeld hat also einen eindeutigen Bezeichner im Dokument und dessen Daten können damit abgefragt werden$reader.AcroFields.GetField("GESAMT")
Die Bezeichner der Formular-Felder kannst du dir mit dem Auswahl-Tool in Acrobat&Co. anzeigen lassen, oder in dem du in den Formular Editier-Modus wechselst.
Das sind zwei ganz unterschiedliche Baustellen, der andere Beitrag behandelt PDFs die ohne Formularfelder daher kommen.
In deinem Fall ist es aber einfach da du benannte Formularfelder hast, da brauchst du keine Seitenzahlen, denn sämtliche Formularfelder ein und des selben Dokuments haben eindeutige Namen.
Mehr Support gibt es dazu von meiner Seite nur noch auf PN-Anfrage. Ich kann dir hier ja nicht sämtliche Grundlagen dazu beibringen .
In deinem Fall ist es aber einfach da du benannte Formularfelder hast, da brauchst du keine Seitenzahlen, denn sämtliche Formularfelder ein und des selben Dokuments haben eindeutige Namen.
Mehr Support gibt es dazu von meiner Seite nur noch auf PN-Anfrage. Ich kann dir hier ja nicht sämtliche Grundlagen dazu beibringen .