Automator Decoupage PDF ttes les 4 pages

willy92

Membre enregistré
28 Août 2010
3
0
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
 
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.

Bloc de code:
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é.
 
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
 
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é :
Bloc de code:
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()'"
 
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" !
 
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.

Bloc de code:
import CoreGraphics

dataProvider = CoreGraphics.CGDataProviderCreateWithFilename(pdfFileName)
pdfResource = CoreGraphics.CGPDFDocumentCreateWithProvider(dataProvider)
 
Bonjour,
un conseil: ne jamais faire

package import * car si il y a des globales privées elles seront importees aussi dans ton global namespace
Bloc de code:
import CoreGraphics

dataProvider = CoreGraphics.CGDataProviderCreateWithFilename(pdfFileName)
pdfResource = CoreGraphics.CGPDFDocumentCreateWithProvider(dataProvider)
Ok, merci pour le conseil.:up: