View on GitHub

Coherent PDF Command Line Tools and C API Community Release

Powerful, free tools to manipulate PDF files

[Current version: 2.4 (21st June 2021)]

The Coherent PDF Command Line Tools and C API allow you to manipulate existing PDF files in a variety of ways. For example:

These tools have been available commercially since 2007, and are widely used in industry and government.

Now we're releasing the tools for free, under a special not-for-commercial-use license. If you like the tools and want to use them commercially, or need support, licenses are available from Coherent Graphics Ltd. Commercial use involves anything other than private, personal use. Charities and educational institutions still require a license, but one may be obtained at greatly reduced cost - ask us. If you're still not sure if you need a license, ask us.

Download binaries now for Windows, Mac, or Linux

Pre-built binaries are available for Windows, Mac OS 10.10 and later (x86 or ARM), Linux 32 bit Intel and Linux 64 bit intel.

Download pre-built cpdf command line tool

Download pre-built C API static and shared libraries

Build from source

Look at the source repository for cpdf, or for the C API. You'll need to install the OCaml toolchain, and a couple of simple dependencies, but it's simple to build.

User Manual

A comprehensive user manual for the Command Line PDF tools can be found as a PDF document, or browsable online. The manual for the C API is also available. A paper copy can be obtained from Amazon for $9.99.

Command line examples

In all cases, on Microsoft Windows, substitute cpdf.exe for cpdf.

Select some pages from a file in.pdf and write to out.pdf:

cpdf in.pdf 1-3,12-end -o out.pdf

Merge some files together:

cpdf one.pdf two.pdf three.pdf -o merged.pdf

Split a file into single-page files page001.pdf, page002.pdf etc:

cpdf -split in.pdf -o page%%%.pdf

Encrypt a file with 128 bit AES encryption with an owner password but blank user password:

cpdf -encrypt AES "pass" "" in.pdf -o out.pdf

Output some information about a file:

cpdf -info file.pdf

Encryption: Not encrypted
Permissions: 
Linearized: true
Version: 1.4
Pages: 8
Title: catalogueproduit-UK.qxd
Author: James Peterson
Subject: 
Keywords: 
Creator: QuarkXPress: pictwpstops filter 1.0
Producer: Acrobat Distiller 6.0 for Macintosh
Created: D:20060926213913+02'00'
Modified: D:20060926213913+02'00'

Output information about each page:

cpdf -page-info file.pdf

Page 1:
MediaBox: 0.000000 0.000000 768.000000 1366.000000
CropBox: 
BleedBox: 0.000000 0.000000 768.000000 1366.000000
TrimBox: 0.000000 0.000000 768.000000 1366.000000
ArtBox: 0.000000 0.000000 768.000000 1366.000000
Rotation: 0
Page 2:
MediaBox: 0.000000 0.000000 768.000000 1366.000000
CropBox: 
BleedBox: 0.000000 0.000000 768.000000 1366.000000
TrimBox: 0.000000 0.000000 768.000000 1366.000000
ArtBox: 0.000000 0.000000 768.000000 1366.000000
Rotation: 0

Scale pages to A4 paper:

cpdf -scale-to-fit a4portrait in.pdf -o out.pdf

Crop a file:

cpdf -crop "20mm 20mm 300mm 300mm" in.pdf -o out.pdf 

Add some text with page numbers:

cpdf -add-text "Page %Page of %EndPage" -top 100pt -font "Times-Roman" -font-size 20 in.pdf -o out.pdf

Stamp one PDF file over each page of another:

cpdf -stamp-on logo.pdf in.pdf -o out.pdf

Attach a file to page 5:

cpdf -attach-file sheet.xls -to-page 5 in.pdf -o out.pdf

Combine several commands together using AND: flip a file vertically and stamp text, then encrypt.

cpdf in.pdf -vflip AND -add-text "Page %Page" AND -encrypt 128bit owner "" -o out.pdf

Compress a file without loss of information:

cpdf -squeeze in.pdf -o out.pdf

C API example

#include 
#include "cpdflibwrapper.h"

int main (int argc, char ** argv)
{
  /* Initialise cpdf */
  cpdf_startup(argv);

  /* We will take the input hello.pdf and repeat it three times */
  int mergepdf = cpdf_fromFile("hello.pdf", "");

  /* Check the error state */
  if (cpdf_lastError) return 1;

  /* Clear the error state */
  cpdf_clearError();

  /* The array of PDFs to merge */
  int pdfs[] = {mergepdf, mergepdf, mergepdf};

  /* Merge them */
  int merged = cpdf_mergeSimple(pdfs, 3);
  
  if (cpdf_lastError) return 1;

  cpdf_clearError();

  /* Write output */
  cpdf_toFile(merged, "merged.pdf", false, false);

  if (cpdf_lastError) return 1;

  return 0;
}
Support

If you discover a bug, you can raise an issue in our issue tracker, or email for support.

Please note, though, that we prioritise support for paying customers.

FAQs

Q. My command works, but fails when I put it in a Windows Batch file.

A. Some cpdf commands use % as a special character. Use %% instead.

Q. Is it any different from the commercial version?

A. The community release prints a message when run, and sets the Producer field to show it was the last program to touch the PDF.

Q. I want to express thanks for this free program, but I'm not a commercial user. What can I do?

A. You can buy a copy of the User Manual on Amazon for $9.99.