Hi,
Ich habe einen Ordner mit über 100 PDFs, alle in einem einheitlichen Format. Der Dateiname jedes PDFs stellt eine Chargennummer dar, die ich verwenden möchte, und in jedem PDF gibt es eine bestimmte Datentabelle, die ich extrahieren möchte.
Mein Ziel ist es, für jedes PDF die gleiche Datentabelle zu extrahieren und dann alle extrahierten Datentabellen zu verketten und sie mit dem PDF-Dateinamen (Chargennummer) zu kennzeichnen. Schließlich möchte ich die Spalten in der verketteten Tabelle aufteilen und sie nach PDF-Dateinamen gruppieren, um am Ende eine endgültige Tabelle zu erhalten.
Ich habe versucht, dies manuell zu tun, und komme zu der endgültigen Tabelle, die ich brauche. Allerdings ist es äußerst zeitaufwändig, da ich die Tabelle in jedem PDF einzeln öffnen und auswählen muss.
Daher frage ich mich, ob es eine JSL gibt, die dabei helfen kann?
Ich bin ein Neuling in der Skripterstellung, konnte aber ein Skript erstellen, das mir genau das gibt, was ich für die ersten beiden PDF-Dateien benötige:
//Opening up the first two files (Batch Number 1 & Batch Number 2) from the folder
Open(
"C:\Example folder\Batch 1.pdf",
PDF Tables(
Table(
table name( "Batch 1" ),
add rows( page( 1 ), Rect( 0.4143, 5.3995, 7.5889, 6.6781 ) )
)
)
)
;
Open(
"C:\Example folder\Batch 2.pdf",
PDF Tables(
Table(
table name( "Batch 2" ),
add rows( page( 1 ), Rect( 0.4143, 5.3995, 7.5889, 6.6781 ) )
)
)
)
;
//Concatenating the data for the first 2 batches into one table and adding a source column:
Data Table( "Batch 1" ) << Concatenate(
Data Table( "Batch 2" ),
Create source column,
Output table("Concat")
)
;
//Splitting by the concatenated table by the Characteristic column and grouping by source column (batch number) to create a Final table:
Data Table( "Concat" ) << Split(
Split By( :Characteristic ),
Split( :Value ),
Group( :Source Table ),
Remaining Columns( Drop All ),
Sort by Column Property,
Output table("Final")
)
;
//Close all other tables
Close("Batch 1", no save)
;
Close("Batch 2", no save)
;
Close("Concat", no save)Ich muss dieses Skript anpassen, um alle PDF-Dateien (nicht nur die ersten beiden) zu öffnen und die endgültige Datentabelle zu erstellen, die mit dem PDF-Dateinamen gekennzeichnet ist.
Gibt es jemanden, der mir helfen kann?
Vielen Dank,
Alicia
Vielen Dank @Craige_Hales Und @Georg für deine Hilfe. Ich werde versuchen, das Drehbuch anzupassen. Sehr geschätzt!
Hier ist ein Beispiel, das die Schritte enthält, die Sie benötigen. Der Beitrag von @Craige_Hales hilft zu verstehen, wie diese Dinge funktionieren.
Names Default To Here( 1 );
// Prepare a directory
tempdir = "$TEMP\pdf_test";
If( !Directory Exists( tempdir ),
Create Directory( tempdir ),
file_lst = Files In Directory( tempdir );
For( i = 1, i <= N Items( file_lst ), i++,
Delete File( tempdir || "/" || file_lst[i] )
);
);
// Open sample Table
cdt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Prepare PDF's
For( i = 1, i <= 10, i++,
jrn = cdt << Journal;
jrn << save pdf( tempdir || "/" || Char( i ) || "_Big Class.pdf" );
jrn << close window;
);
// Read PDF's
file_lst = Files In Directory( tempdir );
table_lst = {};
For( i = 1, i <= N Items( file_lst ), i++,
Insert Into( table_lst, Open( tempdir || "/" || file_lst[i], PDF All Tables() ) )
);
// Concat PDF's
If( N Items( table_lst ) > 1,
result_table = table_lst[1] << concatenate( table_lst[2 :: N Items( table_lst )], Output Table( "ResultTable" ), Create Source Column )
);
// Close single PDF's
For( i = 1, i <= N Items( table_lst ), i++,
Close( table_lst[i], noSave )
);
split_table = result_table << Split(
Split By( :sex ),
Group( :Source Table ),
Split( :age ),
Remaining Columns( Drop All ),
Sort by Column Property, output table("Split_Result")
);Wenn zwei funktionieren, ist der Code eingefügt Verketten Sie Datentabellen wird dich wahrscheinlich dorthin bringen. FilesInDirectory() könnte die Funktion sein, die Sie benötigen.
Es gibt eine Reihe ähnlicher Beispiele; Wenn Sie im Verzeichnis nach Dateien suchen, werden Sie diese wahrscheinlich finden.
Fragen Sie noch einmal, wenn Sie damit nicht weiterkommen, ich denke, Sie sind nah dran.