Pdf uploader Error FIle not found

Traceback (most recent call last):
File “apps/frappe/frappe/app.py”, line 53, in application
response = frappe.api.handle()
File “apps/frappe/frappe/api.py”, line 53, in handle
return RESTAPIHandler(call, doctype, name).get_response()
File “apps/frappe/frappe/api.py”, line 69, in get_response
return self.handle_method()
File “apps/frappe/frappe/api.py”, line 79, in handle_method
return frappe.handler.handle()
File “apps/frappe/frappe/handler.py”, line 48, in handle
data = execute_cmd(cmd)
File “apps/frappe/frappe/handler.py”, line 86, in execute_cmd
return frappe.call(method, **frappe.form_dict)
File “apps/frappe/frappe/init.py”, line 1591, in call
return fn(*args, **newargs)
File “apps/frappe/frappe/utils/typing_validations.py”, line 33, in wrapper
return func(*args, **kwargs)
File “apps/turiya_app/turiya_app/quiz.py”, line 66, in pdfconvertor
frappe.throw(
(“No file found”))
File “apps/frappe/frappe/init.py”, line 523, in throw
msgprint(
File “apps/frappe/frappe/init.py”, line 491, in msgprint
_raise_exception()
File “apps/frappe/frappe/init.py”, line 440, in _raise_exception
raise raise_exception(msg)
frappe.exceptions.ValidationError: No file found

This is my code

Please upload pdf here

<form id="upload-form" method="post" enctype="multipart/form-data">
  <!-- <label for="file">Choose file:</label> -->
  <input type="file" id="file" name="file" accept=".pdf" />
  <input type="submit" value="Upload" id="upload-button" disabled />
</form>

<div id="errordisplay"></div>

after uploading pdf i summarize the data in that file. it works in another frappe-bench. Here it always gives the above error. same code only. How to solve. I tried bench update --reset also

this is my python code

@frappe.whitelist(allow_guest=True)
def pdfconvertor():
if ‘file’ in frappe.request.files:
file = frappe.request.files[‘file’]
# Read the PDF and extract data
text = read_pdf(file)
# return text
# Clean the extracted text
# cleaned_text = clean_data(text)
# Summarize the cleaned text
summarized_text = summarize_text_with_sumy(text, 20) # Adjust the second parameter to change the number of sentences in the summary
return summarized_text
else:
frappe.throw(_(“No file found”))

@frappe.whitelist(allow_guest=True)
def read_pdf(file):
resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager, fake_file_handle, laparams=LAParams())
page_interpreter = PDFPageInterpreter(resource_manager, converter)

for page in PDFPage.get_pages(BytesIO(file.read()), set()):
    page_interpreter.process_page(page)

text = fake_file_handle.getvalue()
converter.close()
fake_file_handle.close()

if text:
    return text

please help on that. thankyou

Where are you calling your upload API? Because it is not in the form action, so you might be manually calling it with the file, can you share that part?

This is my html code sir

<form id="upload-form" method="post" enctype="multipart/form-data">
  <!-- <label for="file">Choose file:</label> -->
  <input type="file" id="file" name="file" accept=".pdf" />
  <input type="submit" value="Upload" id="upload-button" disabled />
</form>

<div id="errordisplay"></div>

