Rotation Ghostscprit

Fermé
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022 - Modifié le 15 avril 2022 à 11:49
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022 - 26 avril 2022 à 18:12
Bonjour,

Je tente de convertir des fichiers PostScripts en fichier PDF et :ou txt en utilisant Python.

J'utilise plusieurs méthodes, a première est de passer par un subprocess + ligne de commande.

subprocess.call("C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dPDFA -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -dtextFormat=3 -sDEVICE=txtwrite -sOutputFile=\"c:\fichiersorti.txt" -dEPSCrop -c \"<</Orientation 3>> setpagedevice\" -f c:\fichierentree.ps -c quit", shell=True)

Lorsque je lance cette ligne de commande, j'ai l'erreur << était inattendu.
Je pense que python ne supporte pas le <<. Je cherche les tipes pour comprendre quelle syntaxe mettre pour que cela fonctionne.

L'autre consiste à utiliser le module GS importé dans Python ce script fonctionne :

args = ["ps2txt", # actual value doesn't matter
"-dPDFA",
"-dbase",
"-dBATCH",
"-dNOPAUSE",
"-dNoSAFER",
"-dQUIET"
"-dFirstPage=3", #Démarrage de la conversion à la page 3
"-dtextFormat=3",
"-sDEVICE=txtwrite", #Type de conversion ici en txt
"-sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + "txt\"",
"-dEPSCrop",
Dir_input_path + Fil_input_path]

print args

with ghostscript.Ghostscript(*args) as g:
ghostscript.cleanup()

Mais lorsque j'ajoute la commande permettant de tourner mes pages : "-c \"<</Orientation 3>> setpagedevice\"",
Il ne veut rien savoir. Certainement un nouveau problème de syntaxe. Mais là je sèche un peu.
Avez vous déjà rencontré ce genre de problème. et pouvez vous pointer mon problème de saisie svp ?

Merci d'avance.

Configuration: Windows / Edge 97.0.1072.62

7 réponses

barnabe0057 Messages postés 14452 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 3 août 2024 4 917
15 avril 2022 à 18:15
Bonjour,

Concernant ta première méthode, les caractères <> sont des caractères spéciaux qui sont interprétés comme des redirections.

Pour ne pas qu'ils soient interprétés par l'invite de commandes, il faut les "échapper" comme ceci :

macommande="C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dPDFA -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -dtextFormat=3 -sDEVICE=txtwrite -sOutputFile=\"c:\fichiersorti.txt" -dEPSCrop -c \"^<^</Orientation 3^>^> setpagedevice\" -f c:\fichierentree.ps -c quit"

subprocess.call(macommande, shell=True)


1
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
15 avril 2022 à 12:29
bonjour,
qui te retourne l'erreur, python ou la console exécutant la commande?
prends le temps de partager le texte complet et précis du message d'erreur reçu.
en python, au lieu de
subprocess.call("blabla", shell=True)
,
fais plutôt:
macommande="blabla"
subprocess.call(ma commande , shell=True)
0
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022
Modifié le 15 avril 2022 à 13:19
Merci, comme ça c'est surement plus lisible, en effet.

Ma commande :
args = ["ps2txt", # actual value doesn't matter
"-dPDFA",
"-dbase",
"-dBATCH",
"-dNOPAUSE",
"-dNoSAFER",
"-dQUIET"
"-dFirstPage=3", #Démarrage de la conversion à la page 3
"-dtextFormat=3",
"-sDEVICE=txtwrite", #Type de conversion ici en txt
"-sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + "txt\"",
"-dEPSCrop",
Dir_input_path + Fil_input_path]

print args

with ghostscript.Ghostscript(*args) as g:
ghostscript.cleanup()



C'est la console qui me retourne des erreurs lorsque j'ajoute cette ligne :
   "-c "<</Orientation 3>> setpagedevice"",


En ligne de commande dans une fenêtre dos, ça fonctionne.

.
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
15 avril 2022 à 17:30
Peux-tu partager du texte, et pas des images?

Peux-tu partager la commande qui fonctionne quand tu ne passes pas par du python?

Où est passé le message d'erreur "<< était inattendu"?
0
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022
17 avril 2022 à 19:24
Génial !
Est ce qu'il y a un tuto qui reprends toutes ces subtilités du langage Python. Au démarrage, c'est assez bloquant ces petits aménagements nécessaires.
Je tests ça dès mon retour au boulot.
Bon week-end.
0
barnabe0057 Messages postés 14452 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 3 août 2024 4 917
Modifié le 17 avril 2022 à 20:52
Bien que Python possède aussi des caractères spéciaux, dans ton cas ceux-ci ne sont pas liés à Python mais plutôt à l'invite de commandes (cmd.exe)

https://www.robvanderwoude.com/escapechars.php
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
17 avril 2022 à 21:27
Cela n'a rien à voir avec Python.
Teste tes commandes avant de les utiliser via Python, par exemple via un fichier .bat.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022
25 avril 2022 à 17:31
Bonjour,

Voici la commande qui fonctionne directement dans un .cmd :

C:\Progra~1\gs\gs9.55.0\bin\gswin64c.exe -dbase -dBATCH -dNOPAUSE -dNoSafer -dQUIET -sDEVICE=txtwrite -dFirstPage=3  -sOutputFile="%outputfile%" -dEPSCrop -c "<</Orientation 3>> setpagedevice" -f "%inputfile%" -c quit


Je passe mes variables %inputfilet% et %outputfile% depuis python.
Et là pas de problème il me tourne bien mes pages en paysage.

CAS 1 : commande executée depuis mon scripte python.

subprocess.call("C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -sDEVICE=txtwrite -dFirstPage=3 -sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + ".txt\" "+Dir_input_path + Fil_input_path, shell=True)


Ca fonctionne, mais lorsque j'essaye d'intégrer ce code
-c "<</Orientation 3>> setpagedevice"
comme ci-dessous :

subprocess.call("C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -sDEVICE=txtwrite -dFirstPage=3 -c \"<</Orientation 3>> setpagedevice\" -sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + ".txt\" "+Dir_input_path + Fil_input_path, shell=True)


J'ai l'erreur suivante :
**** Unable to open the initial device, quitting.


CAS 2 : Autre méthode en passant les arguments

Je fais la conversion avec celle fonction, qui est lancée pour chaque fichier présent dans le répertoire de traitement.

def ps2txt(Dir_input_path, Fil_input_path):	
args = ["ps2txt", # actual value doesn't matter
"-dPDFA",
"-dbase",
"-dBATCH",
"-dNOPAUSE",
"-dNoSAFER",
"-dQUIET"
"-dFirstPage=3", #Démarrage de la conversion à la page 3
"-dtextFormat=3",
"-sDEVICE=txtwrite", #Type de conversion ici en txt
"-sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + "txt\"",
"-dEPSCrop",
Dir_input_path + Fil_input_path]

with ghostscript.Ghostscript(*args) as g:
ghostscript.cleanup()


Pas de soucis, mais là il manque la rotation de la page.

J'ajoute donc la ligne suivante :
"-c "^<^</Orientation 3^>^> setpagedevice"",
ou
"-c \"<</Orientation 3>> setpagedevice\"",


Et lorsque je lance mon script python j'ai le message d'erreur suivant :

['ps2txt', '-dPDFA', '-dbase', '-dBATCH', '-dNOPAUSE', '-dNoSAFER', '-dQUIET-dFirstPage=3', '-dtextFormat=3', '-c "<</Orientation 3>> setpagedevice"', '-sDEVICE=txtwrite', '-sOutputFile="c:\\Import\\fichier.txt"', '-dEPSCrop', 'c:\\Import\\fichier.PS']
GPL Ghostscript 9.55.0 (2021-09-27)
Copyright (C) 2021 Artifex Software, Inc. All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
%%[ ProductName: GPL Ghostscript ]%%
Traceback (most recent call last):
File "C:\Python27\gsprint.py", line 150, in <module>
ps2txt (Directory_input, File_input)
File "C:\Python27\gsprint.py", line 53, in ps2txt
with ghostscript.Ghostscript(*args) as g:
File "C:\Python27\lib\site-packages\ghostscript\__init__.py", line 174, in Ghostscript
stderr=kw.get('stderr', None))
File "C:\Python27\lib\site-packages\ghostscript\__init__.py", line 74, in __init__
rc = gs.init_with_args(instance, args)
File "C:\Python27\lib\site-packages\ghostscript\_gsprint.py", line 271, in init_with_args
rc = libgs.gsapi_init_with_args(instance, len(argv), c_argv)
WindowsError: exception: access violation writing 0x00000000


