[PYTHON] Un script qui combine plusieurs pages d'un fichier PDF en une seule page sans marges

Motivation

En tant que méthode (2 en 1, 4 en 1, ... en 1) pour combiner plusieurs pages de PDF en une seule page, par exemple, "Aperçu" de macOS ** "Fichier" -> "Imprimer ..." -> Sélectionnez le nombre de pages / feuille dans l'onglet "Mise en page" -> "Enregistrer en PDF" ** La méthode peut être mentionnée. Cependant, je n'ai pas trouvé de moyen d'éviter l'écart entre les pages qui ont été assemblées avec cette méthode.

Les première et deuxième pages sont respectivement 元ファイル1ページ目 元ファイル2ページ目 Si vous essayez de monter un fichier PDF contenant des éléments jusqu'au bord de la page comme indiqué ci-dessus, macOSのプリント機能でまーじした場合 On peut voir que la marge est définie comme indiqué dans, et il y a un espace entre les pages. l C'est un peu décevant pour la sortie à des fins telles que ** vouloir diviser une grande feuille de papier et combiner les fichiers PDF numérisés en une seule page **. Je pense qu'il existe un moyen de convertir une fois au format Postscript et d'utiliser l'ancien psnup, mais je pense que cela peut être gênant en raison des caractères multi-octets, des polices et de la conversion de format, alors gérez le PDF. J'ai décidé d'écrire un script de conversion dans un langage de script récent où une bibliothèque est susceptible d'exister.

spécification

Après quelques recherches, il semble qu'il existe une bibliothèque appelée PyPDF2 pour Python, j'ai donc décidé de l'implémenter avec Python. Comme spécification, les principales choses qui peuvent être modifiées dans l'onglet de mise en page du menu d'impression de macOS peuvent être sélectionnées comme options de ligne de commande.

la mise en oeuvre

L'emplacement du fichier est le suivant.

Exemple d'exécution

Un exemple de regroupement de pages en 2 lignes et 3 colonnes.

% ./pdf_merge_multipages.py -o merge_test.pdf -c 3 -l 2 test_samples/input_landsc
ape_1.pdf test_samples/input_portleit_1.pdf

Utilisation détaillée, etc.

Exigences d'exploitation

--Python: confirmé avec 2.7

Comment utiliser

usage: pdf_merge_multipages.py [-h] [-output filename] [-columns n_h] [-lines n_v] [-page-order opt]
                               [-rotation opt] [-valign opt] [-align opt] [-metainfo opt] [-title text]
                               input-file [input-file ...]

Merge multiple mages in PDF files w/o gap.

positional arguments:
  input-file        Input PDF file(s)

optional arguments:
  -h, --help        show this help message and exit
  -output filename  Output file
  -columns n_h      # of columns of merged pages (default = 2)
  -lines n_v        # of lines of merged pages (default = 1)
  -page-order opt   Page order (choices=left2right[default], left2bottom, right2left, right2bottom)
  -rotation opt     Page orientation (choices=none[default], flip, right, left, auto, rauto)
  -valign opt       Page fitting (choices=resize, none[default], top, bottom, center, fit)
  -align opt        Page fitting (choices=resize, none[default], right, left, center, fit)
  -metainfo opt     Meta data for marged file (choices=full[default], none, partial, short)
  -title text       set title in meta data for marged file (Default: output file name)

Arguments optionnels

