How to Convert PDF to JSON from Uploaded File Asynchronously using PDF to JSON API in Python and 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 codes on this page will show you how to create PDF to JSON API in Python. Web API was designed to assist PDF to JSON API in Python. 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 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 application mostly includes various stages of the software development so even if the functionality works please check it with your data and the production environment. Web API – free trial version is available on our website. Also, there are other code samples to help you with your Python application included into the trial version.

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 it’s output, then we’ll analyze code. Source code can be found at this git link also.

Source Code

""" 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 API_KEY = "******************************************" # Base URL for Web API requests BASE_URL = "" # 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 Web API""" # Prepare requests params as JSON # See documentation: 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 =, 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("%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()


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. API endpoint /file/upload/get-presigned-url is being used to upload file to This endpoint will return two URLs, Presigned URL and Output URL. Presigned URL is used to upload the actual file to 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, no of pages which needed to be converted, etc. Output of this request contains Job Id and JSON URL. Internally 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 endpoint /job/check. Job can have many statuses such as “working”, “success”, “failed”, “aborted” and “unknown”.

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 need. Please refer this documentations for more information.

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



Get 60 Day Free Trial

See also:


Get Your API Key

See also:

Related Pages:

Related Samples: