HTML to PDF HTTP API Code Examples
Complete HTTP requests for common conversion tasks. See the HTTP API guide for request formats and response handling.
You can run the examples below with the displayed API credentials. Update the input URLs and filenames as needed.
Using cURL Using Python Requests Using Node.js Fetch Using Node.js Axios Using PHP Guzzle
Use a Bash-compatible shell.
Basic options
-u— Supply your username and API key.-F— Send a form field.--form-string— Send a literal form value.-o— Save the response to a file.-f— Report HTTP errors as command failures.-s -S— Hide the progress meter while keeping error messages.
File input
file=@document.html— Upload a local file.-
text=<-— Read HTML from standard input. The examples use< document.htmlto supply the file's contents.
Diagnostics
-
--fail-with-body— Use instead of-fto retain the error response body. -D— Save response headers to a file.-
-w— Print response information; the diagnostic example prints the HTTP status.
Install Requests with
python3 -m pip install requests. Save an example as
convert.py and run it with python3 convert.py.
Request options
auth— Supply your username and API key using HTTP Basic authentication.data— Send form fields; Requests encodes their values.files— Upload files opened in binary mode. Requests sets the multipart boundary.text— Send HTML content as a form field. The file-content example readsdocument.htmlas bytes.allow_redirects=False— Return the endpoint's response without following redirects.
Response handling
raise_for_status()— Raise an exception for HTTP errors before opening the output file.response.content— Save the response bytes to a file opened with"wb".with— Close opened files even if the request or output write fails.
Connection errors raise exceptions. The examples do not set a client timeout or
retry requests. If you add a timeout, allow for conversion time;
Requests applies connection and read timeouts, not an overall conversion deadline.
The diagnostic example
saves response headers and body and prints the HTTP status before calling
raise_for_status(), so an HTTP error still leaves diagnostic files.
Use Node.js with its built-in Fetch API; no HTTP package is needed.
Save an example as convert.mjs and run it with
node convert.mjs. The .mjs extension enables imports
and top-level await.
Request options
Authorization— Send your username and API key using HTTP Basic authentication.FormData— Send form fields and files. Fetch sets the multipart boundary.readFileandBlob— Read uploads as bytes into memory and include their filenames.text— Send HTML content as a form field. A Blob with an empty filename preserves the file's bytes without making it a file upload.redirect: 'manual'— Return the endpoint's response without following redirects.
Response handling
response.arrayBuffer()— Read the response bytes into memory.response.status— Check for HTTP errors before opening the output file; Fetch does not throw for HTTP errors itself.writeFile— Save the bytes to the output file. File and connection errors propagate as exceptions.
The examples use Fetch's native connection, response-header, and body inactivity
limits, which depend on the Node.js runtime. They do not set an overall conversion
deadline or retry requests. Allow for conversion time if you add a timeout using
an AbortSignal.
The diagnostic example saves response headers and body and prints the HTTP status before throwing on an HTTP error, so diagnostic files remain available.
Install Axios with npm install axios. Save an example as
convert.mjs and run it with node convert.mjs.
The .mjs extension enables imports and top-level await.
Request options
auth— Send your username and API key using HTTP Basic authentication.FormData— Send form fields and files. Axios sets the multipart boundary.readFileandBlob— Read uploads as bytes into memory and include their filenames.text— Send HTML content as a form field. A Blob with an empty filename preserves the file's bytes.maxRedirects: 0— Return the endpoint's response without following redirects.
Response handling
responseType: 'arraybuffer'— Read the response as bytes.validateStatus— Reject HTTP errors before writing the output file.writeFile— Save the response bytes to the output file.
Axios does not set an overall timeout by default. Allow for conversion time if you add one. Failed requests and file writes produce an error message and a nonzero exit status; the error handler prints only the message so request credentials are not included.
The diagnostic example saves response headers and body and prints the HTTP status before reporting an HTTP error, so diagnostic files remain available.
Install Guzzle with composer require guzzlehttp/guzzle.
Save an example as convert.php beside your vendor
directory and run it with php convert.php.
Request options
auth— Send your username and API key using HTTP Basic authentication.multipart— Send form fields and files. Guzzle sets the multipart boundary.Utils::tryFopen— Open input files as binary streams for upload.Utils::tryGetContents— Read HTML content as bytes into thetextform field.'allow_redirects' => false— Return the endpoint's response without following redirects.
Response handling
'http_errors' => false— Inspect the HTTP status before writing the output file.getBody— Read the response as a binary string.file_put_contents— Save the response bytes and check that the entire result was written.
Guzzle does not set an overall timeout by default. Allow for conversion time if you add one. Failed requests and file writes produce an error message and a nonzero exit status.
The diagnostic example saves response headers and body and prints the HTTP status before reporting an HTTP error, so diagnostic files remain available.
Basic examples
Convert a URL
curl -f -s -S \ -u 'demo:demo' \ -o example.pdf \ -F url=https://example.com/ \ -F content_viewport_width=balanced \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('example.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("example.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("example.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('example.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Convert an HTML file
Upload an existing document.html file.
curl -f -s -S \ -u 'demo:demo' \ -o document.pdf \ -F file=@document.html \ -F content_viewport_width=balanced \ https://api.pdfcrowd.com/convert/24.04/
import requests with open('document.html', 'rb') as input_1: response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', }, files={ 'file': input_1, }, allow_redirects=False, ) response.raise_for_status() with open('document.pdf', 'wb') as output_file: output_file.write(response.content)
import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("file", new Blob([await readFile("document.html")]), basename("document.html")); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("document.pdf", body);
import axios from 'axios'; import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("file", new Blob([await readFile("document.html")]), basename("document.html")); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("document.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'file', 'contents' => Utils::tryFopen('document.html', 'rb'), 'filename' => basename('document.html')], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('document.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
For local images and stylesheets, include the HTML and its assets in an archive.
Send HTML content
Send HTML in the text field. This example reads it from an existing document.html file.
curl -f -s -S \ -u 'demo:demo' \ -o html.pdf \ -F 'text=<-' \ -F content_viewport_width=balanced \ https://api.pdfcrowd.com/convert/24.04/ < document.html
import requests with open('document.html', 'rb') as input_1: response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'text': input_1.read(), }, allow_redirects=False, ) response.raise_for_status() with open('html.pdf', 'wb') as output_file: output_file.write(response.content)
import { readFile, writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("text", new Blob([await readFile("document.html")]), ''); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("html.pdf", body);
import axios from 'axios'; import { readFile, writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("text", new Blob([await readFile("document.html")]), ''); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("html.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'text', 'contents' => Utils::tryGetContents(Utils::tryFopen('document.html', 'rb'))], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('html.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
In your application, pass the HTML produced by your template renderer as the value of text.
Page rendering
Set page size and margins
curl -f -s -S \ -u 'demo:demo' \ -o page-layout.pdf \ -F url=https://example.com/ \ -F content_viewport_width=balanced \ -F margin_bottom=0.5in \ -F margin_left=0.5in \ -F margin_right=0.5in \ -F margin_top=0.5in \ -F orientation=landscape \ -F page_size=Letter \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'margin_bottom': '0.5in', 'margin_left': '0.5in', 'margin_right': '0.5in', 'margin_top': '0.5in', 'orientation': 'landscape', 'page_size': 'Letter', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('page-layout.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("margin_bottom", "0.5in"); form.append("margin_left", "0.5in"); form.append("margin_right", "0.5in"); form.append("margin_top", "0.5in"); form.append("orientation", "landscape"); form.append("page_size", "Letter"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("page-layout.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("margin_bottom", "0.5in"); form.append("margin_left", "0.5in"); form.append("margin_right", "0.5in"); form.append("margin_top", "0.5in"); form.append("orientation", "landscape"); form.append("page_size", "Letter"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("page-layout.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'margin_bottom', 'contents' => '0.5in'], ['name' => 'margin_left', 'contents' => '0.5in'], ['name' => 'margin_right', 'contents' => '0.5in'], ['name' => 'margin_top', 'contents' => '0.5in'], ['name' => 'orientation', 'contents' => 'landscape'], ['name' => 'page_size', 'contents' => 'Letter'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('page-layout.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
For edge-to-edge output, use no_margins instead of the margin settings.
Add a header and page numbers
Show the source URL in the header and “Page N of M” in the footer.
curl -f -s -S \ -u 'demo:demo' \ -o header_footer.pdf \ -F url=https://example.com/ \ -F footer_height=10mm \ --form-string 'footer_html= <center> Page <span class="pdfcrowd-page-number"></span> of <span class="pdfcrowd-page-count"></span> </center>' \ -F header_height=15mm \ --form-string 'header_html= <a class="pdfcrowd-source-url" data-pdfcrowd-placement="href-and-content"></a>' \ -F margin_bottom=0 \ -F margin_top=0 \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'footer_height': '10mm', 'footer_html': """ <center> Page <span class=\"pdfcrowd-page-number\"></span> of <span class=\"pdfcrowd-page-count\"></span> </center>""", 'header_height': '15mm', 'header_html': """ <a class=\"pdfcrowd-source-url\" data-pdfcrowd-placement=\"href-and-content\"></a>""", 'margin_bottom': '0', 'margin_top': '0', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('header_footer.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("footer_height", "10mm"); form.append("footer_html", new Blob([` <center> Page <span class="pdfcrowd-page-number"></span> of <span class="pdfcrowd-page-count"></span> </center>`]), ''); form.append("header_height", "15mm"); form.append("header_html", new Blob([` <a class="pdfcrowd-source-url" data-pdfcrowd-placement="href-and-content"></a>`]), ''); form.append("margin_bottom", "0"); form.append("margin_top", "0"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("header_footer.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("footer_height", "10mm"); form.append("footer_html", new Blob([` <center> Page <span class="pdfcrowd-page-number"></span> of <span class="pdfcrowd-page-count"></span> </center>`]), ''); form.append("header_height", "15mm"); form.append("header_html", new Blob([` <a class="pdfcrowd-source-url" data-pdfcrowd-placement="href-and-content"></a>`]), ''); form.append("margin_bottom", "0"); form.append("margin_top", "0"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("header_footer.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'footer_height', 'contents' => '10mm'], ['name' => 'footer_html', 'contents' => ' <center> Page <span class="pdfcrowd-page-number"></span> of <span class="pdfcrowd-page-count"></span> </center>'], ['name' => 'header_height', 'contents' => '15mm'], ['name' => 'header_html', 'contents' => ' <a class="pdfcrowd-source-url" data-pdfcrowd-placement="href-and-content"></a>'], ['name' => 'margin_bottom', 'contents' => '0'], ['name' => 'margin_top', 'contents' => '0'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('header_footer.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
See the headers and footers guide for more layouts and placeholders.
Scale page content
Scale the HTML content to 300%.
curl -f -s -S \ -u 'demo:demo' \ -o zoom_300.pdf \ -F url=https://example.com/ \ -F scale_factor=300 \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'scale_factor': '300', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('zoom_300.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("scale_factor", "300"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("zoom_300.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("scale_factor", "300"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("zoom_300.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'scale_factor', 'contents' => '300'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('zoom_300.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Choose a responsive layout
The browser viewport controls responsive breakpoints independently of the PDF paper size.
Large viewport:
curl -f -s -S \ -u 'demo:demo' \ -o bootstrap.pdf \ -F url=https://example.com/ \ -F content_viewport_width=large \ -F no_margins=true \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'large', 'no_margins': 'true', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('bootstrap.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "large"); form.append("no_margins", "true"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("bootstrap.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "large"); form.append("no_margins", "true"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("bootstrap.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'large'], ['name' => 'no_margins', 'contents' => 'true'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('bootstrap.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Small viewport:
curl -f -s -S \ -u 'demo:demo' \ -o viewport_small.pdf \ -F url=https://example.com/ \ -F content_viewport_width=small \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'small', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('viewport_small.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "small"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("viewport_small.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "small"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("viewport_small.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'small'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('viewport_small.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Hide or restyle page elements
Replace the selectors with elements from your page.
curl -f -s -S \ -u 'demo:demo' \ -o custom_css.pdf \ -F url=https://example.com/ \ -F content_viewport_width=balanced \ --form-string 'custom_css= /* Hide navigation, ads, and sidebar */ nav, .advertisement, .sidebar, footer { display: none !important; } /* Adjust layout for print */ .content { width: 100% !important; max-width: none !important; }' \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'custom_css': """ /* Hide navigation, ads, and sidebar */ nav, .advertisement, .sidebar, footer { display: none !important; } /* Adjust layout for print */ .content { width: 100% !important; max-width: none !important; }""", 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('custom_css.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("custom_css", new Blob([` /* Hide navigation, ads, and sidebar */ nav, .advertisement, .sidebar, footer { display: none !important; } /* Adjust layout for print */ .content { width: 100% !important; max-width: none !important; }`]), ''); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("custom_css.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("custom_css", new Blob([` /* Hide navigation, ads, and sidebar */ nav, .advertisement, .sidebar, footer { display: none !important; } /* Adjust layout for print */ .content { width: 100% !important; max-width: none !important; }`]), ''); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("custom_css.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'custom_css', 'contents' => ' /* Hide navigation, ads, and sidebar */ nav, .advertisement, .sidebar, footer { display: none !important; } /* Adjust layout for print */ .content { width: 100% !important; max-width: none !important; }'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('custom_css.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Modify the page with JavaScript
This example removes widgets and expands sections by changing their CSS classes. Adjust the selectors and class names for your page.
Remove widgets and expand sections:
curl -f -s -S \ -u 'demo:demo' \ -o custom_js.pdf \ -F url=https://example.com/ \ -F content_viewport_width=balanced \ --form-string 'custom_javascript= // Remove dynamic content before conversion document.querySelectorAll('"'"'.video-player, .chat-widget'"'"').forEach(el => { el.remove(); }); // Expand collapsed sections document.querySelectorAll('"'"'.collapsed'"'"').forEach(el => { el.classList.remove('"'"'collapsed'"'"'); });' \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'custom_javascript': """ // Remove dynamic content before conversion document.querySelectorAll('.video-player, .chat-widget').forEach(el => { el.remove(); }); // Expand collapsed sections document.querySelectorAll('.collapsed').forEach(el => { el.classList.remove('collapsed'); });""", 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('custom_js.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("custom_javascript", new Blob([` // Remove dynamic content before conversion document.querySelectorAll('.video-player, .chat-widget').forEach(el => { el.remove(); }); // Expand collapsed sections document.querySelectorAll('.collapsed').forEach(el => { el.classList.remove('collapsed'); });`]), ''); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("custom_js.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("custom_javascript", new Blob([` // Remove dynamic content before conversion document.querySelectorAll('.video-player, .chat-widget').forEach(el => { el.remove(); }); // Expand collapsed sections document.querySelectorAll('.collapsed').forEach(el => { el.classList.remove('collapsed'); });`]), ''); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("custom_js.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'custom_javascript', 'contents' => ' // Remove dynamic content before conversion document.querySelectorAll(\'.video-player, .chat-widget\').forEach(el => { el.remove(); }); // Expand collapsed sections document.querySelectorAll(\'.collapsed\').forEach(el => { el.classList.remove(\'collapsed\'); });'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('custom_js.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Add content to the page:
curl -f -s -S \ -u 'demo:demo' \ -o html_inject.pdf \ -F url=https://example.com/ \ --form-string 'custom_javascript= el = document.createElement('"'"'h2'"'"'); el.textContent = '"'"'Hello from PDFCrowd API'"'"'; el.style.color = '"'"'red'"'"'; el_before = document.getElementsByTagName('"'"'h1'"'"')[0]; el_before.parentNode.insertBefore(el, el_before.nextSibling);' \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'custom_javascript': """ el = document.createElement('h2'); el.textContent = 'Hello from PDFCrowd API'; el.style.color = 'red'; el_before = document.getElementsByTagName('h1')[0]; el_before.parentNode.insertBefore(el, el_before.nextSibling);""", 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('html_inject.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("custom_javascript", new Blob([` el = document.createElement('h2'); el.textContent = 'Hello from PDFCrowd API'; el.style.color = 'red'; el_before = document.getElementsByTagName('h1')[0]; el_before.parentNode.insertBefore(el, el_before.nextSibling);`]), ''); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("html_inject.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("custom_javascript", new Blob([` el = document.createElement('h2'); el.textContent = 'Hello from PDFCrowd API'; el.style.color = 'red'; el_before = document.getElementsByTagName('h1')[0]; el_before.parentNode.insertBefore(el, el_before.nextSibling);`]), ''); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("html_inject.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'custom_javascript', 'contents' => ' el = document.createElement(\'h2\'); el.textContent = \'Hello from PDFCrowd API\'; el.style.color = \'red\'; el_before = document.getElementsByTagName(\'h1\')[0]; el_before.parentNode.insertBefore(el, el_before.nextSibling);'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('html_inject.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Convert a specific element
Convert only the element matching #main in an existing document.html file. Adjust the filename and selector for your document.
curl -f -s -S \ -u 'demo:demo' \ -o html_part.pdf \ -F file=@document.html \ -F 'element_to_convert=#main' \ https://api.pdfcrowd.com/convert/24.04/
import requests with open('document.html', 'rb') as input_1: response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'element_to_convert': '#main', }, files={ 'file': input_1, }, allow_redirects=False, ) response.raise_for_status() with open('html_part.pdf', 'wb') as output_file: output_file.write(response.content)
import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("element_to_convert", "#main"); form.append("file", new Blob([await readFile("document.html")]), basename("document.html")); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("html_part.pdf", body);
import axios from 'axios'; import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("element_to_convert", "#main"); form.append("file", new Blob([await readFile("document.html")]), basename("document.html")); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("html_part.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'element_to_convert', 'contents' => '#main'], ['name' => 'file', 'contents' => Utils::tryFopen('document.html', 'rb'), 'filename' => basename('document.html')], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('html_part.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Wait for a page element
Wait for #content-loaded to appear in an existing document.html file before converting it.
# Wait for a specific element to appear curl -f -s -S \ -u 'demo:demo' \ -o wait_element.pdf \ -F file=@document.html \ -F content_viewport_width=balanced \ -F 'wait_for_element=#content-loaded' \ https://api.pdfcrowd.com/convert/24.04/
import requests with open('document.html', 'rb') as input_1: response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'wait_for_element': '#content-loaded', }, files={ 'file': input_1, }, allow_redirects=False, ) response.raise_for_status() with open('wait_element.pdf', 'wb') as output_file: output_file.write(response.content)
import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("wait_for_element", "#content-loaded"); form.append("file", new Blob([await readFile("document.html")]), basename("document.html")); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("wait_element.pdf", body);
import axios from 'axios'; import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("wait_for_element", "#content-loaded"); form.append("file", new Blob([await readFile("document.html")]), basename("document.html")); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("wait_element.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'wait_for_element', 'contents' => '#content-loaded'], ['name' => 'file', 'contents' => Utils::tryFopen('document.html', 'rb'), 'filename' => basename('document.html')], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('wait_element.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Choose an element that appears when your content is ready.
Allow extra time for JavaScript
# Wait for a specified time before conversion curl -f -s -S \ -u 'demo:demo' \ -o with_delay.pdf \ -F url=https://example.com/ \ -F content_viewport_width=balanced \ -F javascript_delay=2000 \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'javascript_delay': '2000', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('with_delay.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("javascript_delay", "2000"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("with_delay.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("javascript_delay", "2000"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("with_delay.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'javascript_delay', 'contents' => '2000'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('with_delay.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
This adds a delay of 2000 milliseconds. When the page has a reliable readiness marker, use Wait for a page element.
Apply print stylesheets
Apply the page’s @media print rules. The page must provide print styles for this to change its appearance.
curl -f -s -S \ -u 'demo:demo' \ -o print_media.pdf \ -F url=https://example.com/ \ -F content_viewport_width=balanced \ -F use_print_media=true \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'use_print_media': 'true', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('print_media.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("use_print_media", "true"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("print_media.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("use_print_media", "true"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("print_media.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'use_print_media', 'contents' => 'true'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('print_media.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Inspect element boundaries
Highlight element boxes to investigate spacing and layout.
Highlight backgrounds:
curl -f -s -S \ -u 'demo:demo' \ -o highlight_background.pdf \ -F url=https://example.com/ \ --form-string 'custom_javascript= libPdfcrowd.highlightHtmlElements({ backgroundColor: '"'"'rgba(255, 191, 0, 0.1)'"'"', borderColor: null });' \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'custom_javascript': """ libPdfcrowd.highlightHtmlElements({ backgroundColor: 'rgba(255, 191, 0, 0.1)', borderColor: null });""", 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('highlight_background.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("custom_javascript", new Blob([` libPdfcrowd.highlightHtmlElements({ backgroundColor: 'rgba(255, 191, 0, 0.1)', borderColor: null });`]), ''); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("highlight_background.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("custom_javascript", new Blob([` libPdfcrowd.highlightHtmlElements({ backgroundColor: 'rgba(255, 191, 0, 0.1)', borderColor: null });`]), ''); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("highlight_background.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'custom_javascript', 'contents' => ' libPdfcrowd.highlightHtmlElements({ backgroundColor: \'rgba(255, 191, 0, 0.1)\', borderColor: null });'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('highlight_background.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Add borders and spacing:
curl -f -s -S \ -u 'demo:demo' \ -o highlight_borders.pdf \ -F url=https://example.com/ \ --form-string 'custom_javascript= libPdfcrowd.highlightHtmlElements({ borderColor: '"'"'orange'"'"', backgroundColor: null, padding: '"'"'4px'"'"', margin: '"'"'4px'"'"' });' \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'custom_javascript': """ libPdfcrowd.highlightHtmlElements({ borderColor: 'orange', backgroundColor: null, padding: '4px', margin: '4px' });""", 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('highlight_borders.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("custom_javascript", new Blob([` libPdfcrowd.highlightHtmlElements({ borderColor: 'orange', backgroundColor: null, padding: '4px', margin: '4px' });`]), ''); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("highlight_borders.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("custom_javascript", new Blob([` libPdfcrowd.highlightHtmlElements({ borderColor: 'orange', backgroundColor: null, padding: '4px', margin: '4px' });`]), ''); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("highlight_borders.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'custom_javascript', 'contents' => ' libPdfcrowd.highlightHtmlElements({ borderColor: \'orange\', backgroundColor: null, padding: \'4px\', margin: \'4px\' });'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('highlight_borders.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
HTML and CSS
Add these fragments to HTML you control.
Remove or hide elements
<nav class="pdfcrowd-remove">This won't appear in the PDF</nav> <div class="pdfcrowd-hide">This is invisible but takes up space</div>
pdfcrowd-remove removes the element from the layout. pdfcrowd-hide preserves its space.
Control page breaks
<!-- Force a page break before the following section --> <div style="page-break-before: always"></div> <!-- Avoid breaking tables across pages --> <style> table, tr, td { page-break-inside: avoid; } </style>
Content taller than a page still needs to break.
Apply styles only during conversion
<style> /* These styles only apply during PDF conversion */ .pdfcrowd-body h1 { font-size: 48px; } .pdfcrowd-body footer { display: none; } .pdfcrowd-body .main-content { width: 100%; } </style>
The .pdfcrowd-body prefix limits these rules to conversion; it does not change the page in a visitor’s browser.
Templates
Render a template with a data file
Render an HTML template with JSON data by uploading existing template.html and data.json files. See the template rendering guide for template syntax, data mapping, and other supported data formats.
curl -f -s -S \ -u 'demo:demo' \ -o output.pdf \ -F file=@template.html \ -F data_file=@data.json \ -F content_viewport_width=balanced \ -F data_format=json \ https://api.pdfcrowd.com/convert/24.04/
import requests with ( open('template.html', 'rb') as input_1, open('data.json', 'rb') as input_2, ): response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'data_format': 'json', }, files={ 'file': input_1, 'data_file': input_2, }, allow_redirects=False, ) response.raise_for_status() with open('output.pdf', 'wb') as output_file: output_file.write(response.content)
import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("data_format", "json"); form.append("file", new Blob([await readFile("template.html")]), basename("template.html")); form.append("data_file", new Blob([await readFile("data.json")]), basename("data.json")); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("output.pdf", body);
import axios from 'axios'; import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("data_format", "json"); form.append("file", new Blob([await readFile("template.html")]), basename("template.html")); form.append("data_file", new Blob([await readFile("data.json")]), basename("data.json")); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("output.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'data_format', 'contents' => 'json'], ['name' => 'file', 'contents' => Utils::tryFopen('template.html', 'rb'), 'filename' => basename('template.html')], ['name' => 'data_file', 'contents' => Utils::tryFopen('data.json', 'rb'), 'filename' => basename('data.json')], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('output.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Advanced examples
Create a fillable PDF
Use an existing form.html file containing HTML form controls.
curl -f -s -S \ -u 'demo:demo' \ -o form.pdf \ -F file=@form.html \ -F content_viewport_width=balanced \ -F enable_pdf_forms=true \ https://api.pdfcrowd.com/convert/24.04/
import requests with open('form.html', 'rb') as input_1: response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'content_viewport_width': 'balanced', 'enable_pdf_forms': 'true', }, files={ 'file': input_1, }, allow_redirects=False, ) response.raise_for_status() with open('form.pdf', 'wb') as output_file: output_file.write(response.content)
import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("enable_pdf_forms", "true"); form.append("file", new Blob([await readFile("form.html")]), basename("form.html")); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("form.pdf", body);
import axios from 'axios'; import { readFile, writeFile } from 'node:fs/promises'; import { basename } from 'node:path'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("content_viewport_width", "balanced"); form.append("enable_pdf_forms", "true"); form.append("file", new Blob([await readFile("form.html")]), basename("form.html")); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("form.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'content_viewport_width', 'contents' => 'balanced'], ['name' => 'enable_pdf_forms', 'contents' => 'true'], ['name' => 'file', 'contents' => Utils::tryFopen('form.html', 'rb'), 'filename' => basename('form.html')], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('form.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
See fillable PDF forms for supported controls and attributes.
Set PDF metadata
curl -f -s -S \ -u 'demo:demo' \ -o with_metadata.pdf \ -F url=https://example.com/ \ -F author=PDFCrowd \ -F keywords=PDFCrowd,demo \ -F subject=Demo \ -F 'title=Hello World' \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'author': 'PDFCrowd', 'keywords': 'PDFCrowd,demo', 'subject': 'Demo', 'title': 'Hello World', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('with_metadata.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("author", "PDFCrowd"); form.append("keywords", "PDFCrowd,demo"); form.append("subject", "Demo"); form.append("title", "Hello World"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("with_metadata.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("author", "PDFCrowd"); form.append("keywords", "PDFCrowd,demo"); form.append("subject", "Demo"); form.append("title", "Hello World"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("with_metadata.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'author', 'contents' => 'PDFCrowd'], ['name' => 'keywords', 'contents' => 'PDFCrowd,demo'], ['name' => 'subject', 'contents' => 'Demo'], ['name' => 'title', 'contents' => 'Hello World'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('with_metadata.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
Set a presentation view
curl -f -s -S \ -u 'demo:demo' \ -o slide_show.pdf \ -F url=https://example.com/ \ -F initial_zoom_type=fit-page \ -F no_margins=true \ -F orientation=landscape \ -F page_layout=single-page \ -F page_mode=full-screen \ https://api.pdfcrowd.com/convert/24.04/
import requests response = requests.post( 'https://api.pdfcrowd.com/convert/24.04/', auth=('demo', 'demo'), data={ 'initial_zoom_type': 'fit-page', 'no_margins': 'true', 'orientation': 'landscape', 'page_layout': 'single-page', 'page_mode': 'full-screen', 'url': 'https://example.com/', }, allow_redirects=False, ) response.raise_for_status() with open('slide_show.pdf', 'wb') as output_file: output_file.write(response.content)
import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("initial_zoom_type", "fit-page"); form.append("no_margins", "true"); form.append("orientation", "landscape"); form.append("page_layout", "single-page"); form.append("page_mode", "full-screen"); form.append("url", "https://example.com/"); const response = await fetch("https://api.pdfcrowd.com/convert/24.04/", { method: 'POST', headers: { Authorization: 'Basic ' + Buffer.from( username + ':' + apiKey).toString('base64'), }, body: form, redirect: 'manual', }); const body = Buffer.from(await response.arrayBuffer()); if (response.status >= 400) { throw new Error('HTTP ' + response.status + ' ' + response.statusText); } await writeFile("slide_show.pdf", body);
import axios from 'axios'; import { writeFile } from 'node:fs/promises'; const username = 'demo'; const apiKey = 'demo'; const form = new FormData(); form.append("initial_zoom_type", "fit-page"); form.append("no_margins", "true"); form.append("orientation", "landscape"); form.append("page_layout", "single-page"); form.append("page_mode", "full-screen"); form.append("url", "https://example.com/"); try { const response = await axios.post("https://api.pdfcrowd.com/convert/24.04/", form, { auth: { username, password: apiKey }, responseType: 'arraybuffer', maxRedirects: 0, validateStatus: status => status < 400, }); await writeFile("slide_show.pdf", response.data); } catch (error) { console.error(error.message); process.exitCode = 1; }
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; try { $client = new Client(); $response = $client->post('https://api.pdfcrowd.com/convert/24.04/', [ 'auth' => ['demo', 'demo'], 'multipart' => [ ['name' => 'initial_zoom_type', 'contents' => 'fit-page'], ['name' => 'no_margins', 'contents' => 'true'], ['name' => 'orientation', 'contents' => 'landscape'], ['name' => 'page_layout', 'contents' => 'single-page'], ['name' => 'page_mode', 'contents' => 'full-screen'], ['name' => 'url', 'contents' => 'https://example.com/'], ], 'allow_redirects' => false, 'http_errors' => false, ]); $status = $response->getStatusCode(); if ($status >= 400) { throw new \RuntimeException("HTTP $status " . $response->getReasonPhrase()); } $body = (string) $response->getBody(); if (file_put_contents('slide_show.pdf', $body) !== strlen($body)) { throw new \RuntimeException('Failed to write output file'); } } catch (\Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(1); }
These settings request a full-screen initial view with landscape pages. The PDF viewer controls whether it honors those preferences.