← PDF compressor
Page 1 of the result.
Compress a PDF in PHP
Make a PDF smaller by downsampling its images. Choose how far: screen (smallest), ebook, printer or prepress. Here is the whole call in PHP, with the output it produced when we ran it.
Before you start
- An API key. Create a free account; it comes with free tokens every month. Put the key in an environment variable so it stays out of your code:
export BLOODWEB_KEY=your_key - PHP 7.4 or later with the curl extension, which most installs have.
- The input file in the same folder:
scan.pdf. Use your own; that is the name the code expects.
The code
Save it as pdf-compress.php and run php pdf-compress.php.
<?php
$ch = curl_init('https://bloodweb.net/api/v1/pdf-compress');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('BLOODWEB_KEY')],
CURLOPT_POSTFIELDS => [
'file' => new CURLFile('scan.pdf'),
'level' => 'ebook',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($body === false) {
exit(curl_error($ch) . "\n");
}
if ($status !== 200) {
exit($status . ': ' . json_decode($body, true)['error']['message'] . "\n");
}
file_put_contents('smaller.pdf', $body);
What you get
Tested 19 October 2026: this exact code ran against our test copy of the API, which runs the same service code as bloodweb.net, and produced this.
It writes smaller.pdf: a PDF, 3 pages, 1 KB.
Change the call
Every option the PDF compressor takes. Add or change them the same way as the ones in the code.
level: screen: images at 72 DPI, smallest. ebook: 150 DPI, good for email. printer: 300 DPI. prepress: 300 DPI, colour kept for print shops. One of: screen, ebook, printer, prepress.grayscale: Convert everything to shades of grey. Often halves a scanned colour document again.
If it fails
A failed call is not charged. The answer is JSON with an error object; the code above prints its message. The usual ones:
- 401
missing_keyorinvalid_key:BLOODWEB_KEYis not set in the shell that runs the code, or the key was revoked. - 415
unsupported_type: the file is not a type this service reads. The type is read from the file itself, so renaming a file does not change it. - 413
file_too_large: the file is over the limit on the service page. - 402
insufficient_tokens: the balance does not cover the call. Top up in the dashboard. - 429
rate_limited: too many calls at once. Wait the seconds in theRetry-Afterheader and send it again.
Every code and its fix is in the docs.
Next
- The PDF compressor page: every option, the limits, and Try it now in your browser.
- Getting started: keys, errors and rate limits for all the services.