我正在使用包含多个页面的 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 年提出,但根据此讨论链接没有解决方案。
如果有人知道解决方法,请告诉我。真的很感激!!!
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
参数传递。