<script>
  let currentUrl = window.location.href;
  let baseUrl = currentUrl.split("/")[0] + "//" + currentUrl.split("/")[2];

  // Add event listener for file input
  document.getElementById("file").addEventListener("change", function () {
    // If a file is selected, enable the submit button
    if (this.files && this.files[0]) {
      document.getElementById("upload-button").disabled = false;
    }
  });

  document
    .getElementById("upload-form")
    .addEventListener("submit", function (event) {
      event.preventDefault();
      var formData = new FormData(event.target);
      frappe.msgprint('<span class="blink">Wait For Response</span>');

      fetch(`${baseUrl}/api/method/turiya_app.pdf.pdfconvertor`, {
        method: "POST",
        body: formData,
      })
        .then((response) => response.json())
        .then((data) => {
          var displayDiv = document.getElementById("errordisplay");
          displayDiv.innerHTML = data.message;

          if (
            typeof data.message === "undefined" ||
            data.message.trim() === ""
          ) {
            displayDiv.innerHTML = "No valid response was received.";
            displayDiv.innerHTML.style.display = "block";
            return; // Exit from the function if the response is not valid
          }

          displayDiv.innerHTML = data.message;

          var formData = {
            doctype: "PdfData",
            data: `${data.message}`,
          };

          $.ajax({
            url: `${baseUrl}/api/method/turiya_app.pdf.create_quiz_pdfdata`,
            type: "POST",
            data: JSON.stringify(formData),
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            headers: {
              "X-Frappe-CSRF-Token": window.frappe.csrf_token,
            },
            success: function (data) {
              var name = data.message.name;

              // Again, check if name is undefined or empty
              if (typeof name === "undefined" || name.trim() === "") {
                displayDiv.innerHTML = "No valid response was received.";
                displayDiv.innerHTML.style.display = "block";
                return; // Exit from the function if the response is not valid
              }

              var timestamp = new Date().getTime(); // Generate a unique timestamp

              // Construct the URL with the name and timestamp parameters
              var url = `/quizPdf/new?message=${encodeURIComponent(name)}`;

              window.location.href = url;
            },
            error: function (jqXHR, textStatus, errorThrown) {
              displayDiv.innerHTML = "Error: " + textStatus;
              displayDiv.innerHTML.style.display = "block";
            },
          });
        })
        .catch((error) => {
          console.log("pdf");
          console.error("Error:", error);
        });
    });
</script>

I created a pdf.py file. This is my python code
from PyPDF2 import PdfFileReader
from io import BytesIO
import frappe
import re
from frappe.utils.file_manager import save_file as frappe_save_file

from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
import io

DIRECT SUMMARIZER

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.kl import KLSummarizer

@frappe.whitelist(allow_guest=True)
def pdfconvertor():
if ‘file’ in frappe.request.files:
file = frappe.request.files[‘file’]
# Read the PDF and extract data
text = read_pdf(file)
# return text
# Clean the extracted text
# cleaned_text = clean_data(text)
# Summarize the cleaned text
summarized_text = summarize_text_with_sumy(text, 20) # Adjust the second parameter to change the number of sentences in the summary
return summarized_text
else:
frappe.throw(_(“No file found”))

@frappe.whitelist(allow_guest=True)
def read_pdf(file):
resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager, fake_file_handle, laparams=LAParams())
page_interpreter = PDFPageInterpreter(resource_manager, converter)

for page in PDFPage.get_pages(file.stream, set()):
    page_interpreter.process_page(page)

text = fake_file_handle.getvalue()
converter.close()
fake_file_handle.close()

if text:
    return text

KL SUMMARIZER

@frappe.whitelist(allow_guest=True)
def summarize_text_with_sumy(text, sentences_count):
parser = PlaintextParser.from_string(text, Tokenizer(“english”))
summarizer = KLSummarizer()
summary = summarizer(parser.document, sentences_count)
return " ".join(str(sentence) for sentence in summary)

@frappe.whitelist(allow_guest=True)
def create_survey_pdfdata():
data =frappe.request.get_json()
if not data:
frappe.throw(_(“Invalid JSON data”))
doc = frappe.new_doc(“PdfData”)
doc.update(data)
doc.insert(ignore_permissions=True)
frappe.db.commit()
return {“name”: doc.name}

@frappe.whitelist(allow_guest=True)
def get_survey_pdfdata(pdfId):
pdfData =frappe.db.get_all(‘PdfData’,filters={‘name’:pdfId},fields=[“data”])
return{‘pdfdata’:pdfData}

@frappe.whitelist(allow_guest=True)
def create_quiz_pdfdata():
data =frappe.request.get_json()
if not data:
frappe.throw(_(“Invalid JSON data”))
doc = frappe.new_doc(“PdfData”)
doc.update(data)
doc.insert(ignore_permissions=True)
frappe.db.commit()
return {“name”: doc.name}

@frappe.whitelist(allow_guest=True)
def get_quiz_pdfdata(pdfId):
pdfData =frappe.db.get_all(‘PdfData’,filters={‘name’:pdfId},fields=[“data”])
return{‘pdfdata’:pdfData}

Sir. For one frappe i am using http. For another frappe-bench i added ssl. There only it causes error. Some times it shows csrf_token error? But for other files no error. for only this pdf uploader it causers csrf_token. while i open the error in new tab. it shows file_not found some time. Validation error some time. Please help to solve this Thankyou sir @buildwithhussain