# Automator Decoupage PDF ttes les 4 pages



## willy92 (28 Août 2010)

Bonjour la communauté

J'essaye d'utiliser Automator pour faire une manip sur un fichier PDF de 380 pages.
Toutes les 5 pages je souhaite extraire les 4 premières pages et les sauvegarder dans un fichier.
J'arrive à le faire dans apercu mais à la main et c'est trop long.
Exemple 
impresion page 1 à 4 sauvegarder dans fichier pdf a1.pdf
impression page 6 à 9 sauvegarder dans fichier pdf a2.pdf
impression page 11 à 14 sauvegarder dans fichier pdf a3.pdf
et ainsi de suite

je suis dit que l'on doit pouvoir le faire dans automator
d'autant plus que je dois les envoyer par mail au 76 destinataires
et chaque destinataire recevra un mail avec son fichier
destinataire 1 envoi fichier a1.pdf
destinataire 2 envoi fichier a2.pdf
etc ...

Est-ce que quelqu'un peux m'aider
Merci d'avance
willy


----------



## Anonyme (29 Août 2010)

Bonsoir,

C'est impossible dans *Automator*, dés qu'il y a des variantes, comme différentes pages, différent destinataire.


Voici un script AppleScript qui fera le découpage du *fichier PDF*, il créera les fichiers PDF dans un nouveau dossier.


```
activate
set a_PDF to choose file with prompt "Sélectionnez un PDF"
set posix_PDF_Path to POSIX path of a_PDF

set nouvDossier to do shell script "parent=$(/usr/bin/dirname " & (quoted form of posix_PDF_Path) & ")
orig_nom=\"PDFs de 4 pages\"
nom=\"$orig_nom\"
while [ -e \"$parent/$nom\" ];do
   ((i++))
   nom=\"$orig_nom $i\"
done
/bin/mkdir -p \"$parent/$nom\";/bin/echo \"$parent/$nom\""

do shell script "/usr/bin/python -c 'from CoreGraphics import *
pdf_filename = \"" & (posix_PDF_Path) & "\"
pdf_name= \"" & (nouvDossier) & "/a\"
provider = CGDataProviderCreateWithFilename( pdf_filename )
this_pdf = CGPDFDocumentCreateWithProvider( provider )
if this_pdf is None:
   print \"Error reading PDF document - check that the supplied filename points to a PDF file\"
   sys.exit(1)

cnt = this_pdf.getNumberOfPages()
i=0
for page_number in range( 0, cnt + 1 ):
    if (page_number % 5) == 0:
	  i = i + 1
	  if i == 1: page_number = 1
	  new_file_path = \"%s_%d.pdf\" % (pdf_name, i)
	  pageRect = this_pdf.getPage(page_number).getBoxRect(kCGPDFMediaBox)
	  writeContext = CGPDFContextCreateWithFilename(new_file_path, pageRect)
    else: 
	  pageRect = this_pdf.getPage(page_number).getBoxRect(kCGPDFMediaBox)
	  writeContext.beginPage(pageRect)
	  writeContext.drawPDFDocument(pageRect, this_pdf, page_number)
	  writeContext.endPage()'"
```
Un dialogue s'affichera, il suffit de sélectionner un fichier *PDF*.
Le nouveau dossier (son nom --> "*PDFs de 4 pages*") sera créé dans le même dossier que le fichier sélectionné.


----------



## willy92 (29 Août 2010)

Bonjour,

Merci pour ta réponse. Je m'en doutais un peu.
Pour le script la création du dossier se fait bien par contre il y a un soucis sur le 2ieme script
il y a une erreur :
error "Traceback (most recent call last):
  File \"<string>\", line 1, in <module>
  File \"/BinaryCache/CoreGraphicsBindings/CoreGraphicsBindings-26~139/Root/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/CoreGraphics/__init__.py\", line 7, in <module>
