我正在尝试修改 PDF 文件中的文本。文本可以位于Tj或类型的对象中BDC。我找到了正确的对象,如果我在更改它们后直接读取它们,它们会显示更新的值。
但如果我将完整的页面传递给 PdfFileWriter,更改就会丢失。我可能正在更新副本而不是真实的对象。我查了一下id(),结果不一样。有人知道如何解决这个问题吗?
from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.generic import TextStringObject, NameObject, ContentStream
from PyPDF2.utils import b_
reader = PdfFileReader("some.pdf")
writer = PdfFileWriter()
for page_idx in range(0, 1):
# Get the current page and it's contents
page = reader.getPage(page_idx)
content_object = page["/Contents"].getObject()
content = ContentStream(content_object, reader)
for operands, operator in content.operations:
if operator == b_("BDC"):
operands[1][NameObject("/Contents")] = TextStringObject("xyz")
if operator == b_("Tj"):
operands[0] = TextStringObject("xyz")
writer.addPage(page)
# Write the stream
with …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用图像的 BBox 坐标提取 PDF 中的图像。
我尝试使用 pdfrw 库,它正在识别图像对象,并且它有一个名为媒体框的属性,其中有一些坐标,我不确定这些是否是正确的 bbox 坐标,因为对于某些 pdf,它显示类似这样的内容 ['0', ' 0', '684', '864'] 但图像不是从页面开头开始的,所以我不认为它是 bbox
我尝试使用 pdfrw 使用以下代码
import pdfrw, os
from pdfrw import PdfReader, PdfWriter
from pdfrw.findobjs import page_per_xobj
outfn = 'extract.' + os.path.basename(path)
pages = list(page_per_xobj(PdfReader(path).pages, margin=0.5*72))
writer = PdfWriter(outfn)
writer.addpages(pages)
writer.write()
Run Code Online (Sandbox Code Playgroud)
如何获取图像及其 bbox 坐标?
示例 pdf :https://drive.google.com/open? id=1IVbj1b3JfmSv_BJvGUqYvAPVl3FwC2A-
我最初的目标是删除 PDF 页面上大量的白边。
然后我发现使用下面的代码缩放页面就可以达到这个目的,但是注释没有缩放。
import PyPDF2
# This works fine
with open('old.pdf', 'rb') as pdf_obj:
pdf = PyPDF2.PdfFileReader(pdf_obj)
out = PyPDF2.PdfFileWriter()
for page in pdf.pages:
page.scale(2, 2)
out.addPage(page)
with open('new.pdf', 'wb') as f:
out.write(f)
# This attempts to remove annotations
with open('old.pdf', 'rb') as pdf_obj:
pdf = PyPDF2.PdfFileReader(pdf_obj)
page = pdf.pages[2]
print(page['/Annots'], '\n\n\n\n')
page.Annots = []
print(page['/Annots'])
Run Code Online (Sandbox Code Playgroud)
有没有办法去掉注释?或者任何可以帮助我摆脱白边的建议。
我正在尝试在给定的边界矩形内提取 pdf 的文本。据我所知,有一些用于 pdf 抓取的工具,例如 pdfminer、pypdf 和 pdftotext。我已经尝试了所有 3 个方法,到目前为止,我只获得了 pdftotext 的代码,用于从给定的边界框中提取文本。该代码看起来像这样:
s = "pdftotext -x %d -y %d -w %d -h %d"
s = s%(<various inputs into my function>)
cmd = [s, pdf_path,
text_out]
subprocess.call(cmd)
Run Code Online (Sandbox Code Playgroud)
但是,这会输出/写入一个文本文件。我想立即使用该文本,这意味着我不想打开一个文本文件来检索该边界框中的任何单词,因为我将为 10,000 多个文档执行此操作,并打开那么多文件可能是一种痛苦。我基本上是从 python 脚本运行命令行提示符,所以我认为实际上没有办法解决这个问题,但我不确定。由于 pdfminer 和 pypdf 是实际的 python 包,我可以获取它们的文本,但它们似乎没有任何方法在给定的像素限制内提取文本。
进一步说明 - 我希望专门在 python 中执行此操作,因为我有大量针对同一个总体项目的其他代码。
我正在将数据写入带有命名字段的 PDF,然后更改这些字段的属性以使其只读。这很棒,但我也希望能够操纵文本,更改字体大小,甚至字体本身。
根据PDF文档,/DA应该控制文本,所以我尝试设置;
NameObject('/DA'): TextStringObject("font: bold italic Courier 80pt;")
然而,这根本不会操纵文本。
下面是用于添加数据然后操作字段的代码,除了字体设置之外,它工作得很好。
我还尝试使用/DS标志来设置字体,这也没有影响。
pdf_reader = PdfFileReader(
open(full_certificate_path, "rb"), strict=False
)
pdf_writer = PdfFileWriter()
data_dict = {
'field1': event.title,
'field2': user.name,
'field3': strfdelta(
completion_time,
"{hours}:{minutes}:{seconds}"
),
}
pdf_writer.addPage(
pdf_reader.getPage(0)
)
try:
# Add data to a page
page = pdf_writer.getPage(0)
pdf_writer.updatePageFormFieldValues(page, data_dict)
for j in range(0, len(page['/Annots'])):
writer_annot = page['/Annots'][j].getObject()
writer_annot.update({
# Q: Text justification
# 0: left
# 1: centre
# 2: right
NameObject("/Q"): NumberObject(1),
# Default: …Run Code Online (Sandbox Code Playgroud) 我有数百个 PDF 文件,我需要设置密码。我尝试使用 pyPDF2 来执行此操作,但出现错误:“DependencyError:AES 算法需要 PyCryptodome”。
我尝试用谷歌搜索任何其他模块,例如 pikepdf,但我只找到了如何使用它来破解密码,而不是实际设置密码。
有什么想法如何处理吗?我在该行收到错误:“ input_pdf = PdfFileReader(in_file) ”
file = directory + '\\passwords.xlsx'
df = pd.read_excel(file)
df['PDF'] = df.iloc[:,[0]] + '.pdf'
df = df.to_dict('records')
for i in df:
filename = i['PDF']
password = i['Password']
with open(filename, "rb") as in_file:
input_pdf = PdfFileReader(in_file)
output_pdf = PdfFileWriter()
output_pdf.appendPagesFromReader(input_pdf)
output_pdf.encrypt(password)
with open(filename, "wb") as out_file:
output_pdf.write(out_file)
Run Code Online (Sandbox Code Playgroud) 目前,如果我使用pyPdf和extractText()创建一个pdf页面的页面对象,那么会发生的是将这些行连接在一起.例如,如果页面的第1行显示"hello"而第2行显示"world",则从extractText()返回的结果文本是"helloworld"而不是"hello world".有谁知道如何解决这个问题,或者有解决方案的建议?我真的需要文本在行之间有空格,因为我正在对这个pdf文本进行文本挖掘,并且行之间没有空格导致它....
我想使用pyPdf基于轮廓分割pdf文件,其中轮廓中的每个目的地引用pdf中的不同页面.
示例大纲:
main --> points to page 1 sect1 --> points to page 1 sect2 --> points to page 15 sect3 --> points to page 22
pyPdf中很容易迭代文档的每个页面或文档大纲中的每个目标; 但是,我无法弄清楚如何获取目的地所指向的页码.
有人知道如何找到大纲中每个目的地的参考页码吗?
我在使用pyPdf合并两个PDF文件时遇到问题.当我运行以下代码时,水印(page1)看起来很好,但page2已顺时针旋转90度.
有什么想法发生了什么?

from pyPdf import PdfFileWriter, PdfFileReader
# PDF1: A4 Landscape page created in photoshop using PdfCreator,
input1 = PdfFileReader(file("base.pdf", "rb"))
page1 = input1.getPage(0)
# PDF2: A4 Landscape page, text only, created using Pisa (www.xhtml2pdf.com)
input2 = PdfFileReader(file("text.pdf", "rb"))
page2 = input2.getPage(0)
# Merge
page1.mergePage(page2)
# Output
output = PdfFileWriter()
output.addPage(page1)
outputStream = file("output.pdf", "wb")
output.write(outputStream)
outputStream.close()
Run Code Online (Sandbox Code Playgroud) pypdf ×10
python ×10
pdf ×4
python-3.x ×2
formatting ×1
landscape ×1
pdfminer ×1
pdfrw ×1
pikepdf ×1
text ×1