Ciao,
Ho una cartella contenente oltre 100 PDF, tutti presentati in un formato coerente. Il nome del file di ciascun PDF rappresenta un numero di batch che desidero utilizzare e in ciascun PDF è presente una particolare tabella di dati che desidero estrarre.
Il mio obiettivo è estrarre la stessa tabella di dati per ogni PDF, quindi concatenare tutte le tabelle di dati estratte, contrassegnate dal nome del file PDF (numero di batch). Infine voglio dividere le colonne nella tabella concatenata e raggrupparle in base al nome del file PDF per ottenere una tabella finale.
Ho provato a farlo manualmente e riesco ad arrivare alla tabella finale di cui ho bisogno, tuttavia è estremamente dispendioso in termini di tempo poiché devo aprire e selezionare la tabella in ogni PDF separatamente.
Pertanto, mi chiedo se esiste qualche JSL che sarà in grado di aiutare in questo?
Sono molto nuovo nello scripting ma sono riuscito a creare uno script che mi dà esattamente ciò di cui ho bisogno per i primi due file PDF:
//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)Devo adattare questo script per aprire tutti i file PDF (non solo i primi due) per creare la tabella finale dei dati, contrassegnata dal nome del file PDF.
C'è qualcuno che può aiutarmi?
Grazie molto,
Alicia
Enorme grazie @Craige_Hales E @Georg per il tuo aiuto. Proverò a vedere se riesco ad adattare la sceneggiatura. Molto apprezzato!
Ecco un esempio che contiene i passaggi necessari. Il posto di @Craige_Hales aiuta a capire come funzionano queste cose.
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")
);Se ne hai due funzionanti, inserisci il codice Concatenare tabelle di dati probabilmente ti porterà lì. FilesInDirectory() potrebbe essere la funzione di cui hai bisogno.
Esistono numerosi esempi simili; la ricerca dei file nella directory probabilmente li troverà.
Chiedi di nuovo se questo non ti porta lì, penso che tu sia vicino.