1
votes

Diviser un PDF pour créer plusieurs PDF de moins de 20 Mo

Je suis nouveau dans la programmation Python mais j'ai plus de 5 ans d'expérience en programmation.

Je dois diviser les gros PDF en plus petits de moins de 20 Mo. J'ai actuellement écrit du code avec la logique suivante.

  1. Trouvez la taille du fichier. Divisez la taille du fichier par 20 et arrondissez le nombre, appelons ce numéro de partitions. Ex: File Size 45 puis je divise 45 par 20 et arrondis la valeur de 2,25 à 3.
  2. Trouvez le nombre de pages. Disons qu'il y a environ 500 pages.
  3. Divisez le nombre de pages par les partitions (3). Il y aura donc 3 ensembles, des pages 1 à 171, 172 à 343 et 344 à 515.
  4. J'ai divisé le PDF en nombre de partitions comme mentionné ci-dessus.

Le défi auquel je suis confronté est que toutes les pages ne sont pas de la même taille, donc certains PDF deviennent vraiment petits et certains peuvent dépasser la limite de 20 Mo.

Quelqu'un peut-il suggérer une solution à ce problème? Même une meilleure approche est la bienvenue.


3 commentaires

Recherchez PyPDF2 , toutes les fonctionnalités sont là.


Les pages doivent-elles conserver leur ordre? Pourquoi moins de 20 Mo est-il important?


Pourquoi 20 Mo est-il une limite pour vous? C'est une exigence étrange.


3 Réponses :


1
votes

Je ne sais pas avec quelle bibliothèque vous travaillez, mais peut-être que cela pourrait fonctionner comme ceci:

Ouvrez un fichier PDF. Ensuite, créez-en une nouvelle et ajoutez des pages jusqu'à ce que vous ayez atteint les 20 Mo ou arrêtez-vous un peu plus tôt. Le seul problème ici est que vous ne connaissez pas la taille de la page avant de l'avoir ajoutée et d'enregistrer le fichier pour vérifier à nouveau la taille du fichier.

Mais je ne suis pas à l'aise avec Python et PDF, alors peut-être que quelqu'un d'autre a une meilleure approche pour vous.


1 commentaires

Je voudrais enregistrer toutes les pages dans un seul fichier, prendre note de leur poids, les supprimer, puis calculer quelle page va dans quelle partition en additionnant simplement tous les poids jusqu'à ce qu'elle atteigne (ou une page avant) 20 Mo.



0
votes

Voici un algorithme qui fonctionnerait. L'implémentation est juste une question de lecture de la documentation de cette bibliothèque (que je ne connais pas) et est notée ... .

input_pdf = ...
size_of_input_pdf = ...
target_size = 20*1024*1024 # 20 MB
pages = ... # a list of all the pages contained in the input_pdf

# Check the weight of each individual page.
list_of_weights = []

for n, page in enumerate(pages):
    file_name = f"whatever_temporary_name_{n}"
    create_new_pdf(file_name, page)
    size_of_that_single_page = ...
    list_of_weights.append(size_of_that_single_page)
    os.remove(file_name)

# Take note of which page to put in which partition.
partition_weight = 0
list_of_pages_to_merge = [[]]

for m, weigh in enumerate(list_of_weights):
    if partition_weight + weight < target_size:
        partition_weight += weight # add current weight.
        list_of_pages_to_merge[-1].append(m) # add current page to partition.
    else:
        partition_weight = weight # reset weight.
        list_of_pages_to_merge.append([m]) # prepare next pages list for next partition.

# Now create the actual documents.
for partition, pages in enumerate(list_of_pages_to_merge):
    file_name = f"original_fine_name_partition_{partition}"
    sum_all_pages = ... # no clue how you'll do that.
    create_new_pdf(file_name, sum_all_pages)


0 commentaires

0
votes

Les performances sont-elles essentielles?

Sinon, vous pouvez écrire sur le disque après l'ajout de chaque page, pour suivre la progression.

Quelque chose comme.

let source be original PDF
let y and z be target output PDF files.
let n = 0
let c = page count of source

load source
create a new empty PDF, let this be y

while(n < c):
  import page n from source to y
  save y to disk
  if(y > 20MB):
    delete y
    backup z (this is one of your output files...)
    start new y and re-import page n
  else:
    copy y to z
  ++n

Un bug évident avec ce qui précède est que si une page elle-même dépasse 20 Mo, vous ne savez pas comment vous géreriez cela dans votre cas particulier.


2 commentaires

J'ai essayé ça. Bien que le temps nécessaire pour l'exécuter soit trop long, le plus gros problème est que d'une manière ou d'une autre, la taille du fichier devient trop grande. La raison est probablement que je devrai écrire dans le nouveau fichier de la boucle. Ainsi, un fichier de 46 Mo devient plus de 12 Go.


"Bien que le temps nécessaire pour l'exécuter soit trop long" oui, ce serait lent. Vous pouvez essayer d'enregistrer en mémoire, dans un tampon, mais vous augmentez les chances d'épuisement de la mémoire. "Ainsi, un fichier de 46 Mo devient plus de 12 Go." Ce n’est pas sûr. Soit vous utilisez une API incorrecte, soit il y a un bogue dans l'API que vous utilisez.