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