我可以通过pyPdf使用以下代码读取xmp元数据:
a = pyPdf.PdfFileReader(open(self.fileName))
b = a.getXmpMetadata()
c = b.pdf_keywords
Run Code Online (Sandbox Code Playgroud)
但是:这是最好的方法吗?
如果我不使用pdf_keywords属性?
有没有办法用pyPdf设置这些metadatas?
pyPdf是一个很好的库,可以拆分,合并PDF文件.我用它将pdf文档分成1页文档.pyPdf是纯python,在保存提取的页面时,在PdfFileWriter对象的_sweepIndirectReferences()方法中花费了大量的时间.我需要一些性能更好的东西.我尝试过使用多线程,但由于大部分时间花在python代码上,因为GIL没有速度增加(实际上运行速度较慢).
是否有用c编写的库提供相同的功能?或者是否有人对如何提高性能有很好的了解(除了为每个我要拆分的pdf文件生成一个新进程)
先感谢您.
跟进.链接到几个命令行解决方案,有时可以证明比pyPDF更快:
我修改了pyPDF PdfWriter类来跟踪_sweepIndirectReferences()方法花了多少时间.如果它太长了(现在我使用3秒的魔法值)然后我通过从python调用它来恢复使用ghostscript.
谢谢你的所有答案.(codelogic的xpdf参考是让我寻找不同方法的参考)
我有一个 pdf 文件,我想替换 pdf 文件中的一些文本并生成新的 pdf。我怎么能在python中做到这一点?我试过 reportlab ,reportlab 没有任何功能来搜索文本和替换它。我可以使用什么其他模块?
我正在尝试通过以下方式在 python 中读取 Pdf 文件:
from PyPDF2 import PdfFileReader, PdfFileWriter
test_reader = PdfFileReader(file("test.pdf", "rb"))
Run Code Online (Sandbox Code Playgroud)
上面的行抛出错误:
PyPDF2.utils.PdfReadError: Could not find xref table at specified location
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
我正在尝试使用 PyPDF2从 PDF ( https://www.sec.gov/litigation/admin/2015/34-76574.pdf ) 中提取文本,我得到的唯一结果是以下字符串:
b''
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import PyPDF2
import urllib.request
import io
url = 'https://www.sec.gov/litigation/admin/2015/34-76574.pdf'
remote_file = urllib.request.urlopen(url).read()
memory_file = io.BytesIO(remote_file)
read_pdf = PyPDF2.PdfFileReader(memory_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(1)
page_content = page.extractText()
print(page_content.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
此代码在我正在使用的一些 PDF 上正常工作(例如https://www.sec.gov/litigation/admin/2016/34-76837-proposed-amended-distribution-plan.pdf),但是其他像上面的文件不起作用。知道出了什么问题吗?
我正在尝试修改 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)