JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Opérations sur des fichiers PDF Jeu 24 Juil 2014 - 18:56 | |
| J'ouvre un sujet à part pour ne pas polluer celui de ygeronimi sur l'OCR, mais ce XPDF est vraiment un ensemble d'utilitaires PDF très simple à utiliser et très performant. C'est gratuit, sans installation, on peut le mettre où on veut (c'est portable). Et on n'essaye pas de vous fourguer discrètement un moteur de recherche bidon, rien, tout est clair. Et surtout, pour nous, les modules se lancent en ligne de commande, sans interface graphique, donc facilement depuis un programme Panoramic. http://www.foolabs.com/xpdf/download.html , prendre la version xpdfbin-win-3.04.zipAprès dézippage on se retrouve avec un répertoire de modules et un répertoire de docs correspondantes, une par module, plus quelques bricoles inutiles, perso j'ai tout mis ensemble (modules et docs) dans un répertoire dédié. Les modules: - pdfbklt fabrication d'un livret à partir du pdf (celui-ci non compris dans la livraison)- pdfdetach extraction des fichiers inclus dans le pdf - pdffonts liste des fontes utilisées - pdfimages extraction des images incluses - pdfinfo infos diverses sur le pdf - pdftohtml conversion pdf html - pdftopng conversion pdf en images .png (une image par page) - pdftoppm conversion pdf en fichiers ppm (un par page) - pdftops conversion pdf en fichier postscript - pdftotext conversion pdf en texte pur J'ai fait un petit programme qui donne la liste des modules, pour chacun on peut afficher la doc correspondante (il y a d'assez nombreux paramètres, souvent semblables d'un module à l'autre), et le lancer en donnant les options éventuelles, le chemin du pdf et celui du résultat, qui peut être un fichier, un répertoire, ou un affichage. Je les ai tous essayés sans options, ça marche très bien, c'est rapide. Avec les options on doit peaufiner le résultat, mais je n'ai pas (encore ?) eu le courage de m'y plonger. Je vous livre le programme, un peu simpliste mais ça marche (comme d'habitude les chemins de fichier en tête sont à changer éventuellement, il y en a deux): - Code:
-
' Utilitaires de traitement PDF (XPDF) ' - pdfbklt fabrication d'un livret à partir du pdf ' - pdfdetach extraction des fichiers inclus dans le pdf ' - pdffonts liste des fontes utilisées ' - pdfimages extraction des images incluses ' - pdfinfo infos diverses sur le pdf ' - pdftohtml conversion pdf html ' - pdftopng conversion pdf en images .png (une image par page) ' - pdftoppm conversion pdf en fichiers ppm (un par page) ' - pdftops conversion pdf en fichier postscript ' - pdftotext conversion pdf en texte pur LABEL Doc, Test, Chf, Vpdf, Exec, Vres DIM rp$, f$, fr$, ftm$, p$, i%, l%, a$, b$, arg$, li%, tl%, wl%, resrep$, sf$
rp$ = "C:\OUTILS\PDF\XPDF": ' Chemin des modules de XPDF ftm$ = "C:\TEMP\Result.txt"
BORDER_SMALL 0: COLOR 0,180,255,255: FONT_BOLD 0 WIDTH 0,180: HEIGHT 0,290 CAPTION 0, " - UTILITAIRES PDF -" MEMO 1: WIDTH 1,600: HIDE 1
Dirf(rp$,"exe") ITEM_ADD 1, CLIPBOARD_STRING_PASTE$ li% = 10: tl% = 0: wl% = 90 FOR i% = 1 TO COUNT(1) a$ = ITEM_READ$(1,i%) EDIT li%: TOP li%,tl%: WIDTH li%, wl%: TEXT li%,a$ BUTTON li%+1: TOP li%+1,tl%: LEFT li%+1,LEFT(li%)+WIDTH(li%): WIDTH li%+1,35 CAPTION li%+1,"Doc": ON_CLICK li%+1, Doc BUTTON li%+2: TOP li%+2,TOP(li%+1): LEFT li%+2,LEFT(li%+1)+35: WIDTH li%+2,35 CAPTION li%+2,"Test": ON_CLICK li%+2,Test li% = li%+3: tl% = tl%+25 NEXT i%
OPEN_DIALOG 90
FORM 100: TOP 100,0: LEFT 100,WIDTH(0): HEIGHT 100,900: WIDTH 100,600 BORDER_SMALL 100: HIDE 100 LIST 101: PARENT 101,100: FULL_SPACE 101: COLOR 101,255,255,210 FONT_NAME 101,"Lucida Console"
FORM 200: TOP 200,30: LEFT 200,10: WIDTH 200,400: HEIGHT 200,240 BORDER_SMALL 200: HIDE 200: COLOR 200,255,200,200: font_bold 200 ALPHA 201: PARENT 201,200: TOP 201,3: LEFT 201,5: CAPTION 201,"Fichier PDF :" EDIT 202: PARENT 202,200: TOP 202,20: LEFT 202,0: WIDTH 202,WIDTH(200)-67 TEXT 202," (clic)": ON_CLICK 202,Chf BUTTON 203: PARENT 203,200: LEFT 203,LEFT(202)+WIDTH(202): TOP 203,TOP(202) WIDTH 203,50: CAPTION 203,"Voir": ON_CLICK 203,Vpdf ALPHA 211: PARENT 211,200: TOP 211,TOP(203)+25: LEFT 211,5 CAPTION 211,"Options (éventuel) :" EDIT 212:PARENT 212,200: TOP 212,TOP(211)+17: LEFT 212,0: WIDTH 212,WIDTH(202) BUTTON 213: PARENT 213,200: LEFT 213,LEFT(212)+WIDTH(212): TOP 213,TOP(212) WIDTH 213,50: CAPTION 213,"Doc": ON_CLICK 213,Doc ALPHA 221: PARENT 221,200: TOP 221,TOP(212)+25: LEFT 221,5: CAPTION 221,"Fichier résultat :" EDIT 222: PARENT 222,200: TOP 222,TOP(221)+17: LEFT 222,0: WIDTH 222,WIDTH(212) BUTTON 231: PARENT 231,200: TOP 231,TOP(222)+25: LEFT 231,120: CAPTION 231,"Exécuter" ON_CLICK 231,Exec BUTTON 232: PARENT 232,200: TOP 232,TOP(231)+25: LEFT 232,LEFT(231)-20: WIDTH 232,WIDTH(231)+40 CAPTION 232,"Voir le résultat": ON_CLICK 232,Vres: HIDE 232 end ' ============================================================================== Doc: IF NUMBER_CLICK = 213 a$ = LEFT$(p$,LEN(p$)-3) TOP 100,TOP(200)+150: LEFT 100,0 ELSE i% = NUMBER_CLICK-1: a$ = TEXT$(i%): a$ = LEFT$(a$,LEN(a$)-3) CAPTION 100, STRING$(80," ")+UPPER$(TEXT$(i%)) TOP 100,TOP(0): LEFT 100,WIDTH(0) END_IF a$ = rp$ + "\" + a$ + "txt" FILE_LOAD 1,a$: CLEAR 101 FOR i% = 1 TO COUNT(1) a$ = RTRIM$(ITEM_READ$(1,i%)) IF a$<>"" THEN ITEM_ADD 101,a$ NEXT i% SHOW 100 RETURN ' ============================================================================== Test: i% = NUMBER_CLICK-2: p$ = TEXT$(i%) CAPTION 200, STRING$(40," ")+"TEST DE "+UPPER$(p$) resrep$ = "" CAPTION 221,"Fichier résultat :" TEXT 212,"": TEXT 222,"" a$ = LEFT$(p$,LEN(p$)-4) IF a$="pdfdetach" OR a$="pdfimages" OR a$="pdftohtml" OR a$="pdftopng" OR a$="pdftoppm" CAPTION 221,"Répertoire résultat :": resrep$ = "1" IF a$ = "pdfimages" THEN sf$ = "ppm" IF a$ = "pdftopng" THEN sf$ = "png" IF a$ = "pdftoppm" THEN sf$ = "ppm" IF a$ = "pdfdetach" THEN sf$ = "*" IF a$="pdftohtml" CAPTION 221,"Répertoire résultat (ne doit pas exister) :" sf$ = "*": ' fichiers produits: .htm et .png END_IF END_IF IF a$="pdfbklt" OR a$="pdffonts" OR a$="pdfinfo" TEXT 222,ftm$ END_IF HIDE 232: SHOW 200 RETURN ' ============================================================================== Chf: FILTER 90,"Fichiers PDF|*.pdf" f$ = FILE_NAME$(90): IF LEN(f$)<4 THEN RETURN TEXT 202,f$ RETURN ' ============================================================================== Vpdf: IF TEXT$(202) = "" THEN RETURN f$ = TEXT$(202) EXECUTE_WAIT f$: ' voir le pdf sous Acrobat RETURN ' ============================================================================== Exec: IF TEXT$(202) = "" OR TEXT$(202) = " (clic)" MESSAGE "Pas de fichier PDF !": RETURN END_IF IF TEXT$(222) = "" THEN MESSAGE "Pas de fichier résultat !": RETURN fr$ = TEXT$(222) IF resrep$ = "1" THEN resrep$ = fr$ b$ = LEFT$(p$,LEN(p$)-4) IF b$="pdfbklt" OR b$="pdffonts" OR b$="pdfinfo" fr$ = ">"+fr$: ' sortie sur stdout -> fichier END_IF a$ = TRIM$(TEXT$(212)): ' paramètres (options) éventuels IF b$ = "pdfdetach" EXECUTE_WAIT "Cmd.exe /c "+rp$+"\"+p$+" -list "+f$+" >"+ftm$ FILE_OPEN_READ 1,ftm$: FILE_READLN 1,b$: FILE_CLOSE 1: FILE_DELETE ftm$ IF TRIM$(b$)="0 embedded files" MESSAGE "Aucun fichier inclus dans "+f$: RETURN END_IF arg$ = "-saveall " + f$ + " -o "+resrep$ ELSE arg$ = a$ + " " + f$ + " " + fr$ END_IF EXECUTE_WAIT "Cmd.exe /C "+rp$+"\"+p$ + " " + arg$ SHOW 232 RETURN ' ============================================================================== Vres: IF resrep$ <> "" IF DIR_EXISTS(resrep$) = 0 THEN RETURN: ' répertoire non créé Dirf(resrep$,sf$) FILE_OPEN_WRITE 9, ftm$ FILE_WRITELN 9,"Répertoire de " + resrep$ FILE_WRITELN 9,"" FILE_WRITELN 9,CLIPBOARD_STRING_PASTE$ FILE_CLOSE 9 a$ = ftm$ ELSE a$ = TEXT$(222) IF FILE_EXISTS(a$) = 0 THEN RETURN end_if EXECUTE_WAIT "Notepad.exe " + a$ RETURN ' ============================================================================== SUB Dirf(rep$,ext$) ' Liste des fichiers de rep$, d'extension ext$ (si ext$= "*", tous les fichiers) ' Résultat: chaîne dans le clipboard, fichiers triés, sous-répertoires en tête ' (NB: rep$ accepte les noms de répertoires contenant des espaces). DIM_LOCAL svr$, a$, f$, ndl%, i%, nt% ndl% = 5000: WHILE OBJECT_EXISTS(ndl%)=1: ndl%=ndl%+1000: END_WHILE DLIST ndl% svr$ = DIR_CURRENT$: DIR_CHANGE rep$ IF ext$<>"*" AND LEFT$(ext$,1)<>"." THEN ext$="."+ext$ ext$ = UPPER$(ext$) nt% = 0 f$=FILE_FIND_FIRST$: WHILE f$="." OR f$="..": f$=FILE_FIND_NEXT$: END_WHILE IF f$ = "_" THEN nt% = 1: ' répertoire vide WHILE f$ <> "_" IF ext$ = "*" OR UPPER$(FILE_EXTRACT_EXTENSION$(f$)) = ext$ IF FILE_EXISTS(f$) = 0 THEN f$ = " "+f$ ITEM_ADD ndl%,f$ END_IF f$ = FILE_FIND_NEXT$ END_WHILE FILE_FIND_CLOSE DIR_CHANGE svr$: ' restore le répertoire d'origine IF nt% = 1 ' répertoire vide a$ = "" ELSE SORT ndl%: a$ = "" FOR i% = 1 TO COUNT(ndl%) f$ = ITEM_READ$(ndl%,i%): IF LEFT$(f$,1)=" " THEN f$="[D]"+MID$(f$,2,100) a$=a$+f$+CHR$(13)+CHR$(10) NEXT i% a$ = LEFT$(a$,LEN(a$)-2) END_IF DELETE ndl% CLIPBOARD_STRING_COPY a$ END_SUB ' ==============================================================================
Le pdfbklt.exe : fabrication d'un livret (booklet, rien à voir avec bouclette) à partir d'un pdf, fait partie de la série mais n'est pas dans la livraison, il doit être facile à trouver (là par exemple: http://www.sil.org/~hosken/Utils/pdfbklt.zip ), mais je ne l'ai pas testé... à première vue ça n'a pas l'air simple à manipuler, et attention, il modifie le pdf source, faire une copie avant. J'ai un petit programme panoramic qui fait ça très bien (avec Nconvert). ed. 26/7 little bug
Dernière édition par JL35 le Sam 26 Juil 2014 - 22:09, édité 1 fois | |
|