是否可以将pdf字节直接输入PyPDF2而不是先制作PDF文件

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

我使用的是Linux;将 raw 打印到端口 9100 返回“字节”类型。我想知道是否可以直接进入 PyPDF2,而不是先制作 pdf 文件并使用 PdfFileReader 方法?

感谢您的宝贵时间。

python python-3.x pypdf
3个回答
10
投票

PyPDF2.PdfFileReader()
将其第一个参数定义为:

stream – File 对象或支持类似于 File 对象的标准读取和查找方法的对象。也可以是表示 PDF 文件路径的字符串。

因此,您可以将任何数据传递给它,只要它可以作为类似文件的流进行访问即可。一个完美的候选人是

io.BytesIO()
。将收到的原始字节写入其中,然后返回到
0
,将对象传递给
PyPDF2.PdfFileReader()
,然后就完成了。


3
投票

是的,第一个评论正确。这是在不创建 pdf 文件的情况下生成 pdf 字节的代码示例:

import io
from typing import List

from PyPDF2 import PdfFileReader, PdfFileWriter


def join_pdf(pdf_chunks: List[bytes]) -> bytes:
    # Create empty pdf-writer object for adding all pages here
    result_pdf = PdfFileWriter()
    
    # Iterate for all pdf-bytes
    for chunk in pdf_chunks:
        # Read bytes
        chunk_pdf = PdfFileReader(
            stream=io.BytesIO(      # Create steam object
                initial_bytes=chunk
            )
        )
        # Add all pages to our result
        for page in range(chunk_pdf.getNumPages()):
            result_pdf.addPage(chunk_pdf.getPage(page))
    
    # Writes all bytes to bytes-stream
    response_bytes_stream = io.BytesIO()
    result_pdf.write(response_bytes_stream)
    return response_bytes_stream.getvalue()

3
投票

几年后,我将其添加到 pypdf 文档

from io import BytesIO
from pypdf import PdfReader, PdfWriter

# Prepare example
with open("example.pdf", "rb") as fh:
    bytes_stream = BytesIO(fh.read())

# Read from bytes_stream
reader = PdfReader(bytes_stream)

# Write to bytes_stream
writer = PdfWriter()
with BytesIO() as bytes_stream:
    writer.write(bytes_stream)

请注意:我已将答案从 PyPDF2 更改为 pypdf。我是这两个项目的维护者。 PyPDF2 已被弃用,所有改进均已合并到 pypdf 中。 pypdf 是正确的选择。

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