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.