ImportError: /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/CoreGraphics/_CoreGraphics.so: no appropriate 64-bit architecture (see \"man python\" for running in 32-bit mode)" number 1

Il me manque une librairie je pense, et je suis sur un imac 2,8 GHZ intel core i7

merci pour ton aide


----------



## Anonyme (29 Août 2010)

Bonjour,

C'est qu'il faut que *python* fonctionne en 32 bits parce que *CoreGraphics* n'est pas encore en 64 bits.

Aussi, j'ai ajouté writeContext.finish() pour terminer l'édition du PDF.

Voici le script modifié :

```
set a_PDF to choose file with prompt "Sélectionnez un PDF"
set posix_PDF_Path to POSIX path of a_PDF

set nouvDossier to do shell script "parent=$(/usr/bin/dirname " & (quoted form of posix_PDF_Path) & ")
orig_nom=\"PDFs de 4 pages\"
nom=\"$orig_nom\"
while [ -e \"$parent/$nom\" ];do
   ((i++))
   nom=\"$orig_nom $i\"
done
/bin/mkdir -p \"$parent/$nom\";/bin/echo \"$parent/$nom\""

do shell script "export VERSIONER_PYTHON_PREFER_32_BIT=yes  
/usr/bin/python -c 'import sys
from CoreGraphics import *
pdf_filename = \"" & (posix_PDF_Path) & "\"
pdf_name= \"" & (nouvDossier) & "/a\"
provider = CGDataProviderCreateWithFilename( pdf_filename )
this_pdf = CGPDFDocumentCreateWithProvider( provider )
if this_pdf is None:
   print \"Error reading PDF document - check that the supplied filename points to a PDF file\"
   sys.exit(1)

cnt = this_pdf.getNumberOfPages()
i=0
for page_number in range( 0, cnt + 1 ):
    if (page_number % 5) == 0:
	  i = i + 1
	  if i == 1:
	       page_number = 1
	  else:
		writeContext.finish()
	  new_file_path = \"%s_%d.pdf\" % (pdf_name, i)
	  pageRect = this_pdf.getPage(page_number).getBoxRect(kCGPDFMediaBox)
	  writeContext = CGPDFContextCreateWithFilename(new_file_path, pageRect)
    else: 
	  pageRect = this_pdf.getPage(page_number).getBoxRect(kCGPDFMediaBox)
	  writeContext.beginPage(pageRect)
	  writeContext.drawPDFDocument(pageRect, this_pdf, page_number)
	  writeContext.endPage()
writeContext.finish()'"
```


----------



## willy92 (31 Août 2010)

Merci c super

Cela fonctionne très bien. Juste fait une petite modif car il créé 77 fichiers (le dernier est vide)

Du coup je vais me mettre à apprendre le langage


Bien, mais pour la suite (si suite il doit y avoir), on va déménager, car ce genre de question n'est pas à sa place dans "Applications" !


----------



## Anonyme (1 Septembre 2010)

willy92 a dit:


> Merci c super
> 
> Cela fonctionne très bien. Juste fait une petite modif car il créé 77 fichiers (le dernier est vide)


Super 

Oui, il crée un nouveau document aux 5 pages, quand le script est rendu à la page 380 il crée un document vide


----------



## tatouille (1 Septembre 2010)

Mac_Jac a dit:


> Super
> 
> Oui, il crée un nouveau document aux 5 pages, quand le script est rendu à la page 380 il crée un document vide



un conseil: ne jamais faire 

package import * car si il y a des globales privées elles seront importees aussi dans ton global namespace ce qui est la meilleur solution pour avoir des conflits et des instabilites, de plus cela fait ton code plus claire, car tu sais d'ou provient les symboles, ici c'est un peu redondant mais malheureusement toutes les API ne sont pas aussi propres  concernant le naming convention.

il y a une technote (python) datant ~ d'une dizaine d'annee concernant le package import *  en gros: "cette chose est toujours presente pour des raisons de compat et historique"

package import * est a classer dans les mauvaises pratiques, et je dirais,  surtout avec python qui peut devenir tres vite illisible meme pour des devs python de longue date.


```
import CoreGraphics

dataProvider = CoreGraphics.CGDataProviderCreateWithFilename(pdfFileName)
pdfResource = CoreGraphics.CGPDFDocumentCreateWithProvider(dataProvider)
```


----------



## Anonyme (1 Septembre 2010)

Bonjour,


tatouille a dit:


> un conseil: ne jamais faire
> 
> package import * car si il y a des globales privées elles seront importees aussi dans ton global namespace
> 
> ...


Ok, merci pour le conseil.


----------

