PDF范围分割



我试图拆分一个PDF文件,方法是找到一个文本关键词,然后抓住关键词所在的页面和后面的4页,总共5页,将它们从原始PDF中拆分出来,放入自己的PDF中,这样新的PDF就只有这5页了,然后循环一遍,再次找到那个关键文本,因为它在原始PDF中重复了X次,抓取那个页面加上后面的4个,并放入自己的PDF中。

示例:关键字在第7页第一个循环中找到,因此需要第7页和第8-11页,并将这5页7-11放入pdf文件中,下一个循环他们的关键词是在第12页上找到的,所以需要第12页和第13-16页,所以第12-16页被拆分到他们自己的pdf上,此时它已经创建了两个单独的pdfs

下面的代码找到了关键词,并将其放入自己的pdf文件中,但只得到了一页,不确定如何包括范围

import os
from PyPDF2 import PdfFileReader, PdfFileWriter
path = "example.pdf"
fname = os.path.basename(path)
reader = PdfFileReader(path)
for page_number in range(reader.getNumPages()):
writer = PdfFileWriter()
writer.addPage(reader.getPage(page_number))
text = reader.getPage(page_number).extractText()
text_stripped = text.replace("n", "")
print(text_stripped)
if text_stripped.find("Disregarded Branch") != (-1):
output_filename = f"{fname}_page_{page_number + 1}.pdf"
with open(output_filename, "wb") as out:
writer.write(out)
print(f"Created: {output_filename}")

免责声明:我是borb的作者,这个答案中使用的库。

我认为你的问题归结为两个常见的功能:

  • 查找给定文本的位置
  • 从PDF中合并/拆分/提取页面

对于第一部分,示例repo中有一个很好的教程。你可以在这里找到它。为了完整起见,我将在这里重复其中一个例子。

import typing
from borb.pdf.document.document import Document
from borb.pdf.pdf import PDF
from borb.toolkit.text.simple_text_extraction import SimpleTextExtraction

def main():
# read the Document
doc: typing.Optional[Document] = None
l: SimpleTextExtraction = SimpleTextExtraction()
with open("output.pdf", "rb") as in_file_handle:
doc = PDF.loads(in_file_handle, [l])
# check whether we have read a Document
assert doc is not None
# print the text on the first Page
print(l.get_text_for_page(0))

if __name__ == "__main__":
main()

此示例从PDF的第0页提取所有文本。当然,您可以简单地遍历所有页面,并检查给定页面是否包含您要查找的关键字。

对于第二部分,您可以在示例存储库中找到一个好的示例。这就是链接。本示例(以及随后的示例)将带您了解从各种来源创建PDF的基础知识。

我在这里复制/粘贴的示例将向您展示如何通过从输入文档1和输入文档2中交替选择一个页面来构建PDF。

import typing
from borb.pdf.document.document import Document
from borb.pdf.pdf import PDF
import typing
from decimal import Decimal
from borb.pdf.document.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF

def main():
# open doc_001
doc_001: typing.Optional[Document] = Document()
with open("output_001.pdf", "rb") as pdf_file_handle:
doc_001 = PDF.loads(pdf_file_handle)
# open doc_002
doc_002: typing.Optional[Document] = Document()
with open("output_002.pdf", "rb") as pdf_file_handle:
doc_002 = PDF.loads(pdf_file_handle)
# create new document
d: Document = Document()
for i in range(0, 10):
p: typing.Optional[Page] = None
if i % 2 == 0:
p = doc_001.get_page(i)
else:
p = doc_002.get_page(i)
d.append_page(p)
# write
with open("output_003.pdf", "wb") as pdf_file_handle:
PDF.dumps(pdf_file_handle, d)

if __name__ == "__main__":
main()

您几乎做到了!

import os
from PyPDF2 import PdfFileReader, PdfFileWriter

def create_4page_pdf(base_pdf_path, start):
reader = PdfFileReader(base_pdf_path)
writer = PdfFileWriter()
for i in range(4):
index = start + i
if index < len(reader.pages):
page = reader.pages[index]
writer.addPage(page)
fname = os.path.basename(base_pdf_path)
output_filename = f"{fname}_page_{start + 1}.pdf"
with open(output_filename, "wb") as out:
writer.write(out)
print(f"Created: {output_filename}")

def main(base_pdf_path="example.pdf"):
base_pdf_path = "example.pdf"
reader = PdfFileReader(base_pdf_path)
for page_number, page in enumerate(reader.pages):
text = page.extractText()
text_stripped = text.replace("n", "")
print(text_stripped)
if text_stripped.find("Disregarded Branch") != (-1):
create_4page_pdf(base_pdf_path, page_number)

最新更新