---output filename: Le nom du fichier de sortie. S'il n'est pas spécifié, la valeur par défaut est ʻa.out.pdf ---colonnes nh, -lines n_v: Spécification de mise en page: Placez la page du fichier PDF d'entrée dans n_h colonnes horizontales x n_v lignes verticales. Si non spécifié, la valeur par défaut est 2x1 ("2up") ---option-ordre des pages: Spécifiez l'ordre dans lequel les pages sont disposées. --left2right: place la première page du fichier d'entrée en haut à gauche. Les pages qui suivent le fichier d'entrée sont disposées séquentiellement vers la droite, et lorsqu'elles atteignent l'extrémité droite, elles sont disposées séquentiellement à partir de l'extrémité gauche de la colonne directement en dessous ou du coin supérieur gauche à droite de la page suivante. (Défaut) --left2bottom: Placez la première page du fichier d'entrée en haut à gauche. Les pages qui suivent le fichier d'entrée sont disposées dans l'ordre du bas, et lorsqu'elles atteignent le bas, elles sont disposées du haut de la colonne vers la droite ou du haut à gauche vers le bas de la page suivante. --left2top: Placez la première page du fichier d'entrée en bas à gauche. Les pages qui suivent le fichier d'entrée sont disposées dans l'ordre du haut, et lorsqu'elles atteignent le haut, elles sont placées du bas de la colonne vers la droite ou du bas à gauche vers le haut de la page suivante. --right2left: place la première page du fichier d'entrée en haut à droite. Les pages qui suivent le fichier d'entrée sont disposées séquentiellement sur la gauche, et lorsqu'elles atteignent l'extrémité gauche, elles sont disposées séquentiellement à partir de l'extrémité droite de la colonne directement en dessous ou du coin supérieur droit vers la gauche de la page suivante. --right2bottom: place la première page du fichier d'entrée en haut à droite. Les pages qui suivent le fichier d'entrée sont organisées dans l'ordre du bas, et lorsqu'elles atteignent le bas, elles sont disposées du haut de la colonne vers la gauche ou du haut à droite vers le bas de la page suivante. --right2top: place la première page du fichier d'entrée en bas à droite. Les pages qui suivent le fichier d'entrée sont classées dans l'ordre du haut, et lorsqu'elles atteignent le haut, elles sont placées du bas de la colonne vers la gauche ou du bas à droite vers le haut de la page suivante. ---option de rotation: Rotation de la page --aucun: ne pas faire pivoter chaque page du fichier d'entrée à placer. (Défaut) --flip: Retourner chaque page du fichier d'entrée à placer à l'envers. --right: fait pivoter chaque page du fichier d'entrée placé de 90 degrés vers la droite. --gauche: fait pivoter chaque page du fichier d'entrée placé de 90 degrés vers la gauche. --ʻAuto: Si chaque page du fichier d'entrée placée en haut de la page de sortie est placée verticalement (horizontalement), chaque page de l'autre fichier d'entrée placé sur la même page du fichier de sortie est placée horizontalement (verticalement) ), Faites-le pivoter de 90 degrés vers la gauche, sinon il ne tournera pas. -- rauto: Si la page du fichier d'entrée placée en haut de la page de sortie est placée verticalement (horizontalement), chaque page de l'autre fichier d'entrée placé sur la même page du fichier de sortie est placée horizontalement (verticalement). Dans le cas de, faites-le pivoter de 90 degrés vers la droite, et sinon, placez-le sans le faire tourner. ---valign opttion: Spécifiez l'ajustement de la position verticale de la page à placer --aucun, bas: alignement en bas (par défaut) --center: alignement central haut et bas --top: alignement supérieur --resize: Redimensionner pour s'adapter à la taille verticale de la page du fichier d'entrée placé en haut de la page de sortie. S'il est spécifié en même temps que -algin resize ou -algin fit, le taux de réduction peut être plus petit, mais l'intervalle de mise en page est toujours le fichier d'entrée placé en haut de la page de sortie. C'est la taille verticale de la page. --fit: rétrécit pour s'adapter à la taille verticale de la page du fichier d'entrée placé en haut de la page de sortie. S'il est spécifié en même temps que -algin resize ou -algin fit, le taux de réduction sera plus petit et l'intervalle de mise en page sera plus petit que la taille verticale de la page du fichier d'entrée placé en haut de la page de sortie. Quelquefois.

---align opttion: Spécifier le réglage de la position horizontale de la page à placer --aucun, gauche: justifié à droite (par défaut) --center: alignement central gauche et droit -- right: justifié à droite --resize: Redimensionne pour s'adapter à la taille horizontale de la page du fichier d'entrée placée en haut de la page de sortie. S'il est spécifié en même temps que -valgin resize ou -valgin fit, le taux de réduction peut être plus petit, mais l'intervalle de mise en page est toujours le fichier d'entrée placé en haut de la page de sortie. C'est la taille horizontale de la page. --fit: rétrécit pour s'adapter à la taille horizontale de la page du fichier d'entrée placé en haut de la page de sortie. S'il est spécifié en même temps que -valgin resize ou -valgin fit, le taux de réduction sera plus petit et l'intervalle de mise en page sera plus petit que la taille horizontale de la page du fichier d'entrée placé en haut de la page de sortie. Quelquefois. ---metainfo options: Spécification des méta-informations dans le fichier de sortie --full: Généré en ajoutant les méta-informations du fichier d'entrée à la version combinée. (Défaut) --partial: Généré en ajoutant à une partie des méta-informations combinées du fichier d'entrée --Seulement short: '/ Title', '/ Creater', '/ Producer' sont générés --aucun: ne génère pas de méta-informations pour le fichier de sortie (la valeur par défaut de PyPDF2 est spécifiée). ---title text: Spécifiez le titre des méta-informations du fichier d'entrée. (La valeur par défaut est le nom du fichier de sortie)

Recommended Posts

Un script qui combine plusieurs pages d'un fichier PDF en une seule page sans marges
Python qui fusionne beaucoup d'excellence en un seul Excel
Un script qui combine les marges lors du collage d'un certain nombre de graphiques sur des tuiles avec gnuplot
Un script qui combine vos modules et binaires Python préférés en une seule couche Lambda
Combinez plusieurs fichiers python en un seul fichier python
[Python, PyPDF2] Un script qui divise un PDF étalé en deux à gauche et à droite
[Python & Unix] Combinez plusieurs fichiers PDF en un seul.
Créer un fichier PDF avec une taille de page aléatoire
Convertissez plusieurs fichiers jpg en un seul fichier PDF
Une note qui implémente une tâche en Python qui charge un fichier GCS dans BigQuery
Combinez plusieurs fichiers csv en un seul fichier csv avec python (en supposant qu'une seule ligne d'en-tête)
Un script qui prend un instantané d'un volume EBS
Script Shell pour mettre Webmin dans Alpine Linux
Un script qui génère une liste d'utilisateurs du portail SoftLayer