diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml
new file mode 100644
index 0000000000..6a15dc7f29
--- /dev/null
+++ b/pdf-2/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+ pdf-2
+ pdf-2
+ http://maven.apache.org
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.itextpdf
+ itext7-core
+ ${itextpdf.core.version}
+ pom
+
+
+ com.itextpdf
+ cleanup
+ ${itextpdf.cleanup.version}
+
+
+
+
+ pdf
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 7.2.3
+ 3.0.1
+
+
+
\ No newline at end of file
diff --git a/pdf-2/src/main/java/com/baeldung/pdfedition/PdfContentRemover.java b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfContentRemover.java
new file mode 100644
index 0000000000..62ccdcb51f
--- /dev/null
+++ b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfContentRemover.java
@@ -0,0 +1,43 @@
+package com.baeldung.pdfedition;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import com.itextpdf.kernel.geom.Rectangle;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfReader;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.pdfcleanup.CleanUpProperties;
+import com.itextpdf.pdfcleanup.PdfCleanUpLocation;
+import com.itextpdf.pdfcleanup.PdfCleanUpTool;
+import com.itextpdf.pdfcleanup.PdfCleaner;
+import com.itextpdf.pdfcleanup.autosweep.CompositeCleanupStrategy;
+import com.itextpdf.pdfcleanup.autosweep.RegexBasedCleanupStrategy;
+
+public class PdfContentRemover {
+
+ private static final String SOURCE = "src/main/resources/baeldung-modified.pdf";
+ private static final String DESTINATION = "src/main/resources/baeldung-cleaned.pdf";
+
+ public static void main(String[] args) throws IOException {
+ PdfReader reader = new PdfReader(SOURCE);
+ PdfWriter writer = new PdfWriter(DESTINATION);
+ PdfDocument pdfDocument = new PdfDocument(reader, writer);
+ removeContentFromDocument(pdfDocument);
+ pdfDocument.close();
+ }
+
+ private static void removeContentFromDocument(PdfDocument pdfDocument) throws IOException {
+ // 5.1. remove text
+ CompositeCleanupStrategy strategy = new CompositeCleanupStrategy();
+ strategy.add(new RegexBasedCleanupStrategy("Baeldung"));
+ PdfCleaner.autoSweepCleanUp(pdfDocument, strategy);
+
+ // 5.2. remove other areas
+ List cleanUpLocations = Arrays.asList(new PdfCleanUpLocation(1, new Rectangle(10, 50, 90, 70)), new PdfCleanUpLocation(2, new Rectangle(35, 400, 100, 35)));
+ PdfCleanUpTool cleaner = new PdfCleanUpTool(pdfDocument, cleanUpLocations, new CleanUpProperties());
+ cleaner.cleanUp();
+ }
+
+}
diff --git a/pdf-2/src/main/java/com/baeldung/pdfedition/PdfEditor.java b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfEditor.java
new file mode 100644
index 0000000000..cfdf5917b8
--- /dev/null
+++ b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfEditor.java
@@ -0,0 +1,86 @@
+package com.baeldung.pdfedition;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+import com.itextpdf.forms.PdfAcroForm;
+import com.itextpdf.forms.fields.PdfFormField;
+import com.itextpdf.forms.fields.PdfTextFormField;
+import com.itextpdf.io.image.ImageData;
+import com.itextpdf.io.image.ImageDataFactory;
+import com.itextpdf.kernel.geom.Rectangle;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfReader;
+import com.itextpdf.kernel.pdf.PdfString;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
+import com.itextpdf.kernel.pdf.annot.PdfTextAnnotation;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.element.Image;
+import com.itextpdf.layout.element.Paragraph;
+import com.itextpdf.layout.element.Table;
+import com.itextpdf.layout.element.Text;
+import com.itextpdf.layout.properties.UnitValue;
+
+public class PdfEditor {
+
+ private static final String SOURCE = "src/main/resources/baeldung.pdf";
+ private static final String DESTINATION = "src/main/resources/baeldung-modified.pdf";
+
+ public static void main(String[] args) throws IOException {
+ PdfReader reader = new PdfReader(SOURCE);
+ PdfWriter writer = new PdfWriter(DESTINATION);
+ PdfDocument pdfDocument = new PdfDocument(reader, writer);
+ addContentToDocument(pdfDocument);
+ }
+
+ private static void addContentToDocument(PdfDocument pdfDocument) throws MalformedURLException {
+ // 4.1. add form
+ PdfFormField personal = PdfFormField.createEmptyField(pdfDocument);
+ personal.setFieldName("information");
+ PdfTextFormField name = PdfFormField.createText(pdfDocument, new Rectangle(35, 400, 100, 30), "name", "");
+ personal.addKid(name);
+ PdfAcroForm.getAcroForm(pdfDocument, true)
+ .addField(personal, pdfDocument.getFirstPage());
+
+ // 4.2. add new page
+ pdfDocument.addNewPage(1);
+
+ // 4.3. add annotation
+ PdfAnnotation ann = new PdfTextAnnotation(new Rectangle(40, 435, 0, 0)).setTitle(new PdfString("name"))
+ .setContents("Your name");
+ pdfDocument.getPage(2)
+ .addAnnotation(ann);
+
+ // create document form pdf document
+ Document document = new Document(pdfDocument);
+
+ // 4.4. add an image
+ ImageData imageData = ImageDataFactory.create("src/main/resources/baeldung.png");
+ Image image = new Image(imageData).scaleAbsolute(550, 100)
+ .setFixedPosition(1, 10, 50);
+ document.add(image);
+
+ // 4.5. add a paragraph
+ Text title = new Text("This is a demo").setFontSize(16);
+ Text author = new Text("Baeldung tutorials.");
+ Paragraph p = new Paragraph().setFontSize(8)
+ .add(title)
+ .add(" from ")
+ .add(author);
+ document.add(p);
+
+ // 4.6. add a table
+ Table table = new Table(UnitValue.createPercentArray(2));
+ table.addHeaderCell("#");
+ table.addHeaderCell("company");
+ table.addCell("name");
+ table.addCell("baeldung");
+ document.add(table);
+
+ // close the document
+ // this automatically closes the pdfDocument, which then closes automatically the pdfReader and pdfWriter
+ document.close();
+ }
+
+}
diff --git a/pdf-2/src/main/java/com/baeldung/pdfedition/PdfTextReplacement.java b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfTextReplacement.java
new file mode 100644
index 0000000000..e81adff1ec
--- /dev/null
+++ b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfTextReplacement.java
@@ -0,0 +1,45 @@
+package com.baeldung.pdfedition;
+
+import java.io.IOException;
+
+import com.itextpdf.kernel.colors.ColorConstants;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfPage;
+import com.itextpdf.kernel.pdf.PdfReader;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
+import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation;
+import com.itextpdf.layout.Canvas;
+import com.itextpdf.layout.element.Paragraph;
+import com.itextpdf.pdfcleanup.PdfCleaner;
+import com.itextpdf.pdfcleanup.autosweep.CompositeCleanupStrategy;
+import com.itextpdf.pdfcleanup.autosweep.RegexBasedCleanupStrategy;
+
+public class PdfTextReplacement {
+
+ private static final String SOURCE = "src/main/resources/baeldung-modified.pdf";
+ private static final String DESTINATION = "src/main/resources/baeldung-fixed.pdf";
+
+ public static void main(String[] args) throws IOException {
+ PdfReader reader = new PdfReader(SOURCE);
+ PdfWriter writer = new PdfWriter(DESTINATION);
+ PdfDocument pdfDocument = new PdfDocument(reader, writer);
+ replaceTextContentFromDocument(pdfDocument);
+ pdfDocument.close();
+ }
+
+ private static void replaceTextContentFromDocument(PdfDocument pdfDocument) throws IOException {
+ CompositeCleanupStrategy strategy = new CompositeCleanupStrategy();
+ strategy.add(new RegexBasedCleanupStrategy("Baeldung tutorials").setRedactionColor(ColorConstants.WHITE));
+ PdfCleaner.autoSweepCleanUp(pdfDocument, strategy);
+
+ for (IPdfTextLocation location : strategy.getResultantLocations()) {
+ PdfPage page = pdfDocument.getPage(location.getPageNumber() + 1);
+ PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), page.getDocument());
+ Canvas canvas = new Canvas(pdfCanvas, location.getRectangle());
+ canvas.add(new Paragraph("HIDDEN").setFontSize(8)
+ .setMarginTop(0f));
+ }
+ }
+
+}
diff --git a/pdf-2/src/main/resources/baeldung-cleaned.pdf b/pdf-2/src/main/resources/baeldung-cleaned.pdf
new file mode 100644
index 0000000000..fd1f8cba5c
Binary files /dev/null and b/pdf-2/src/main/resources/baeldung-cleaned.pdf differ
diff --git a/pdf-2/src/main/resources/baeldung-fixed.pdf b/pdf-2/src/main/resources/baeldung-fixed.pdf
new file mode 100644
index 0000000000..ccdf9461bd
Binary files /dev/null and b/pdf-2/src/main/resources/baeldung-fixed.pdf differ
diff --git a/pdf-2/src/main/resources/baeldung-modified.pdf b/pdf-2/src/main/resources/baeldung-modified.pdf
new file mode 100644
index 0000000000..7a695620a6
Binary files /dev/null and b/pdf-2/src/main/resources/baeldung-modified.pdf differ
diff --git a/pdf-2/src/main/resources/baeldung.pdf b/pdf-2/src/main/resources/baeldung.pdf
new file mode 100644
index 0000000000..477fd3fa2d
Binary files /dev/null and b/pdf-2/src/main/resources/baeldung.pdf differ
diff --git a/pdf-2/src/main/resources/baeldung.png b/pdf-2/src/main/resources/baeldung.png
new file mode 100644
index 0000000000..ebbf87ffcf
Binary files /dev/null and b/pdf-2/src/main/resources/baeldung.png differ
diff --git a/pom.xml b/pom.xml
index 0f1a81a1da..b076095586 100644
--- a/pom.xml
+++ b/pom.xml
@@ -474,6 +474,7 @@
patterns-modules
pdf
+ pdf-2
performance-tests
persistence-modules
protobuffer