iText for Java
| Language | Java 8+ |
|---|---|
| License | AGPL-3.0 or commercial license from Apryse |
| Repository | github.com/itext/itext-java |
| Documentation | iText Knowledge Base, API reference |
| Depends on | bouncy-castle-adapter (or the FIPS adapter) for encryption and signatures; slf4j |
| Read / write | yes / 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#
new PdfDocument(reader, writer, new StampingProperties().useAppendMode())saves changes as an incremental update, required when the file is already signed.new PdfReader("in.pdf").setUnethicalReading(true)opens files that have an owner password but no user password, ignoring their permissions; use it only when you have the right to.- For PDF/A use
PdfADocumentwith an output intent ICC profile; for accessibility callpdf.setTagged()and use thepdfuamodule.