分割PDF以使多个PDF小于20Mb

问题描述 投票:1回答:3

我是Python编程的新手,但拥有5年以上的编码经验。

我必须将大型PDF拆分为小于20Mb的较小PDF。我目前已使用以下逻辑编写代码。

  1. 查找文件大小。将文件大小除以20并四舍五入,就可以将此数字称为分区。例如:文件大小45,然后将45除以20,然后将值从2.25舍入为3。
  2. 查找页数。假设大约有500页。
  3. [按分区数划分页数(3)。因此,从第1页到171页,从172页到343页和从344页到515页将有3套。
  4. 如上所述,我将PDF分成多个分区。

我面临的挑战是所有页面的大小都不相同,因此某些PDF确实很小,有些可能超过20Mb的限制。

有人可以对此提出任何解决方案吗?甚至欢迎使用更好的方法。

python pdf pypdf2
3个回答
1
投票

我不知道您正在使用哪个库,但是也许它可以像这样工作:

打开PDF文件。然后创建一个新页面并添加页面,直到达到20mb或稍稍停下来。这里唯一的问题是,在添加页面并保存文件以再次检查文件大小之前,您不知道页面的大小。

但是我对python和PDF并不自信,所以也许其他人可以为您提供更好的方法。


0
投票

这里是一个算法,它将起作用。该实现只是阅读该库的文档(我不知道)而已,并标记为...

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
投票

性能至关重要吗?

如果没有,您可以在添加每个页面后写入磁盘以跟踪进度。

有点像。

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

上面的一个明显的错误是,如果任何一个页面本身的大小超过20MB,则不确定在特定情况下如何处理该页面。

© www.soinside.com 2019 - 2024. All rights reserved.