Разделение PDF для создания нескольких PDF-файлов размером менее 20 МБ - PullRequest
1 голос
/ 17 октября 2019

Я новичок в программировании на Python, но у меня более 5 лет опыта в программировании.

Мне нужно разбить большие PDF-файлы на меньшие, размером менее 20 МБ. В настоящее время я написал код со следующей логикой.

  1. Найти размер файла. Разделите размер файла на 20 и округлите число, давайте назовем этот номер разделами. Пример: размер файла 45, затем я делю 45 на 20 и округляю значение от 2,25 до 3.
  2. Найдите количество страниц. Допустим, есть около 500 страниц.
  3. Разделите количество страниц на разделы (3). Таким образом, будет 3 комплекта: от страниц 1 до 171, от 172 до 343 и от 344 до 515.
  4. Я разбил PDF-файл на несколько разделов, как указано выше.

ЗадачаЯ сталкиваюсь с тем, что все страницы имеют разный размер, поэтому некоторые PDF-файлы становятся очень маленькими, а некоторые могут превышать ограничение в 20 МБ.

Может кто-нибудь предложить какое-либо решение для этого? Добро пожаловать даже лучше.

Ответы [ 4 ]

1 голос
/ 17 октября 2019

Я не знаю, с какой библиотекой вы работаете, но, возможно, она могла бы работать так:

Откройте файл PDF. Затем создайте новый и добавляйте страницы, пока не достигнете 20 МБ или не остановитесь немного раньше. Единственная проблема здесь в том, что вы не знаете размер страницы до того, как добавите ее и сохраните файл, чтобы проверить размер файла еще раз.

Но я не уверен в Python и PDF, так что, возможно, кто-тоеще есть лучший подход для вас.

0 голосов
/ 19 октября 2019

Может быть полезно оптимизировать ваши PDF-файлы либо до того, как вы разделите их, при условии, что ваш инструмент не раздувает эти извлеченные страницы без необходимости во время процесса извлечения.

Или вы можете разбить свой PDF-файл на ваши сегменты изатем optimize then.

Моя компания предлагает инструмент PDF optimizer , который поможет оптимизировать ваши документы.

На основе вашего комментария к другому ответу, если выраздувать файл размером 46 МБ до 12 ГБ после извлечения, тогда было бы оптимальным сначала разрешить процесс извлечения, а затем выполнить оптимизацию PDF, а не тратить время на оптимизацию того, что, вероятно, является ненужным «материалом».

0 голосов
/ 18 октября 2019

Критически важна производительность?

Если нет, вы можете записывать на диск после добавления каждой страницы, чтобы отслеживать прогресс.

Что-то вроде.

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

OneОчевидная ошибка с вышесказанным заключается в том, что если какая-то одна страница сама по себе занимает более 20 МБ, не знаю, как бы вы справились с этим в вашем конкретном случае.

0 голосов
/ 17 октября 2019

Вот алгоритм , который будет работать. Реализация - это просто чтение документации этой библиотеки (которую я не знаю), и она помечена как ....

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)
...