How to Convert PDF to JSON from Uploaded File Asynchronously using PDF to JSON API in Python and PDF.co Web API

Step-by-Step Tutorial: How to Convert PDF to JSON from Uploaded File Asynchronously to Have PDF to JSON API in Python

The sample source code on this page will show you how to create PDF to JSON API in Python. PDF.co Web API was designed to assist PDF to JSON API in Python. PDF.co Web API is the flexible Web API that includes a full set of functions from e-signature requests to data extraction, OCR, image recognition, PDF splitting, and PDF merging. Can also generate barcodes and read barcodes from images, scans, and PDF.

The Python code snippet like this for PDF.co Web API works best when you need to quickly implement PDF to JSON API in your Python application. Open your Python project and simply copy & paste the code and then run your app! Writing Python applications mostly includes various stages of the software development so even if the functionality works please check it with your data and the production environment.

PDF.co Web API – there are other code samples to help you with your Python application.

On-demand (REST Web API) version:
 Web API (on-demand version)

On-premise offline SDK for Windows:
 60 Day Free Trial (on-premise)

Let’s review source code and its output, then we’ll analyze the code. The source code can be found at this git link also.

Source Code

ConvertPdfToJsonFromUploadedFileAsynchronously.py

      
""" Cloud API asynchronous "PDF To Text" job example. Allows avoiding timeout errors when processing huge or scanned PDF documents. """ import os import requests # pip install requests import time import datetime # The authentication key (API Key). # Get your own by registering at https://app.pdf.co/documentation/api API_KEY = "******************************************" # Base URL for PDF.co Web API requests BASE_URL = "https://api.pdf.co/v1" # Source PDF file SourceFile = ".\\sample.pdf" # Comma-separated list of page indices (or ranges) to process. Leave empty for all pages. Example: '0,2-5,7-'. Pages = "" # PDF document password. Leave empty for unprotected documents. Password = "" # Destination JSON file name DestinationFile = ".\\result.json" # (!) Make asynchronous job Async = True def main(args = None): uploadedFileUrl = uploadFile(SourceFile) if (uploadedFileUrl != None): convertPdfToJson(uploadedFileUrl, DestinationFile) def convertPdfToJson(uploadedFileUrl, destinationFile): """Converts PDF To Json using PDF.co Web API""" # Prepare requests params as JSON # See documentation: https://apidocs.pdf.co parameters = {} parameters["async"] = Async parameters["name"] = os.path.basename(destinationFile) parameters["password"] = Password parameters["pages"] = Pages parameters["url"] = uploadedFileUrl # Prepare URL for 'PDF To Json' API request url = "{}/pdf/convert/to/json".format(BASE_URL) # Execute request and get response as JSON response = requests.post(url, data=parameters, headers={ "x-api-key": API_KEY }) if (response.status_code == 200): json = response.json() if json["error"] == False: # Asynchronous job ID jobId = json["jobId"] # URL of the result file resultFileUrl = json["url"] # Check the job status in a loop. # If you don't want to pause the main thread you can rework the code # to use a separate thread for the status checking and completion. while True: status = checkJobStatus(jobId) # Possible statuses: "working", "failed", "aborted", "success". # Display timestamp and status (for demo purposes) print(datetime.datetime.now().strftime("%H:%M.%S") + ": " + status) if status == "success": # Download result file r = requests.get(resultFileUrl, stream=True) if (r.status_code == 200): with open(destinationFile, 'wb') as file: for chunk in r: file.write(chunk) print(f"Result file saved as \"{destinationFile}\" file.") else: print(f"Request error: {response.status_code} {response.reason}") break elif status == "working": # Pause for a few seconds time.sleep(3) else: print(status) break else: # Show service reported error print(json["message"]) else: print(f"Request error: {response.status_code} {response.reason}") def checkJobStatus(jobId): """Checks server job status""" url = f"{BASE_URL}/job/check?jobid={jobId}" response = requests.get(url, headers={ "x-api-key": API_KEY }) if (response.status_code == 200): json = response.json() return json["status"] else: print(f"Request error: {response.status_code} {response.reason}") return None def uploadFile(fileName): """Uploads file to the cloud""" # 1. RETRIEVE PRESIGNED URL TO UPLOAD FILE. # Prepare URL for 'Get Presigned URL' API request url = "{}/file/upload/get-presigned-url?contenttype=application/octet-stream&name={}".format( BASE_URL, os.path.basename(fileName)) # Execute request and get response as JSON response = requests.get(url, headers={ "x-api-key": API_KEY }) if (response.status_code == 200): json = response.json() if json["error"] == False: # URL to use for file upload uploadUrl = json["presignedUrl"] # URL for future reference uploadedFileUrl = json["url"] # 2. UPLOAD FILE TO CLOUD. with open(fileName, 'rb') as file: requests.put(uploadUrl, data=file, headers={ "x-api-key": API_KEY, "content-type": "application/octet-stream" }) return uploadedFileUrl else: # Show service reported error print(json["message"]) else: print(f"Request error: {response.status_code} {response.reason}") return None if __name__ == '__main__': main()

Output:

Now that we’ve reviewed the source code and the output image, let’s analyze the code a bit. We can divide this code into three logical sections which are Uploading File, Converting PDF to JSON and Checking JSON conversion status periodically.

PDF.co API endpoint /file/upload/get-presigned-url is being used to upload the file to PDF.co. This endpoint will return two URLs, Presigned URL and Output URL. Presigned URL is used to upload the actual file to PDF.co using PUT request, where Output URL contains public URL for uploaded PDF file.

To convert PDF to JSON format we’re using /pdf/convert/to/json endpoint with Async mode enabled. Other parameters we’re passing are input PDF URL, number of the pages needed to be converted, etc. The output of this request contains Job Id and JSON URL. Internally, PDF.co creates new job marked by this JobId to process PDF, and once the job is completed successfully, the JSON output URL will have data.

Job can be checked by PDF.co endpoint /job/check. Job can have many statuses such as “working”, “success”, “failed”, “aborted” and “unknown”.

The output JSON data have all PDF data including text co-ordinates, font information, color, etc. Scenario converted in this program is very basic, we can configure the API request with advanced parameters also as per our needs. Please refer this documentations for more information.

To get most out of this article please try to do this demo in your machine. Thank you for reading!

VIDEO

ON-PREMISE OFFLINE SDK

Get 60 Day Free Trial

See also:

ON-DEMAND REST WEB API

Get Your API Key

See also:

Related Pages:

Related Samples: