Image-to-PDF API
The image-to-PDF API enables you to convert supported image formats (JPG, PNG, GIF, TIFF, and more) to PDF documents.
Converting a single image to PDF
Convert a single image to a PDF by placing a page1.jpg file in the same folder as your code. You can use any image or use our provided sample page.
Run the code to generate a result.pdf file with your image converted to PDF:
curl -X POST https://api.nutrient.io/build \ -H "Authorization: Bearer your_api_key_here" \ -o result.pdf \ --fail \ -F page1.jpg=@/path/to/page1.jpg \ -F instructions='{ "parts": [ { "file": "page1.jpg" } ] }'curl -X POST https://api.nutrient.io/build ^ -H "Authorization: Bearer your_api_key_here" ^ -o result.pdf ^ --fail ^ -F page1.jpg=@/path/to/page1.jpg ^ -F instructions="{\"parts\": [{\"file\": \"page1.jpg\"}]}"package com.example.pspdfkit;
import java.io.File;import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Files;import java.nio.file.StandardCopyOption;
import org.json.JSONArray;import org.json.JSONObject;
import okhttp3.MediaType;import okhttp3.MultipartBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;
public final class PspdfkitApiExample { public static void main(final String[] args) throws IOException { final RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart( "page1.jpg", "/path/to/page1.jpg", RequestBody.create( MediaType.parse("image/jpeg"), new File("/path/to/page1.jpg") ) ) .addFormDataPart( "instructions", new JSONObject() .put("parts", new JSONArray() .put(new JSONObject() .put("file", "page1.jpg") ) ).toString() ) .build();
final Request request = new Request.Builder() .url("https://api.nutrient.io/build") .method("POST", body) .addHeader("Authorization", "Bearer your_api_key_here") .build();
final OkHttpClient client = new OkHttpClient() .newBuilder() .build();
final Response response = client.newCall(request).execute();
if (response.isSuccessful()) { Files.copy( response.body().byteStream(), FileSystems.getDefault().getPath("result.pdf"), StandardCopyOption.REPLACE_EXISTING ); } else { // Handle the error. throw new IOException(response.body().string()); } }}using System;using System.IO;using System.Net;using RestSharp;
namespace PspdfkitApiDemo{ class Program { static void Main(string[] args) { var client = new RestClient("https://api.nutrient.io/build");
var request = new RestRequest(Method.POST) .AddHeader("Authorization", "Bearer your_api_key_here") .AddFile("page1.jpg", "/path/to/page1.jpg") .AddParameter("instructions", new JsonObject { ["parts"] = new JsonArray { new JsonObject { ["file"] = "page1.jpg" } } }.ToString());
request.AdvancedResponseWriter = (responseStream, response) => { if (response.StatusCode == HttpStatusCode.OK) { using (responseStream) { using var outputFileWriter = File.OpenWrite("result.pdf"); responseStream.CopyTo(outputFileWriter); } } else { var responseStreamReader = new StreamReader(responseStream); Console.Write(responseStreamReader.ReadToEnd()); } };
client.Execute(request); } }}// This code requires Node.js. Do not run this code directly in a web browser.
const axios = require('axios')const FormData = require('form-data')const fs = require('fs')
const formData = new FormData()formData.append('instructions', JSON.stringify({ parts: [ { file: "page1.jpg" } ]}))formData.append('page1.jpg', fs.createReadStream('/path/to/page1.jpg'))
;(async () => { try { const response = await axios.post('https://api.nutrient.io/build', formData, { headers: formData.getHeaders({ 'Authorization': 'Bearer your_api_key_here' }), responseType: "stream" })
response.data.pipe(fs.createWriteStream("result.pdf")) } catch (e) { const errorString = await streamToString(e.response.data) console.log(errorString) }})()
function streamToString(stream) { const chunks = [] return new Promise((resolve, reject) => { stream.on("data", (chunk) => chunks.push(Buffer.from(chunk))) stream.on("error", (err) => reject(err)) stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8"))) })}import requestsimport json
response = requests.request( 'POST', 'https://api.nutrient.io/build', headers = { 'Authorization': 'Bearer your_api_key_here' }, files = { 'page1.jpg': open('/path/to/page1.jpg', 'rb') }, data = { 'instructions': json.dumps({ 'parts': [ { 'file': 'page1.jpg' } ] }) }, stream = True)
if response.ok: with open('result.pdf', 'wb') as fd: for chunk in response.iter_content(chunk_size=8096): fd.write(chunk)else: print(response.text) exit()<?php
$FileHandle = fopen('result.pdf', 'w+');
$curl = curl_init();
curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nutrient.io/build', CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_POSTFIELDS => array( 'instructions' => '{ "parts": [ { "file": "page1.jpg" } ] }', 'page1.jpg' => new CURLFILE('/path/to/page1.jpg') ), CURLOPT_HTTPHEADER => array( 'Authorization: Bearer your_api_key_here' ), CURLOPT_FILE => $FileHandle,));
$response = curl_exec($curl);
curl_close($curl);
fclose($FileHandle);POST https://api.nutrient.io/build HTTP/1.1Content-Type: multipart/form-data; boundary=--customboundaryAuthorization: Bearer your_api_key_here
--customboundaryContent-Disposition: form-data; name="instructions"Content-Type: application/json
{ "parts": [ { "file": "page1.jpg" } ]}--customboundaryContent-Disposition: form-data; name="page1.jpg"; filename="/path/to/page1.jpg"Content-Type: image/jpeg
(page1.jpg data)--customboundary--Combining multiple images into a PDF
To combine multiple images (for example, from a scanned document) into a single PDF, pass multiple images in your request — one for each page. Nutrient DWS API merges them into a single PDF.
Add more files in the same folder as your code and run the updated code. You can duplicate and rename your existing file, or add other images:
curl -X POST https://api.nutrient.io/build \ -H "Authorization: Bearer your_api_key_here" \ -o result.pdf \ --fail \ -F page1.jpg=@/path/to/page1.jpg \ -F page2.jpg=@/path/to/page2.jpg \ -F page3.jpg=@/path/to/page3.jpg \ -F page4.jpg=@/path/to/page4.jpg \ -F instructions='{ "parts": [ { "file": "page1.jpg" }, { "file": "page2.jpg" }, { "file": "page3.jpg" }, { "file": "page4.jpg" } ] }'curl -X POST https://api.nutrient.io/build ^ -H "Authorization: Bearer your_api_key_here" ^ -o result.pdf ^ --fail ^ -F page1.jpg=@/path/to/page1.jpg ^ -F page2.jpg=@/path/to/page2.jpg ^ -F page3.jpg=@/path/to/page3.jpg ^ -F page4.jpg=@/path/to/page4.jpg ^ -F instructions="{\"parts\": [{\"file\": \"page1.jpg\"}, {\"file\": \"page2.jpg\"}, {\"file\": \"page3.jpg\"}, {\"file\": \"page4.jpg\"}]}"package com.example.pspdfkit;
import java.io.File;import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Files;import java.nio.file.StandardCopyOption;
import org.json.JSONArray;import org.json.JSONObject;
import okhttp3.MediaType;import okhttp3.MultipartBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;
public final class PspdfkitApiExample { public static void main(final String[] args) throws IOException { final RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart( "page1.jpg", "/path/to/page1.jpg", RequestBody.create( MediaType.parse("image/jpeg"), new File("/path/to/page1.jpg") ) ) .addFormDataPart( "page2.jpg", "/path/to/page2.jpg", RequestBody.create( MediaType.parse("image/jpeg"), new File("/path/to/page2.jpg") ) ) .addFormDataPart( "page3.jpg", "/path/to/page3.jpg", RequestBody.create( MediaType.parse("image/jpeg"), new File("/path/to/page3.jpg") ) ) .addFormDataPart( "page4.jpg", "/path/to/page4.jpg", RequestBody.create( MediaType.parse("image/jpeg"), new File("/path/to/page4.jpg") ) ) .addFormDataPart( "instructions", new JSONObject() .put("parts", new JSONArray() .put(new JSONObject() .put("file", "page1.jpg") ) .put(new JSONObject() .put("file", "page2.jpg") ) .put(new JSONObject() .put("file", "page3.jpg") ) .put(new JSONObject() .put("file", "page4.jpg") ) ).toString() ) .build();
final Request request = new Request.Builder() .url("https://api.nutrient.io/build") .method("POST", body) .addHeader("Authorization", "Bearer your_api_key_here") .build();
final OkHttpClient client = new OkHttpClient() .newBuilder() .build();
final Response response = client.newCall(request).execute();
if (response.isSuccessful()) { Files.copy( response.body().byteStream(), FileSystems.getDefault().getPath("result.pdf"), StandardCopyOption.REPLACE_EXISTING ); } else { // Handle the error throw new IOException(response.body().string()); } }}using System;using System.IO;using System.Net;using RestSharp;
namespace PspdfkitApiDemo{ class Program { static void Main(string[] args) { var client = new RestClient("https://api.nutrient.io/build");
var request = new RestRequest(Method.POST) .AddHeader("Authorization", "Bearer your_api_key_here") .AddFile("page1.jpg", "/path/to/page1.jpg") .AddFile("page2.jpg", "/path/to/page2.jpg") .AddFile("page3.jpg", "/path/to/page3.jpg") .AddFile("page4.jpg", "/path/to/page4.jpg") .AddParameter("instructions", new JsonObject { ["parts"] = new JsonArray { new JsonObject { ["file"] = "page1.jpg" }, new JsonObject { ["file"] = "page2.jpg" }, new JsonObject { ["file"] = "page3.jpg" }, new JsonObject { ["file"] = "page4.jpg" } } }.ToString());
request.AdvancedResponseWriter = (responseStream, response) => { if (response.StatusCode == HttpStatusCode.OK) { using (responseStream) { using var outputFileWriter = File.OpenWrite("result.pdf"); responseStream.CopyTo(outputFileWriter); } } else { var responseStreamReader = new StreamReader(responseStream); Console.Write(responseStreamReader.ReadToEnd()); } };
client.Execute(request); } }}// This code requires Node.js. Do not run this code directly in a web browser.
const axios = require('axios')const FormData = require('form-data')const fs = require('fs')
const formData = new FormData()formData.append('instructions', JSON.stringify({ parts: [ { file: "page1.jpg" }, { file: "page2.jpg" }, { file: "page3.jpg" }, { file: "page4.jpg" } ]}))formData.append('page1.jpg', fs.createReadStream('/path/to/page1.jpg'))formData.append('page2.jpg', fs.createReadStream('/path/to/page2.jpg'))formData.append('page3.jpg', fs.createReadStream('/path/to/page3.jpg'))formData.append('page4.jpg', fs.createReadStream('/path/to/page4.jpg'))
;(async () => { try { const response = await axios.post('https://api.nutrient.io/build', formData, { headers: formData.getHeaders({ 'Authorization': 'Bearer your_api_key_here' }), responseType: "stream" })
response.data.pipe(fs.createWriteStream("result.pdf")) } catch (e) { const errorString = await streamToString(e.response.data) console.log(errorString) }})()
function streamToString(stream) { const chunks = [] return new Promise((resolve, reject) => { stream.on("data", (chunk) => chunks.push(Buffer.from(chunk))) stream.on("error", (err) => reject(err)) stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8"))) })}import requestsimport json
response = requests.request( 'POST', 'https://api.nutrient.io/build', headers = { 'Authorization': 'Bearer your_api_key_here' }, files = { 'page1.jpg': open('/path/to/page1.jpg', 'rb'), 'page2.jpg': open('/path/to/page2.jpg', 'rb'), 'page3.jpg': open('/path/to/page3.jpg', 'rb'), 'page4.jpg': open('/path/to/page4.jpg', 'rb') }, data = { 'instructions': json.dumps({ 'parts': [ { 'file': 'page1.jpg' }, { 'file': 'page2.jpg' }, { 'file': 'page3.jpg' }, { 'file': 'page4.jpg' } ] }) }, stream = True)
if response.ok: with open('result.pdf', 'wb') as fd: for chunk in response.iter_content(chunk_size=8096): fd.write(chunk)else: print(response.text) exit()<?php
$FileHandle = fopen('result.pdf', 'w+');
$curl = curl_init();
curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nutrient.io/build', CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_POSTFIELDS => array( 'instructions' => '{ "parts": [ { "file": "page1.jpg" }, { "file": "page2.jpg" }, { "file": "page3.jpg" }, { "file": "page4.jpg" } ] }', 'page1.jpg' => new CURLFILE('/path/to/page1.jpg'), 'page2.jpg' => new CURLFILE('/path/to/page2.jpg'), 'page3.jpg' => new CURLFILE('/path/to/page3.jpg'), 'page4.jpg' => new CURLFILE('/path/to/page4.jpg') ), CURLOPT_HTTPHEADER => array( 'Authorization: Bearer your_api_key_here' ), CURLOPT_FILE => $FileHandle,));
$response = curl_exec($curl);
curl_close($curl);
fclose($FileHandle);POST https://api.nutrient.io/build HTTP/1.1Content-Type: multipart/form-data; boundary=--customboundaryAuthorization: Bearer your_api_key_here
--customboundaryContent-Disposition: form-data; name="instructions"Content-Type: application/json
{ "parts": [ { "file": "page1.jpg" }, { "file": "page2.jpg" }, { "file": "page3.jpg" }, { "file": "page4.jpg" } ]}--customboundaryContent-Disposition: form-data; name="page1.jpg"; filename="/path/to/page1.jpg"Content-Type: image/jpeg
(page1.jpg data)--customboundaryContent-Disposition: form-data; name="page2.jpg"; filename="/path/to/page2.jpg"Content-Type: image/jpeg
(page2.jpg data)--customboundaryContent-Disposition: form-data; name="page3.jpg"; filename="/path/to/page3.jpg"Content-Type: image/jpeg
(page3.jpg data)--customboundaryContent-Disposition: form-data; name="page4.jpg"; filename="/path/to/page4.jpg"Content-Type: image/jpeg
(page4.jpg data)--customboundary--