我是Python编程的新手,但拥有5年以上的编码经验。
我必须将大型PDF拆分为小于20Mb的较小PDF。我目前已使用以下逻辑编写代码。
我面临的挑战是所有页面的大小都不相同,因此某些PDF确实很小,有些可能超过20Mb的限制。
有人可以对此提出任何解决方案吗?甚至欢迎使用更好的方法。
我不知道您正在使用哪个库,但是也许它可以像这样工作:
打开PDF文件。然后创建一个新页面并添加页面,直到达到20mb或稍稍停下来。这里唯一的问题是,在添加页面并保存文件以再次检查文件大小之前,您不知道页面的大小。
但是我对python和PDF并不自信,所以也许其他人可以为您提供更好的方法。
这里是一个算法,它将起作用。该实现只是阅读该库的文档(我不知道)而已,并标记为...
。
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)
性能至关重要吗?
如果没有,您可以在添加每个页面后写入磁盘以跟踪进度。
有点像。
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,则不确定在特定情况下如何处理该页面。