【问题标题】:Page count after using PdfFileMerger() in pypdf2在 pypdf2 中使用 PdfFileMerger() 后的页数
【发布时间】:2017-01-07 09:31:53
【问题描述】:

我正在尝试在 PyPDF2 中使用 PdfFileMerger() 来合并 pdf 文件(参见代码)。

from PyPDF2 import PdfFileMerger, PdfFileReader

[...]

merger = PdfFileMerger()

if (some condition):
    merger.append(PdfFileReader(file(filename1, 'rb')))
    merger.append(PdfFileReader(file(filename2, 'rb')))
if (test for non-zero file size):
    merger.write("output.pdf")

但是,我的合并命令受制于某些条件,结果可能不会生成合并的 pdf 文件。我想知道如何在使用 PdfFileMerger() 执行合并后确定页数。如果不出意外,我想知道页数是否非零。维护一个计数器来执行此操作会很麻烦,因为我正在跨多个函数执行合并,并且更喜欢更优雅的解决方案。

【问题讨论】:

  • 也许可以在合并对象周围创建一个包装器,用于维护页数并传递它。
  • 是的,这是一个选项。与 PdfFileWriter 不同,PdfFileMerger 似乎没有 getNumPages() 之类的方法,而且似乎我们必须创建一个包装器对象来实现此功能。

标签: python pypdf pypdf2


【解决方案1】:

我和你一样是+-。我将解释我的解决方案。我没有使用PdfFileReader('filename.pdf', 'rb') 打开 PDF,而是将 pdf 内容传递到数组中以进行合并 (pdfs_content_array)。然后我正在准备合并和我的输出(不想将生成的文件保存在本地,所以我必须使用 BytesIO 将合并的内容保存在某处)需要calc_page_sum 来比较页码结果。最重要的部分是:calc_page_sum += PdfFileReader(bytes_content).getNumPages() 所以我用 PdfFileReader 打开字节内容并获取页码。然后我添加合并... merger.append,bytes_content 我将合并写入我的字节输出并将其与 calc_page_sum 进行比较。就是这样。

from PyPDF2 import PdfFileMerger, PdfFileReader
import io

[...]

def merge_the_pdfs(self,pdfs_content_array,output_file):
    merger = PdfFileMerger()
    output = io.BytesIO()
    calc_page_sum = 0

    for content in pdfs_content_array:
        bytes_content = io.BytesIO(content)
        calc_page_sum += PdfFileReader(bytes_content).getNumPages()
        yield self.application.cpupool.submit(merger.append,bytes_content)

    merger.write(output)
    if not calc_page_sum == PdfFileReader(output).getNumPages():
        return None

    return output.getValue()

希望这会有所帮助!

第二版:

from PyPDF2 import PdfFileMerger, PdfFileReader
import io
import sys

filename1 = 'test.pdf'
filename2 = 'test1.pdf'

merger = PdfFileMerger()
output = io.BytesIO()
calc_page_sum = 0

filesarray = [filename1,filename2]

for singlefile in filesarray:
    calc_page_sum += PdfFileReader(singlefile, 'rb').getNumPages()
    merger.append(PdfFileReader(singlefile, 'rb'))

merger.write(output)
print(calc_page_sum)
print(PdfFileReader(output).getNumPages())

if calc_page_sum == PdfFileReader(output).getNumPages():
    print("It worked")
    merger.write("merging-test.pdf")
    sys.exit()

print("Didn't worked")
sys.exit()

【讨论】:

  • 正如我的问题中所述,我同意维护一个计数器(如 calc_page_sum)可以解决问题。但是,我想知道是否有更好的解决方案。例如,在使用 PdfFileMerger 之前,我使用了 PdfFileWriter,它有一个解决问题的 getNumPages() 方法。但是,当打开太多文件并且当我移动到 PdfFileMerger 时,PdfFileWriter 会导致问题,像 getNumPages() 这样的等效方法不可用。
  • 我没有找到其他选择。您可以将结果写入 BytesIO 对象,然后使用 PdfFileWriter 使用 getNumPages() 并进行比较,而不是写入文件 merger.write("output.pdf")。如果这是真的,您可以再次将输出写入文件中。
【解决方案2】:

也许你可以尝试使用以下

if len(merger.pages) > 0

根据你的情况

if (test for non-zero file size)

【讨论】:

  • len(merger.pages) 可以解决问题。这应该是公认的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-19
  • 2014-05-12
  • 1970-01-01
  • 2023-03-12
  • 2014-11-30
相关资源
最近更新 更多