Comment puis-je totalement aplatir un PDF sous Mac OS sur la ligne de commande?

16

J'utilise Mac OS X Snow Leopard. J'ai un PDF avec des champs de formulaire, des annotations et des tampons dessus. Je voudrais figer (ou "aplatir") ce PDF afin que les champs du formulaire ne puissent pas être modifiés et que les annotations / tampons ne soient plus modifiables. Étant donné que j'ai en fait beaucoup de ces fichiers PDF, je veux le faire automatiquement sur la ligne de commande.

Certaines choses que j'ai essayées / envisagées, avec leur degré de réussite:

  • Ouvrir dans l'aperçu et imprimer dans un fichier. Cela crée un PDF totalement plat sans changer la taille du fichier. La seule façon d'automatiser semble être d'écrire un AppleScript basé sur une interface utilisateur kludgy , que j'ai essayé d'éviter.
  • Ouvrez dans Acrobat Pro et utilisez une fonction JavaScript pour aplatir . Encore une fois, vous ne savez pas comment automatiser cela sur la ligne de commande.
  • À utiliser pdftkavec l' flattenoption. Mais cela n'aplatit que les champs de formulaire, pas les tampons et autres annotations.
  • Utilisation cupsfilterqui peut créer des PDF à partir de nombreux formats de fichiers. Comme pdftkcela n'aplatit que les champs du formulaire.
  • Utilisez-le cups-pdfpour vous connecter au serveur d'impression du Mac et enregistrer un fichier PDF au lieu d'imprimer. J'ai utilisé la version macports . Le fichier résultant est plat mais énorme. J'ai essayé ceci sur un fichier de 8 Mo; le PDF aplati était de 358 Mo! Peut-être que cela peut être combiné avec un appel ghostscript comme dans Ubuntu Astuce: Comment réduire la taille du fichier PDF à partir de la ligne de commande .

Toute autre suggestion serait appréciée.

Matthew Leingang
la source
1
Automator.app a quelques options de traitement pdf intégrées. Peut-être que l'un d'eux peut aider directement ou combiné avec l'une des actions ci-dessus.
Kassym Dorsel
Pouvez-vous fournir un exemple de document PDF contenant ces éléments?
Daniel Beck
Je le pense. En ce moment, tous mes échantillons sont des questionnaires étudiants, je dois donc simuler quelque chose.
Matthew Leingang

Réponses:

11

Essayez d'utiliser pdf2pset ps2pdfsuccessivement. C'est un peu lourd mais cela m'a aidé à réduire mon document de 30 Mo à 17 Mo. Pas autant que je l'aurais souhaité mais encore mieux. J'ai eu cette idée d'un ami qui a utilisé cette méthode pour se débarrasser des autorisations de mot de passe sur un pdf.

pdf2ps your_pdf_file.pdf your_pdf_file.ps
ps2pdf your_pdf_file.ps your_pdf_file_from_ps.pdf

J'espère que cela pourra aider!

Olga Botvinnik
la source
3
GhostScript FTW! Je l' ai jusqu'à une seule ligne en utilisant un tuyau: pdf2ps file.pdf - | ps2pdf - file_flat.pdf. Le fichier est passé de 300K à 500K, ce qui représente une forte augmentation en pourcentage, mais rien de tel que l'augmentation de 4400% que la cups-pdfméthode a donnée.
Matthew Leingang
En fait, j'ai eu plus de chance avec pdf2ps -q -sOutputFile=- file.pdf | ps2pdf - file_flat.pdf.
Matthew Leingang
4
Notant que sur Mac, vous pouvez installer Ghostscript pour rendre les commandes ci-dessus disponibles via homebrew avec brew install ghostscript.
Nick
5

Voilà donc ce que j'utilise récemment. Je pense que fonctionnellement, cela fait la même chose que pdf2ps file.pdf - | ps2pdf - file_flat.pdf, mais cela semblait mieux fonctionner pour moi.

gs -sDEVICE=pdfwrite -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -sOutputFile=<newfile> <oldfile>
Matthew Leingang
la source
Les solutions ps2pdf ont échoué pour moi. Cela a fonctionné, en réindexant apparemment les polices dans le PDF.
ℝaphink
Aucune de ces commandes ne s'aplatit. Vous pouvez copier les calques sous-jacents en utilisant Aperçu et le contenu original sera présent.
Alain O'Dea
1