Il évoque une violation d'écriture.
Le ^ ne semble pas changer grand chose malheureusement. Snif !

Je pense à un problème d'écriture et/ou d'interprétation dans les passages d'arguments. Mais je ne trouve pas où.
Merci encore.
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
25 avril 2022 à 20:16
au lieu d'écrire:
subprocess.call("C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -sDEVICE=txtwrite -dFirstPage=3 -c \"<</Orientation 3>> setpagedevice\" -sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + ".txt\" "+Dir_input_path + Fil_input_path, shell=True)

peux-tu écrire:
lacommande= "C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -sDEVICE=txtwrite -dFirstPage=3 -c \"<</Orientation 3>> setpagedevice\" -sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + ".txt\" "+Dir_input_path + Fil_input_path
print("lacommande:", lacommande)
subprocess.call( lacommande, shell=True)

cela aiderait à comparer ce qui fonctionne directement dans un .cmd et ce qui ne fonctionne pas quand appelé par python.
pour tester, tu pourrais aussi, à partir du python, créer un fichier cmd, et verifier qu'il peut s'exécuter.
1
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022
26 avril 2022 à 14:31
Bon et bien l'approche systèmique est en effet la meilleur.
Merci pour cette ultime proposition de passer par une variable.
Déjà c'est plus facile à lire, ensuite j'ai rechercher à reproduire l'exact syntaxe, et là ca marche.
Il ne faut en effet oublier aucun argument, et l'ordre des arguments est important.
Du coup cette ligne de commande fonctionne :

LaCommande = "C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dbase -dBATCH -dNOPAUSE -dNoSAFER -dQUIET -sDEVICE=txtwrite -dFirstPage=3 -sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + "txt\" -dEPSCrop -c \"<</Orientation 3>> setpagedevice\" -f "+Dir_input_path + Fil_input_path
print (LaCommande)
subprocess.call(LaCommande, shell=True)


Il est important de mettre le
 -c "<</Orientation 3>> setpagedevice"
juste après le nom du fichier de sorti, et ne pas oublier le -f.

Vous aurez remarqué le double slash à gs9.55.0\bin. parce que 0\b n'est pas interprété comme il faut.

Je test avec le passage d'arguments, et je vais aussi le faire pour la transformation PDF. Je vous livre les résultats après.
En tout cas commu super sympa, c'est un plaisir déchanger avec vous.
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
26 avril 2022 à 16:52
Cette "ultime" proposition était la première: déjà faite le 15 avril 2022 à 12:29.
0
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
26 avril 2022 à 18:12
Vrai. C'est l'ajout du print entre les deux et ta proposition de comparer entre le .cmd et le print qui m'a fait tilter.

Je faisais le print, mais avant le subprocess, et pas directement avec la variable. Comme ça c'est en effet beaucoup plus pratique pour tester le code. :)
0
MBARON76 Messages postés 11 Date d'inscription dimanche 13 mars 2022 Statut Membre Dernière intervention 26 avril 2022
26 avril 2022 à 15:00
J'ai testé via le passage d'arguments mais là ça bloque. En attendant voilà la ligne de commande pour une transformation PS en PDF.

	LaCommande = "C:\Progra~1\gs\gs9.55.0\\bin\gswin64c.exe -dbase -dPDFA -dBATCH -dNOPAUSE -dNOPROMPT -dNoSAFER -dFirstPage=3 -sDEVICE=pdfwrite -sOutputFile=\""+ Dir_input_path + Fil_input_path[:-2] + ".pdf\" -dEPSCrop -c \"<</Orientation 3>> setpagedevice\" -f "+Dir_input_path + Fil_input_path
print (LaCommande)
subprocess.call(LaCommande, shell=True)
0