从 Python 中的假脱机 pdf 文件中提取超链接

Extract Hyperlink from a spool pdf file in Python

我正在从前端获取我的表单数据并使用快速 api 读取它,如下所示:

@app.post("/file_upload")
async def upload_file(pdf: UploadFile = File(...)):
    print("Content = ",pdf.content_type,pdf.filename,pdf.spool_max_size)
    return {"filename": "Succcess"}

现在我需要做的是在 pypdfextractor 的帮助下从这些假脱机文件中提取超链接,如下所示:

import pdfx
from os.path import exists
from config import availableUris
def getHrefsFromPDF(pdfPath:str)->dict:
    if not(exists(pdfPath)):
        raise FileNotFoundError("PDF File not Found")
    pdf = pdfx.PDFx(pdfPath)
    return pdf.get_references_as_dict().get('url',[])

但我不确定如何将假脱机文件(从 FAST API 接收)转换为 pdfx 可读文件格式。

此外,我还尝试研究了文件中的字节。当我尝试这样做时:

data = await pdf.read()

数据类型显示为:bytes 当我尝试使用 str 函数对其进行转换时,它给出了一个统一编码的编码字符串,这对我来说完全是胡言乱语,我还尝试使用“utf”进行解码-8" 抛出 UnicodeDecodeError。

快api给你一个SpooledTemporaryFile。如果 pdfx 中有一些 api 将在 File() 对象上工作,而不是表示路径 (!) 的 str,则您可以直接使用该文件对象。否则在磁盘上创建一个新的临时文件并使用它:

from tempfile import TemporaryDirectory
from pathlib import Path
import pdfx

@app.post("/file_upload")
async def upload_file(pdf: UploadFile = File(...)):
    with TemporaryDirectory() as d: #Adding the file into a temporary storage for re-reading purposes
        tmpf = Path(d) / "pdf.pdf"
        with tmpf.open("wb") as f:
            f.write(pdf.read())

        p = pdfx.PDFX(str(tmpf))
        ...

可能pdfx.PDFX会取一个Path对象。如果是这样,我会更新这个答案。为了方便起见,我一直保持读写循环同步,但如果有理由,您可以将其设为异步。

请注意,最好找到一种使用 SpooledTemporaryFile 执行此操作的方法。

关于显示为字节的数据:好吧,pdf(基本上)是二进制文件:您期望什么?