Django PDF парсер на POST запрос

Надеюсь на вашу помощь. Так как я уже долгое время бьюсь над этой проблемой. Из фронтенда приходит POST запрос с одним PDF файлом, после чего мне нужно сделать скриншот первой страницы, извлечь ее метаданные и сохранить все это в базе данных. На данный момент я переопределил метод POST и перехватываю JSON, который содержит PDF. Я передаю этот файл моей функции парсинга. Но кроме имени файла, функция не может найти файл. В чем может быть проблема?

view

import fitz as fitz
from rest_framework.views import APIView
from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.response import Response
from rest_framework import status
from .serializers import FileSerializer


def parce_pdf(test):
    doc = fitz.open(test)  # open document
    pixel = doc[0]  # page pdf
    pix = pixel.get_pixmap()  # render page to an image
    pix.save("media/page.png")  # store image as a PNG
    print(doc.metadata)


class FileView(APIView):
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, *args, **kwargs):
        file_serializer = FileSerializer(data=request.data)
        # test = request.data['file'].content_type
        test = request.data['file']
        # print(request.data.get)
        print(test)
        print(request.accepted_media_type)

        parce_pdf(test)
        print(file_serializer)
        # print(test)
        if file_serializer.is_valid():
            file_serializer.save()
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializer

from rest_framework import serializers
from .models import File


class FileSerializer(serializers.ModelSerializer):
    class Meta():
        model = File
        fields = ('file', 'remark', 'timestamp')

модели

from django.db import models


class File(models.Model):
    file = models.FileField(blank=False, null=False)
    remark = models.CharField(max_length=20)
    timestamp = models.DateTimeField(auto_now_add=True)

ОШИБКА введите здесь описание изображения

Проблема в том, что вы передаете только имя файла из внешнего интерфейса. Это должен быть либо FileObject, либо Stream.

Попробуйте сделать это после изменения внешнего кода.

def parce_pdf(test): # test is a file stream object
    doc = fitz.open('pdf', test)  # open document
    pixel = doc[0]  # page pdf
    pix = pixel.get_pixmap()  # render page to an image
    pix.save("media/page.png")  # store image as a PNG
    print(doc.metadata)


def post(self, request, *args, **kwargs):
    file_serializer = FileSerializer(data=request.data)
    # test = request.data['file'].content_type
    test = request.FILES['file'] # send file object from front-end
    print(test)
    print(request.accepted_media_type)
    parce_pdf(test)
    print(file_serializer)
    # print(test)
    if file_serializer.is_valid():
        file_serializer.save()
        return Response(file_serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Спасибо вам Nanthakumar J J за ваш ответ. У меня есть небольшое обновление в функции parce_pdf так как тест является объектом файлового потока, поэтому он выдал ошибку в строке doc = fitz.open('pdf', test). Обновленная функция выглядит следующим образом:

def parce_pdf(test):
    doc = fitz.open(stream=test.read(), filetype="pdf")  # this line is imporatant
    raw_text = ""
    for page in doc:
        raw_text = raw_text + str(page.getText())
    return raw_text

эта функция очень хорошо работает в моем проекте django.

Вернуться на верх