Rotation Ghostscprit

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

  1. 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
    1. Contributeur
      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
      1. 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
        1. Contributeur
          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
      2. 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
        1. Contributeur
          Cela n'a rien à voir avec Python.
          Teste tes commandes avant de les utiliser via Python, par exemple via un fichier .bat.
          0
      3. 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
        1. Contributeur
          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
      4. 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
        1. Contributeur
          Cette "ultime" proposition était la première: déjà faite le 15 avril 2022 à 12:29.
          0
        2. @yg_beVrai. 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
      5. 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