标签: pypdf

通过pypdf在pdf文件上读/写xmp metadatas

我可以通过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?

python pdf xmp metadata pypdf

6
推荐指数
1
解决办法
2312
查看次数

快速PDF分割器库

pyPdf是一个很好的库,可以拆分,合并PDF文件.我用它将pdf文档分成1页文档.pyPdf是纯python,在保存提取的页面时,在PdfFileWriter对象的_sweepIndirectReferences()方法中花费了大量的时间.我需要一些性能更好的东西.我尝试过使用多线程,但由于大部分时间花在python代码上,因为GIL没有速度增加(实际上运行速度较慢).

是否有用c编写的库提供相同的功能?或者是否有人对如何提高性能有很好的了解(除了为每个我要拆分的pdf文件生成一个新进程)

先感谢您.

跟进.链接到几个命令行解决方案,有时可以证明比pyPDF更快:

我修改了pyPDF PdfWriter类来跟踪_sweepIndirectReferences()方法花了多少时间.如果它太长了(现在我使用3秒的魔法值)然后我通过从python调用它来恢复使用ghostscript.

谢谢你的所有答案.(codelogic的xpdf参考是让我寻找不同方法的参考)

c python pdf pypdf

6
推荐指数
1
解决办法
2222
查看次数

Python:如何替换pdf中的文本

我有一个 pdf 文件,我想替换 pdf 文件中的一些文本并生成新的 pdf。我怎么能在python中做到这一点?我试过 reportlab ,reportlab 没有任何功能来搜索文本和替换它。我可以使用什么其他模块?

python pdf reportlab pypdf

6
推荐指数
1
解决办法
1万
查看次数

PdfFileReader:PdfReadError:无法在指定位置找到外部参照表

我正在尝试通过以下方式在 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)

任何帮助将不胜感激

python pypdf

6
推荐指数
1
解决办法
2万
查看次数

PyPDF2 不会从 PDF 中提取所有文本

我正在尝试使用 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),但是其他像上面的文件不起作用。知道出了什么问题吗?

python pdf pypdf python-3.x

6
推荐指数
2
解决办法
3万
查看次数

为什么 PyPDF2.PdfFileWriter 忘记我对文档所做的更改?

我正在尝试修改 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)

python pdf pdf-generation pypdf python-3.x

6
推荐指数
1
解决办法
3432
查看次数

如何使用python提取图像和图像BBox坐标?

我正在尝试使用图像的 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-

python pypdf pdf-extraction pdfrw

6
推荐指数
1
解决办法
1万
查看次数

如何在Python 3中删除pdf中的注释

我最初的目标是删除 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)

有没有办法去掉注释?或者任何可以帮助我摆脱白边的建议。

python pypdf python-3.x

6
推荐指数
1
解决办法
3770
查看次数

将边界框中的pdf文本直接提取到python中

我正在尝试在给定的边界矩形内提取 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 中执行此操作,因为我有大量针对同一个总体项目的其他代码。

python pdf text-extraction pypdf pdfminer

6
推荐指数
1
解决办法
1万
查看次数

使用 PDF 注释更改字体类型/大小

我正在将数据写入带有命名字段的 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)

python pypdf

6
推荐指数
1
解决办法
1909
查看次数