Cela peut être sous-optionnel, mais avez-vous envisagé de chaîner cups-pdf avec pdftk ou cupsfilter? Comme vous l'avez mentionné, cups-pdf produira un fichier pdf plat puis le passera par pdftk ou cupsfilter pour le ramener à une taille acceptable?

Sinon, jetez un œil à /System/Library/Printers/Libraries/convert Vous devriez être capable de faire quelque chose comme

/System/Library/Printers/Libraries/convert -f input_file.pdf -o output_file.pdf -j "application/pdf"
Mxx
la source
Mon Mac n'en a pas /System/Library/Printers/Libraries/convert. J'ai essayé cupsfilter. Lors de la conversion de PDF en PDF, aucune modification n'a été apportée au fichier. Lors de la conversion de PDF en PS puis en PDF, les annotations ont été perdues.
Matthew Leingang
1

AVERTISSEMENT: gs et pdf2ps | ps2pdf NE PAS aplatir les PDF!

L'utilisation de gs ou pdf2ps suivie de ps2pdf produira un PDF multicouche avec le contenu sous des annotations présentes sous forme originale . Vous pouvez vérifier cette faille dans Aperçu en utilisant Sélectionner tout, puis Copier, puis Coller dans une fenêtre TextEdit (en mode texte enrichi). Vous verrez le texte ou les graphiques sous les annotations de rédaction par exemple. C'est clairement très mauvais si vous avez légalement besoin que ce contenu soit retiré de la sortie.

Une solution de travail

ImageMagick peut produire un PDF aplati monocouche multi-page de qualité configurable avec des rasters de chaque page à l'aide de la commande suivante:

convert -density 150 document_original.pdf document_flat.pdf

Cette commande pixellise document_original.pdf, créant une image basée sur les pixels de chaque page, à 150 DPI, et génère le résultat sous la forme document_flat.pdf.

Une note sur la qualité de l'image

En raison de la pixellisation , il produit un PDF non évolutif (zoom et vous verrez le texte ou les images vectorielles originales devenir pixellisées). Il aura probablement une taille de fichier plus grande à moins que l'original n'ait un contenu vectoriel très complexe comme des diagrammes de dispersion à un million de points.

En modifiant la densité , vous pouvez échanger une plus grande taille de fichier pour une sortie de résolution plus élevée.

Tout le texte sera converti en pixels bruts dans chaque image de page. Les diagrammes de texte et de vecteurs souffrent le plus, alors expérimentez avec le DPI jusqu'à ce que vous obteniez des fichiers de sortie utilisables.

Alain O'Dea
la source
1
Merci d'avoir contribué à cette réponse. Il y a 5 ans, la solution que j'ai écrite fonctionnait pour moi. Mais je vais essayer votre réponse la prochaine fois que je dois le faire (en fait très bientôt).
Matthew Leingang
Ça a du sens. J'imagine que le comportement de Ghostscript a changé par rapport aux annotations d'aplatissement. J'ai essayé d'ajouter -PreserveAnnots = false et cela n'a toujours pas fonctionné. Sous le capot, convertissez en utilisant Ghostscript pour le traitement PDF. Je voudrais quelque chose qui fasse ce que fait Acrobat: il conserve les annotations, supprime le contenu derrière elles et préserve les images vectorielles découvertes. La pièce Document Cloud avec le nouvel Acrobat me rend vraiment nerveux de l'utiliser pour des données sensibles.
Alain O'Dea
0

Applescript est probablement le meilleur moyen / le plus rapide d'accéder à la ligne de commande. Une fois qu'il fonctionne, vous pouvez l'enregistrer en tant qu'application et créer un alias dans votre shell de commande pour l'exécuter. Par la suite, vous tapez simplement votre alias sur la ligne de commande.

JRobert
la source
Mais quelle est la manière la plus simple d'aplatir un PDF en AppleScript? Je préfère ne pas scripter l'interface utilisateur pour imiter l'impression dans un fichier. Cela semble compliqué et lent.
Matthew Leingang