PDF.co provides a restful API to read the barcode input file and extract its value. In this article, we’ll explore the following programs to get a better understanding of PDF.co barcode reader API.
Before we jump into programs let’s get an overview of barcode reader API.
URL: | https://api.pdf.co/v1/barcode/read/from/url |
Read barcodes from images, tiff, pdf documents, scanned documents. All popular types of barcodes are supported from Code 39, Code 128 to QR Code, Datamatrix, and PDF417. Supports noisy and damaged barcodes, scans, documents. GET or POST request. |
Param | Description |
async | Optional.
Runs processing asynchronously. Returns Use JobId that you may use with /job/check to check the state of the processing (possible states: working, failed, aborted, and success). Must be one of true, false. |
types | Optional.
A comma-separated list of barcode types to decode. Valid types: AustralianPostCode, Aztec, CircularI2of5, Codabar, CodablockF, Code128, Code16K, Code39, Code39Extended, Code39Mod43, Code39Mod43Extended, Code93, DataMatrix, EAN13, EAN2, EAN5, EAN8, GS1, GS1DataBarExpanded, GS1DataBarExpandedStacked, GS1DataBarLimited, GS1DataBarOmnidirectional, GS1DataBarStacked, GTIN12, GTIN13, GTIN14, GTIN8, IntelligentMail, Interleaved2of5, ITF14, MaxiCode, MICR, MicroPDF, MSI, PatchCode, PDF417, Pharmacode, PostNet, PZN, QRCode, RoyalMail, RoyalMailKIX, Trioptic, UPCA, UPCE, UPU. Must be a String. |
file | Optional.
Source barcodes file. |
url | Optional.
URL of the image or pdf file to decode barcodes from. Must be a String. |
pages | Optional.
A comma-separated list of page indices (or ranges) to process. IMPORTANT: the very first page starts at 0 (zero). To set a range use the dash -, for example, 0,2-5,7-. To set a range from the index to the last page use range like this: 2- (from page #3 as the index starts at zero and till the of the document). For ALL pages just leave this param empty. Example: 0,2-5,7- means first page, then 3rd page to 6th page, and then the range from 8th (index = 7) page till the end of the document. Must be a String. |
Code | Description |
200 | All is OK |
400 | Bad input parameters |
401 | Unauthorized |
403 | Not enough credits |
405 | Timeout error.
To process large documents or files please use asynchronous mode ( set an async parameter to true) and then check the status using /job/check endpoint. If a file contains many pages then specify a page range using pages parameter. The number of pages of the document can be obtained using the endpoint /pdf/info |
Sample Request:
! Don’t forget to set x-api-key param or header param to an API key, get yours here
POST
{ "types" : "Code128,Code39,Interleaved2of5,EAN13", "pages" : "", "url" : "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf" }
Response Code: 200
Response
{ "barcodes": [ { "Value": "test123", "RawData": null, "Type": 2, "Rect": "{X=111,Y=60,Width=255,Height=37}", "Page": 0, "File": "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf", "Confidence": 0.90625155, "TypeName": "Code128" }, { "Value": "123456", "RawData": null, "Type": 4, "Rect": "{X=111,Y=129,Width=306,Height=37}", "Page": 0, "File": "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf", "Confidence": 0.7710818, "TypeName": "Code39" }, { "Value": "&<FNC1&>0112345678901231", "RawData": null, "Type": 2, "Rect": "{X=111,Y=198,Width=305,Height=37}", "Page": 0, "File": "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf", "Confidence": 0.9156459, "TypeName": "Code128" }, { "Value": "12345670", "RawData": [ 1, 2, 3, 4, 5, 6, 7, 0 ], "Type": 5, "Rect": "{X=111,Y=267,Width=182,Height=0}", "Page": 0, "File": "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf", "Confidence": 1, "TypeName": "I2of5" }, { "Value": "1234567890128", "RawData": null, "Type": 6, "Rect": "{X=102,Y=336,Width=71,Height=72}", "Page": 0, "File": "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf", "Confidence": 0.895925164, "TypeName": "EAN13" } ], "pageCount": 1, "error": false, "status": 200, "name": null }
Now back to programs. Programs in this article are written in node.js, so if you want to code along you’ll need node.js installed on your machine. You can get node.js from its official website. For the code editor, I’ll be using Visual Studio Code, it’s one of the best open-source code editors available.
Also, all PDF.co APIs requires API-keys to be passed in the method header for authentication purpose. You can get your own keys by registering at https://app.pdf.co/signup.
With all this done let’s get started.
In this example, we’ll demonstrate how to read barcode values by input pdf URL.
For input, we are using the following pdf file URL.
https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf
Its content is as below.
The source program is as follows.
var https = require("https"); // The authentication key (API Key). // Get your own by registering at https://app.pdf.co/documentation/api const API_KEY = "***********************************"; // Direct URL of source file to search barcodes in. const SourceFileUrl = "https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/barcode-reader/sample.pdf"; // Comma-separated list of barcode types to search. // See valid barcode types in the documentation https://app.pdf.co/documentation/api/1.0/barcode/read_from_url.html const BarcodeTypes = "Code128,Code39,Interleaved2of5,EAN13"; // Comma-separated list of page indices (or ranges) to process. Leave empty for all pages. Example: '0,2-5,7-'. const Pages = ""; // Prepare request to `Barcode Reader` API endpoint var queryPath = `/v1/barcode/read/from/url?types=${BarcodeTypes}&pages=${Pages}&url=${SourceFileUrl}`; var reqOptions = { host: "api.pdf.co", path: encodeURI(queryPath), headers: { "x-api-key": API_KEY } }; // Send request https.get(reqOptions, (response) => { response.on("data", (d) => { // Set utf8 encoding response.setEncoding("utf8"); // Parse JSON response var data = JSON.parse(d); if (data.error == false) { // Display found barcodes in console data.barcodes.forEach((element) => { console.log("Found barcode:"); console.log(" Type: " + element.TypeName); console.log(" Value: " + element.Value); console.log(" Document Page Index: " + element.Page); console.log(" Rectangle: " + element.Rect); console.log(" Confidence: " + element.Confidence); console.log(""); }, this); } else { // Service reported error console.log(data.message); } }); }).on("error", (e) => { // Request error console.error(e); });
And the output is as below.
If we analyze this program, the Program can be divided into three logical parts.
At the start of the program, we’ve listed out all the needed parameters in the API query, as shown in the table below.
Parameter | Usage |
API_KEY | Authentication key |
SourceFileUrl | URL of source file to search barcodes into |
BarcodeTypes | All the barcode types to look for in a comma-separated format. Example input might look like “Code128,Code39,Interleaved2of5,EAN13”. |
Pages | This parameter contains a comma-separated list of page indices (or ranges) to process. If we want to search in all pages then leave this blank. Valid input might look like “0,2-5,7-“. |
Then we’re creating a query path for the ‘Barcode Reader‘ API endpoint, and also creating request options. In the request options’ header, we’re providing an API key for authenticating an API request.
// Prepare request to `Barcode Reader` API endpoint var queryPath = `/v1/barcode/read/from/url?types=${BarcodeTypes}pages=${Pages}url=${SourceFileUrl}`; var reqOptions = { host: "api.pdf.co", path: encodeURI(queryPath), headers: { "x-api-key": API_KEY } };
In this step, we’re sending barcode reading requests by passing reqOptions which we set, and waiting for its response. We’ve enabled data events on the response so that whenever its response is received, further operations will be executed.
// Send request https.get(reqOptions, (response) => { response.on("data", (d) => { ...
Here, we first convert the response to JSON format; so that it will be convenient to read and process output data further.
// Parse JSON response var data = JSON.parse(d);
Next, we’ll check whether it does not error out by checking the error property inside the data variable (data.error) property. And if doesn’t error out we’ll loop through the response and display all barcode output in the console.
// Display found <a href="https://bytescout.com/blog/zapier-integration-barcode-reading.html" target="_blank" rel="noopener">barcodes</a> in console data.barcodes.forEach((element) => { console.log("Found barcode:"); console.log(" Type: " + element.TypeName); console.log(" Value: " + element.Value); console.log(" Document Page Index: " + element.Page); console.log(" Rectangle: " + element.Rect); console.log(" Confidence: " + element.Confidence); console.log(""); }, this);
This program is mostly similar to the previous one, the only difference is that we’re uploading an input pdf file here. In the previous example, we provided the input URL of a PDF file.
The input is as below:
The program is as follows.
var fs = require("fs"); // `request` module is required for file upload. // Use "npm install request" command to install. var request = require("request"); // The authentication key (API Key). // Get your own by registering at https://app.pdf.co/documentation/api const API_KEY = "******************************"; // Source file name const SourceFile = "./sample.pdf"; // Comma-separated list of barcode types to search. // See valid barcode types in the documentation https://app.pdf.co/documentation/api/1.0/barcode/read_from_url.html const BarcodeTypes = "Code128,Code39,Interleaved2of5,EAN13"; // Comma-separated list of page indices (or ranges) to process. Leave empty for all pages. Example: '0,2-5,7-'. const Pages = ""; // Prepare request to `Barcode Reader` API endpoint var query = `https://api.pdf.co/v1/barcode/read/from/url`; let reqOptions = { uri: query, headers: { "x-api-key": API_KEY }, formData: { types: BarcodeTypes, pages: Pages, file: fs.createReadStream(SourceFile) } }; // Send request request.post(reqOptions, function (error, response, body) { if (error) { return console.error("Error: ", error); } // Parse JSON response let data = JSON.parse(body); data.barcodes.forEach((element) => { console.log("Found barcode:"); console.log(" Type: " + element["TypeName"]); console.log(" Value: " + element["Value"]); console.log(" Document Page Index: " + element["Page"]); console.log(" Rectangle: " + element["Rect"]); console.log(" Confidence: " + element["Confidence"]); console.log(); }, this); });
The output is as below:
In this program, we’re passing file content as a form of data into the ‘file’ parameter. We are using the file stream’s method createReadStream by passing the file path as an argument, which will create a PDF stream synchronously.
// Prepare request to `Barcode Reader` API endpoint var query = `https://api.pdf.co/v1/barcode/read/from/url`; let reqOptions = { uri: query, headers: { "x-api-key": API_KEY }, formData: { types: BarcodeTypes, pages: Pages, file: fs.createReadStream(SourceFile) } };
PDF.co provides support for asynchronous processing of requests by providing the ‘async’ parameter to true. This asynchronous request outputs a job, and we have to check the status of that job by calling it periodically until it completes.
This approach is very useful when we are having requests which are very time-consuming to process. For example, if we are having a big PDF file and we have to extract all barcodes from all pages in that PDF, then asynchronous processing is our go-to approach.
For this program, we are having an input file as following.
Our program is as below.
var https = require("https"); var fs = require("fs"); // `request` module is required for file upload. // Use "npm install request" command to install. var request = require("request"); // The authentication key (API Key). // Get your own by registering at https://app.pdf.co/documentation/api const API_KEY = "******************************"; // Source file name const SourceFile = "./sample.pdf"; // Comma-separated list of barcode types to search. // See valid barcode types in the documentation https://app.pdf.co/documentation/api/1.0/barcode/read_from_url.html const BarcodeTypes = "Code128,Code39,Interleaved2of5,EAN13"; // Comma-separated list of page indices (or ranges) to process. Leave empty for all pages. Example: '0,2-5,7-'. const Pages = ""; // Prepare request uri for `Barcode Reader` API endpoint var query = `https://api.pdf.co/v1/barcode/read/from/url`; let reqOptions = { uri: query, headers: { "x-api-key": API_KEY }, formData: { types: BarcodeTypes, pages: Pages, async: 'True', file: fs.createReadStream(SourceFile) } }; // Send request request.post(reqOptions, function (error, response, body) { if (error) { return console.error("Error: ", error); } // Parse JSON response let data = JSON.parse(body); console.log(`Job #${data.jobId} has been created!`); checkIfJobIsCompleted(data.jobId, data.url); }); function checkIfJobIsCompleted(jobId, resultFileUrlJson) { let queryPath = `/v1/job/check?jobid=${jobId}`; let reqOptions = { host: "api.pdf.co", path: encodeURI(queryPath), method: "GET", headers: { "x-api-key": API_KEY } }; https.get(reqOptions, (response) => { response.on("data", (d) => { response.setEncoding("utf8"); // Parse JSON response let data = JSON.parse(d); console.log(`Checking Job #${jobId}, Status: ${data.status}, Time: ${new Date().toLocaleString()}`); if (data.status == "working") { // Check again after 3 seconds setTimeout(function(){ checkIfJobIsCompleted(jobId, resultFileUrlJson);}, 3000); } else if (data.status == "success") { request({ method: 'GET', uri: resultFileUrlJson, gzip: true }, function (error, response, body) { // Parse JSON response let respJsonFileArray = JSON.parse(body); respJsonFileArray.forEach((element) => { console.log("Found barcode:"); console.log(" Type: " + element["TypeName"]); console.log(" Value: " + element["Value"]); console.log(" Document Page Index: " + element["Page"]); console.log(" Rectangle: " + element["Rect"]); console.log(" Confidence: " + element["Confidence"]); console.log(); }, this); }); } else { console.log(`Operation ended with status: "${data.status}".`); } }) }); }
And the output is as follows:
We have enabled the async operation to true here.
formData: { types: BarcodeTypes, pages: Pages, async: 'True', file: fs.createReadStream(SourceFile) }
Now after sending the request, it’ll return us a job. In this example, we’re using response JobID and job’s URL to periodically check job status by calling the checkIfJobIsCompleted method.
// Send request request.post(reqOptions, function (error, response, body) { if (error) { return console.error("Error: ", error); } // Parse JSON response let data = JSON.parse(body); console.log(`Job #${data.jobId} has been created!`); checkIfJobIsCompleted(data.jobId, data.url); });
Function checkIfJobIsCompleted internally calls job check API (/v1/job/check) to check request processing status. And once its status is Success we’ll get job response and display output.
In order to get more detail regarding job/check API, refer to this URL.
That’s all guys. I hope you enjoyed this article and had good insight into PDF.co barcode reading API. For more information regarding PDF.co APIs, you can visit its documentation here.
You may also try online barcode reader for daily non-programming tasks.
Happy Coding 🙂