PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → API Ghostscript
API Ghostscript
Débuté par Créator1969, 24 nov. 2017 22:27 - 7 réponses
Membre enregistré
7 messages
Posté le 24 novembre 2017 - 22:27
Bonjour à toutes et tous,
Je suis toujours sur WD17, et je me casse les dents sur l'API de Ghostscript v9.22
J'essaye de splitter des fichiers PDF pour en réorganiser les pages mais je sèche.

iCode, iCode1, DLLInst, GsInst sont des entier système
iTemp, iNbParam sont des entier
bRetour est un booléen
Params est un tableau de chaînes
DllPath est une chaîne="c:\Program Files (x86)\gs\gs9.22\bin\gsdll32.dll"
DLLInst = ChargeDLL(DllPath)
SI DLLInst = 0 ALORS
Erreur(ErreurInfo())
FIN

// Nouvelle instance Ghostscript
GsInst=API("gsdll32.dll","gsapi_new_instance", &iTemp, Null)
SI GsInst >= 0 ALORS

// Construction des paramètres
TableauSupprimeTout(Params)
TableauAjoute(Params,"-dBATCH")
TableauAjoute(Params,"-dNOPAUSE")
TableauAjoute(Params,"-sDEVICE=pdfwrite")
TableauAjoute(Params,"-o 3d.pdf")
TableauAjoute(Params,"1a2.pdf")

// des fichiers pdf
iNbParam=TableauOccurrence(Params)
iCode=API("gsdll32.dll", "gsapi_init_with_args", iTemp, iNbParam, &Params)
iCode1=API("gsdll32.dll", "gsapi_exit",iTemp)
FIN

// Déchargement de DLL
API("gsdll32.dll","gsapi_delete_instance",iTemp)
SI iCode = 0 ALORS bRetour=Vrai


iCode me retourne -100

Si quelqu'un à une idée ..

Bonne soirée.
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 27 novembre 2017 - 12:10
Bonjour,
Voici la traduction de l'exemple fourni sur le site de Ghostscript
//constant
// GS_ARG_ENCODING_LOCAL = 0
// GS_ARG_ENCODING_UTF8 = 1
// GS_ARG_ENCODING_UTF16LE = 2
//end

hndDLL, code, minst sont des entiers système
DllName est une chaîne
Params est un tableau de chaînes

DllName = "C:\Program Files\gs\gs9.22\bin\gsdll64.dll"

IF NOT fFichierExiste(DllName) THEN
Erreur(ChaîneConstruit("Fichier %1 inconnu ! ", DllName))
RETOUR
END

hndDLL = ChargeDLL(DllName)
IF hndDLL = 0 THEN
Erreur(ChaîneConstruit("Chargement de la dll impossible !", DllName),ErreurInfo())
RETOUR
END

code = API(DllName, "gsapi_new_instance", &minst, Null)
IF code < 0 THEN
DéchargeDLL(hndDLL)
RETOUR
ELSE
Trace("gsapi_new_instance : " + minst)
END

code = API(DllName, "gsapi_set_arg_encoding", minst, 1) //GS_ARG_ENCODING_UTF8 = 1
IF code <> 0 THEN
Erreur("Code = " + code)
DéchargeDLL(hndDLL)
RETOUR
ELSE
Trace("gsapi_set_arg_encoding : ok")
END

TableauSupprimeTout(Params)
TableauAjoute(Params, ChaîneVersUTF8("ps2pdf"))
TableauAjoute(Params, ChaîneVersUTF8("-dNOPAUSE"))
TableauAjoute(Params, ChaîneVersUTF8("-dBATCH"))
TableauAjoute(Params, ChaîneVersUTF8("-dSAFER"))
TableauAjoute(Params, ChaîneVersUTF8("-sDEVICE=pdfwrite"))
TableauAjoute(Params, ChaîneVersUTF8("-sOutputFile=out.pdf")) // nom du fichier converti
TableauAjoute(Params, ChaîneVersUTF8("-c"))
TableauAjoute(Params, ChaîneVersUTF8(".setpdfwrite"))
TableauAjoute(Params, ChaîneVersUTF8("-f"))
TableauAjoute(Params, ChaîneVersUTF8("C:\Program Files\gs\gs9.22\examples\alphabet.ps")) // nom d'un fichier ps valide

code = API(DllName, "gsapi_init_with_args", minst, Dimension(Params), &Params)
IF code <> 0 THEN
Erreur("gsapi_init_with_args : " + code)
ELSE
Trace ("gsapi_init_with_args : ok")
code = API(DllName, "gsapi_exit", minst)
IF code <> 0 THEN
Erreur("gsapi_exit : "+ code)
ELSE
Trace(("gsapi_exit : ok"))
END
END

DéchargeDLL(hndDLL)


je récupère bien dans le fichier <fRepEncours()>"\out.pdf" le fichier au format postscript converti
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 27 novembre 2017 - 13:43
Pour spliter un fichier pdf de x pages dans x fichiers pdf
TableauSupprimeTout(Params)
TableauAjoute(Params, ChaîneVersUTF8("-dBATCH"))
TableauAjoute(Params, ChaîneVersUTF8("-dNOPAUSE"))
TableauAjoute(Params, ChaîneVersUTF8("-sOutputFile=c:\temp\out%4d.pdf"))
TableauAjoute(Params, ChaîneVersUTF8("-sDEVICE=pdfwrite"))
TableauAjoute(Params, ChaîneVersUTF8("C:\temp\annots.pdf")) //input file name

pour extraire de la page 2 à la page 2
TableauSupprimeTout(Params)
TableauAjoute(Params, ChaîneVersUTF8("-dBATCH"))
TableauAjoute(Params, ChaîneVersUTF8("-dNOPAUSE"))
TableauAjoute(Params, ChaîneVersUTF8("-sOutputFile=c:\temp\out.pdf"))
TableauAjoute(Params, ChaîneVersUTF8("-dFirstPage=2"))
TableauAjoute(Params, ChaîneVersUTF8("-dLastPage=3"))
TableauAjoute(Params, ChaîneVersUTF8("-sDEVICE=pdfwrite"))
TableauAjoute(Params, ChaîneVersUTF8("C:\temp\annots.pdf")) //input file name
Membre enregistré
7 messages
Posté le 29 novembre 2017 - 18:34
Bonjour Philippe,

Merci pour le "ChaîneVersUTF8" mon problème est réglé. (J'avais même pas regardé) ;(
Membre enregistré
7 messages
Posté le 03 décembre 2017 - 18:33
Maintenant même problème mais pour concaténer (fusionner) les fichiers

TableauAjoute(Params, ChaîneVersUTF8("-dBATCH"))
TableauAjoute(Params, ChaîneVersUTF8("-dNOPAUSE"))
TableauAjoute(Params, ChaîneVersUTF8("-q"))
TableauAjoute(Params, ChaîneVersUTF8("-sDEVICE=pdfwrite"))
TableauAjoute(Params, ChaîneVersUTF8("-sOutputFile=" + cFichierDeSortie))
TableauAjoute(Params, ChaîneVersUTF8(cListe))


Qu'est-ce que je fais de faux ???
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 04 décembre 2017 - 11:37
bonjour,
TableauAjoute(Params, ChaîneVersUTF8("-dBATCH"))
TableauAjoute(Params, ChaîneVersUTF8("-dNOPAUSE"))
TableauAjoute(Params, ChaîneVersUTF8("-q"))
TableauAjoute(Params, ChaîneVersUTF8("-sDEVICE=pdfwrite"))
TableauAjoute(Params, ChaîneVersUTF8("-sOutputFile=c:\temp\out.pdf"))
TableauAjoute(Params, ChaîneVersUTF8("c:\temp\f1.pdf")) // 1er fichier
TableauAjoute(Params, ChaîneVersUTF8("c:\temp\f2.pdf")) // 2éme fichier
Posté le 18 mars 2024 - 15:56
Bonjour,

Je sais que c'est 6 ans après. Mais un grand merci Philippe. On ne le dit jamais assez sur Internet. Je viens de basculer mon appli en 64bits (je suis en Windev 2024) et pas moyen de fusionner des PDF avec gsdll64.dll jusqu'à ton message.

Nicolas
Membre enregistré
797 messages
Popularité : +40 (42 votes)
Posté le 20 mars 2024 - 16:04
Peut-être avec des fonctions Windev? https://ayuda.windev.es/fr-FR/…

Rubén