如何使用pdfplumber从PDF的每一页裁剪后保存PDF?

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

我正在使用包含多个页面的 PDF,每个页面顶部都有一个我想要删除的表格。所以我在顶部表格之后裁剪 PDF。

我不知道如何在裁剪后将其合并或另存为 1 个 PDF。

我已经尝试过以下方法:

import pandas as pd
import pdfplumber

path = r"file-tests.pdf"

with pdfplumber.open(path) as pdf:
    pages = pdf.pages
    
    # loop over each page
    for p in pages:
        print(p)

        # this will give us the box dimensions in (x0,yo,x1,y1) format
        bbox_vals = p.find_tables()[0].bbox

        # taking y1 values as to keep/extract the portion of pdf page after 1st table 
        y0_top_table = bbox_vals[3]
        print(y0_top_table)

        # cropping pdf page from left to right and y value taken from above box to bottom of pg
        p.crop((0, y0_top_table, 590, 840))

输出:

<Page:1>
269.64727650000003
<Page:2>
269.64727650000003
<Page:3>
269.64727650000003
<Page:4>
269.64727650000003
<Page:5>
269.64727650000003
<Page:6>
269.64727650000003
<Page:7>
269.64727650000003
<Page:8>
269.64727650000003
<Page:9>
269.64727650000003
<Page:10>
269.64727650000003
<Page:11>
269.64727650000003
<Page:12>
269.64727650000003
<Page:13>
269.64727650000003
<Page:14>
269.64727650000003
<Page:15>
269.64727650000003
<Page:16>
269.64727650000003
<Page:17>
269.64727650000003
<Page:18>
269.64727650000003
<Page:19>
269.64727650000003
<Page:20>
269.64727650000003

如何附加、保存这些裁剪后的页面到 1 个 PDF 中?

更新

似乎无法按照此

讨论链接
使用pdfplumber

写入或保存pdf文件

(不确定为什么这个问题被降级为负面。这样做的人还应该提供答案或指向已回答的地方的链接)。

更新2:

from pdfrw import PdfWriter
output_pdf =  PdfWriter() 

with pdfplumber.open(path) as pdf:
    pages = pdf.pages
    for p in pages:
        print(p)
        bbox_vals = p.find_tables()[0].bbox
        y0_top_table = bbox_vals[3]
        print(y0_top_table)
        cropped_pdf = p.crop((0, y0_top_table, 590, 840))
        print(type(cropped_pdf))
        output_pdf.addpage(cropped_pdf)

output_pdf.write(r"tests_cropped_file.pdf")

输出与错误:

<Page:1>
269.64727650000003
<class 'pdfplumber.page.CroppedPage'>

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[219], line 13
     11 cropped_pdf = p.crop((0, y0_top_table, 590, 840))
     12 print(type(cropped_pdf))
---> 13 output_pdf.addpage(cropped_pdf)

File c:\Users\vinee\anaconda3\envs\llma_py_3_12\Lib\site-packages\pdfrw\pdfwriter.py:270, in PdfWriter.addpage(self, page)
    268 def addpage(self, page):
    269     self._trailer = None
--> 270     if page.Type != PdfName.Page:
    271         raise PdfOutputError('Bad /Type:  Expected %s, found %s'
    272                              % (PdfName.Page, page.Type))
    273     inheritable = page.inheritable  # searches for resources

AttributeError: 'CroppedPage' object has no attribute 'Type'

更新3:

似乎裁剪 pdf 和保存的问题也在 2018 年提出,但根据此讨论链接没有解决方案。

如果有人知道解决方法,请告诉我。真的很感激!!!

python pdf pdfplumber
1个回答
0
投票

pdf水管工0.11.4枕头9.5.0

实际上,可以使用

pdfplumber
裁剪并保存数据,但前提是您不需要进一步提取数据。

假设您想向某人提供非个性化的医疗文档以供视觉参考,不需要对数据进行进一步处理。在这种情况下,您可以裁剪页面并将其另存为 PDF 中的图像,如下所示:

import pdfplumber

source_path = '.../sample_report.pdf'
destination_path = 'data.pdf'

pdf = pdfplumber.open(source_path)
cropped_pages = []
for page in pdf.pages:
    x0, x1 = 0, page.width
    y0, y1 = page.rects[0]['bottom'], page.height
    cropped_pages.append(page.crop([x0, y0, x1, y1]).to_image(resolution=400).annotated)
cropped_pages[0].save(destination_path, save_all=True, append_images=cropped_pages[1:])

之所以能做到这一点,是因为

pdf.pages[0].to_image().annotated
返回一个 Pillow
Image
对象,而该对象又可以 另存为 PDF,并将附加图像作为
append_images
参数传递。

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