All formats

iText for Java

LanguageJava 8+
LicenseAGPL-3.0 or commercial license from Apryse
Repositorygithub.com/itext/itext-java
DocumentationiText Knowledge Base, API reference
Depends onbouncy-castle-adapter (or the FIPS adapter) for encryption and signatures; slf4j
Read / writeyes / yes: create with layout, extract text, merge, split, forms, annotations, encryption, digital signatures, PDF/A, PDF/UA

iText (owned by Apryse) is the most complete open-source PDF library for Java. Its modules: kernel (low-level PDF objects, reading, writing, text extraction), layout (paragraphs, tables, lists, images with automatic page breaks), forms (AcroForms), sign (PAdES signatures, timestamps, LTV), pdfa and pdfua (conformance). Add-ons include pdfHTML (HTML to PDF) and pdfSweep (redaction). It doesn’t render pages to images in the open-source edition.

iText is AGPL-3.0: if you distribute your program or offer it as a network service, you must publish its source under the AGPL, or buy a commercial license. The old iText 2.1.7 (LGPL/MPL) lives on as OpenPDF.

Installation#

Maven, using the itext-core POM that pulls in all core modules:

XML
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itext-core</artifactId>
  <version>9.8.0</version>
  <type>pom</type>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>bouncy-castle-adapter</artifactId>
  <version>9.8.0</version>
</dependency>

Basic usage: create a PDF#

Java
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.UnitValue;

public class Hello {
    public static void main(String[] args) throws Exception {
        try (PdfDocument pdf = new PdfDocument(new PdfWriter("hello.pdf"));
             Document document = new Document(pdf)) {
            pdf.getDocumentInfo().setTitle("Hello");
            document.add(new Paragraph("Hello, PDF!").setFontSize(24));

            Table table = new Table(UnitValue.createPercentArray(new float[] {3, 1})).useAllAvailableWidth();
            table.addHeaderCell("Item");
            table.addHeaderCell("Price");
            table.addCell("Widget");
            table.addCell("9.99");
            document.add(table);
        }
    }
}

How to extract text from a PDF#

Java
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import com.itextpdf.kernel.pdf.canvas.parser.listener.LocationTextExtractionStrategy;

try (PdfDocument pdf = new PdfDocument(new PdfReader("in.pdf"))) {
    for (int i = 1; i <= pdf.getNumberOfPages(); i++) {
        String text = PdfTextExtractor.getTextFromPage(pdf.getPage(i), new LocationTextExtractionStrategy());
        System.out.println("--- page " + i + " ---\n" + text);
    }
}

How to merge PDF files#

Java
import com.itextpdf.kernel.utils.PdfMerger;

try (PdfDocument output = new PdfDocument(new PdfWriter("merged.pdf"))) {
    PdfMerger merger = new PdfMerger(output);
    for (String path : new String[] {"a.pdf", "b.pdf"}) {
        try (PdfDocument source = new PdfDocument(new PdfReader(path))) {
            merger.merge(source, 1, source.getNumberOfPages());
        }
    }
}

How to split a PDF and rotate pages#

Java
import com.itextpdf.kernel.pdf.PdfPage;

try (PdfDocument source = new PdfDocument(new PdfReader("in.pdf"))) {
    for (int i = 1; i <= source.getNumberOfPages(); i++) {
        try (PdfDocument single = new PdfDocument(new PdfWriter("page-" + i + ".pdf"))) {
            source.copyPagesTo(i, i, single);
            PdfPage page = single.getPage(1);
            page.setRotation((page.getRotation() + 90) % 360);
        }
    }
}

How to fill a PDF form#

Java
import com.itextpdf.forms.PdfAcroForm;

try (PdfDocument pdf = new PdfDocument(new PdfReader("form.pdf"), new PdfWriter("filled.pdf"))) {
    PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, false);
    form.getAllFormFields().keySet().forEach(System.out::println);
    form.getField("name").setValue("Jane Doe");
    form.flattenFields();  // optional
}

How to encrypt and decrypt a PDF#

Java
import java.nio.charset.StandardCharsets;
import com.itextpdf.kernel.pdf.EncryptionConstants;
import com.itextpdf.kernel.pdf.ReaderProperties;
import com.itextpdf.kernel.pdf.WriterProperties;

WriterProperties props = new WriterProperties().setStandardEncryption(
    "user".getBytes(StandardCharsets.UTF_8),
    "owner".getBytes(StandardCharsets.UTF_8),
    EncryptionConstants.ALLOW_PRINTING,
    EncryptionConstants.ENCRYPTION_AES_256);
try (PdfDocument pdf = new PdfDocument(new PdfReader("in.pdf"), new PdfWriter("encrypted.pdf", props))) {
}

ReaderProperties readerProps = new ReaderProperties().setPassword("owner".getBytes(StandardCharsets.UTF_8));
try (PdfDocument pdf = new PdfDocument(new PdfReader("encrypted.pdf", readerProps), new PdfWriter("decrypted.pdf"))) {
}

How to read PDF metadata#

Java
import com.itextpdf.kernel.pdf.PdfDocumentInfo;

try (PdfDocument pdf = new PdfDocument(new PdfReader("in.pdf"))) {
    PdfDocumentInfo info = pdf.getDocumentInfo();
    System.out.println("Title: " + info.getTitle());
    System.out.println("Author: " + info.getAuthor());
    System.out.println("Version: " + pdf.getPdfVersion() + ", pages: " + pdf.getNumberOfPages());
}

Tips#