gradle draft

This commit is contained in:
Andrei Isvoran 2024-02-06 16:03:03 +02:00
parent 3bbd13daca
commit 46c9bed663
17 changed files with 454 additions and 190 deletions

8
.gitignore vendored
View File

@ -27,3 +27,11 @@
**/classpath-data.json **/classpath-data.json
**/dependencies-and-licenses-overview.txt **/dependencies-and-licenses-overview.txt
git.tag git.tag
gradle.properties
gradlew
gradlew.bat
gradle/
**/.gradle
**/build

View File

@ -1,4 +1,21 @@
include: include:
- project: 'gitlab/gitlab' - project: 'gitlab/gitlab'
ref: 'main' ref: 'main'
file: 'ci-templates/maven_deps.yml' file: 'ci-templates/gradle_java.yml'
deploy:
stage: deploy
tags:
- dind
script:
- echo "Building with gradle version ${BUILDVERSION}"
- gradle -Pversion=${BUILDVERSION} publish
- gradle bootBuildImage --cleanCache --publishImage -PbuildbootDockerHostNetwork=true -Pversion=${BUILDVERSION}
- echo "BUILDVERSION=$BUILDVERSION" >> version.env
artifacts:
reports:
dotenv: version.env
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_BRANCH =~ /^release/
- if: $CI_COMMIT_TAG

136
build.gradle.kts Normal file
View File

@ -0,0 +1,136 @@
plugins {
`java-library`
`maven-publish`
`kotlin-dsl`
pmd
checkstyle
jacoco
id("io.freefair.lombok") version "8.4"
}
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
repositories {
mavenLocal()
maven {
url = uri("https://nexus.knecon.com/repository/gindev/")
}
maven {
url = uri("https://pdftron.com/maven/release")
}
maven {
url = uri("https://repo.spring.io/milestone")
}
maven {
url = uri("http://dist.wso2.org/maven2/")
isAllowInsecureProtocol = true
}
maven {
url = uri("https://projectlombok.org/edge-releases")
}
maven {
url = uri("https://repo.maven.apache.org/maven2/")
}
maven {
url = uri("https://pdftron.com/maven/release")
}
maven {
url = uri("https://nexus.knecon.com/repository/red-platform-releases/")
credentials {
username = providers.gradleProperty("mavenUser").getOrNull();
password = providers.gradleProperty("mavenPassword").getOrNull();
}
}
}
dependencies {
api(libs.org.projectlombok.lombok)
api(libs.org.springframework.boot.spring.boot.configuration.processor)
api(libs.com.google.guava.guava)
api(libs.org.projectlombok.lombok)
api(libs.org.springframework.boot.spring.boot.configuration.processor)
implementation("com.pdftron:PDFNet:10.5.0")
testImplementation(libs.org.junit.jupiter.junit.jupiter)
testImplementation(libs.org.assertj.assertj.core)
testImplementation(libs.org.mockito.mockito.core)
testImplementation(libs.org.apache.logging.log4j.log4j.slf4j2.impl)
testImplementation(libs.org.junit.jupiter.junit.jupiter)
testImplementation(libs.org.assertj.assertj.core)
testImplementation(libs.org.mockito.mockito.core)
compileOnly(libs.org.slf4j.slf4j.api)
compileOnly(libs.com.pdftron.pdfnet)
}
group = "com.iqser.red.commons"
version = "2.0-SNAPSHOT"
description = "pdftron-logic-commons"
java.sourceCompatibility = JavaVersion.VERSION_17
val testsJar by tasks.registering(Jar::class) {
archiveClassifier.set("tests")
from(sourceSets["test"].output)
}
java {
withSourcesJar()
withJavadocJar()
}
publishing {
publications.create<MavenPublication>("maven") {
from(components["java"])
artifact(testsJar)
}
}
tasks.withType<JavaCompile>() {
options.encoding = "UTF-8"
}
tasks.withType<Javadoc>() {
options.encoding = "UTF-8"
}
pmd {
isConsoleOutput = true
}
tasks.pmdMain {
pmd.ruleSetFiles = files("${rootDir}/config/pmd/pmd.xml")
}
tasks.pmdTest {
pmd.ruleSetFiles = files("${rootDir}/config/pmd/test_pmd.xml")
}
tasks.named<Test>("test") {
useJUnitPlatform()
reports {
junitXml.outputLocation.set(layout.buildDirectory.dir("reports/junit"))
}
}
tasks.test {
finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run
}
tasks.jacocoTestReport {
dependsOn(tasks.test) // tests are required to run before generating the report
reports {
xml.required.set(true)
csv.required.set(false)
html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml"))
}
}
java {
withJavadocJar()
}

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
<property
name="severity"
value="error"/>
<module name="TreeWalker">
<module name="SuppressWarningsHolder"/>
<module name="MissingDeprecated"/>
<module name="MissingOverride"/>
<module name="AnnotationLocation"/>
<module name="JavadocStyle"/>
<module name="NonEmptyAtclauseDescription"/>
<module name="IllegalImport"/>
<module name="RedundantImport"/>
<module name="RedundantModifier"/>
<module name="EmptyBlock"/>
<module name="DefaultComesLast"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="ExplicitInitialization"/>
<module name="IllegalInstantiation"/>
<module name="ModifiedControlVariable"/>
<module name="MultipleVariableDeclarations"/>
<module name="PackageDeclaration"/>
<module name="ParameterAssignment"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="StringLiteralEquality"/>
<module name="OneStatementPerLine"/>
<module name="FinalClass"/>
<module name="ArrayTypeStyle"/>
<module name="UpperEll"/>
<module name="OuterTypeFilename"/>
</module>
<module name="FileTabCharacter"/>
<module name="SuppressWarningsFilter"/>
</module>

20
config/pmd/pmd.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0"?>
<ruleset name="Custom ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>
Knecon ruleset checks the code for bad stuff
</description>
<rule ref="category/java/errorprone.xml">
<exclude name="MissingSerialVersionUID"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="NullAssignment"/>
<exclude name="AssignmentInOperand"/>
<exclude name="BeanMembersShouldSerialize"/>
</rule>
</ruleset>

22
config/pmd/test_pmd.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<ruleset name="Custom ruleset"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>
Knecon test ruleset checks the code for bad stuff
</description>
<rule ref="category/java/errorprone.xml">
<exclude name="MissingSerialVersionUID"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="NullAssignment"/>
<exclude name="AssignmentInOperand"/>
<exclude name="TestClassWithoutTestCases"/>
<exclude name="BeanMembersShouldSerialize"/>
</rule>
</ruleset>

1
settings.gradle.kts Normal file
View File

@ -0,0 +1 @@
rootProject.name = "pdftron-logic-commons"

View File

@ -62,11 +62,12 @@ public class Converter {
@SneakyThrows @SneakyThrows
public static Color convertColor(ColorSpace colorSpace, ColorPt colorPt) { public static Color convertColor(ColorSpace colorSpace, ColorPt colorPt) {
ColorPt rgbColor = colorSpace.convert2RGB(colorPt); try (ColorPt rgbColor = colorSpace.convert2RGB(colorPt)) {
Color color = new Color((float) rgbColor.get(0), (float) rgbColor.get(1), (float) rgbColor.get(2)); Color color = new Color((float) rgbColor.get(0), (float) rgbColor.get(1), (float) rgbColor.get(2));
rgbColor.destroy(); rgbColor.destroy();
return color; return color;
} }
}
@SneakyThrows @SneakyThrows

View File

@ -103,6 +103,7 @@ public class ElementFeatures {
@Getter @Getter
@SuperBuilder @SuperBuilder
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
@SuppressWarnings("PMD")
public static class Text extends ElementFeatures { public static class Text extends ElementFeatures {
String text; String text;

View File

@ -35,8 +35,8 @@ public class ImageHashFactory {
@SneakyThrows @SneakyThrows
private byte[] getBytesOfImage(com.pdftron.pdf.Image inputImage) { private byte[] getBytesOfImage(com.pdftron.pdf.Image inputImage) {
// 0 because the memory filter determines the size // 0 because the memory filter determines the size
var memFilter = new MemoryFilter(0, false); try(var memFilter = new MemoryFilter(0, false)) {
var filterWriter = new FilterWriter(memFilter); try(var filterWriter = new FilterWriter(memFilter)) {
inputImage.export(filterWriter); inputImage.export(filterWriter);
filterWriter.flushAll(); filterWriter.flushAll();
@ -47,6 +47,8 @@ public class ImageHashFactory {
filterWriter.destroy(); filterWriter.destroy();
return res; return res;
} }
}
}
public String getSimplePHash(BufferedImage image) { public String getSimplePHash(BufferedImage image) {

View File

@ -151,8 +151,8 @@ public class InvisibleElementRemovalService {
private void execute(PDFDoc pdfDoc, boolean delta, boolean removePaths, Set<String> markedContentToIgnore) { private void execute(PDFDoc pdfDoc, boolean delta, boolean removePaths, Set<String> markedContentToIgnore) {
log.info("Start removing invisible Elements"); log.info("Start removing invisible Elements");
ElementWriter writer = new ElementWriter(); try(ElementWriter writer = new ElementWriter()) {
ElementReader reader = new ElementReader(); try(ElementReader reader = new ElementReader()) {
Set<Long> visitedXObjIds = new TreeSet<>(); Set<Long> visitedXObjIds = new TreeSet<>();
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) { for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -183,7 +183,8 @@ public class InvisibleElementRemovalService {
} }
writer.destroy(); writer.destroy();
reader.destroy(); reader.destroy();
}
}
log.info("Finished removing invisible Elements"); log.info("Finished removing invisible Elements");
} }
@ -239,7 +240,7 @@ public class InvisibleElementRemovalService {
private void processImages(Element imageElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { private void processImages(Element imageElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
Rect rect = imageElement.getBBox(); try(Rect rect = imageElement.getBBox()) {
if (rect == null) { if (rect == null) {
return; return;
@ -255,11 +256,12 @@ public class InvisibleElementRemovalService {
writer.writeElement(imageElement); writer.writeElement(imageElement);
} }
} }
}
private void processText(Element textElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { private void processText(Element textElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
Rect textBBox = textElement.getBBox(); try(Rect textBBox = textElement.getBBox()) {
if (textBBox == null) { if (textBBox == null) {
writer.writeElement(textElement); writer.writeElement(textElement);
@ -304,6 +306,7 @@ public class InvisibleElementRemovalService {
} }
} }
} }
}
private void processForm(Element formElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { private void processForm(Element formElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
@ -315,7 +318,7 @@ public class InvisibleElementRemovalService {
context.visitedXObjIds().add(formObj.getObjNum()); context.visitedXObjIds().add(formObj.getObjNum());
// writer needs to be newly initialized when entering a new content stream // writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest) // see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter(); try(ElementWriter formWriter = new ElementWriter()) {
context.clippingPathStack().enterNewGState(); context.clippingPathStack().enterNewGState();
context.clippingPathStack().intersectClippingPath(new GeneralPath(Converter.toRectangle2D(formElement.getBBox()))); context.clippingPathStack().intersectClippingPath(new GeneralPath(Converter.toRectangle2D(formElement.getBBox())));
context.reader().formBegin(); context.reader().formBegin();
@ -331,6 +334,7 @@ public class InvisibleElementRemovalService {
context.clippingPathStack().leaveGState(); context.clippingPathStack().leaveGState();
} }
} }
}
private void processPath(Element pathElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { private void processPath(Element pathElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException {
@ -481,7 +485,7 @@ public class InvisibleElementRemovalService {
context.visitedXObjIds().add(formObj.getObjNum()); context.visitedXObjIds().add(formObj.getObjNum());
// writer needs to be newly initialized when entering a new content stream // writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest) // see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter(); try(ElementWriter formWriter = new ElementWriter()) {
context.reader().formBegin(); context.reader().formBegin();
formWriter.begin(formObj); formWriter.begin(formObj);
@ -494,6 +498,7 @@ public class InvisibleElementRemovalService {
context.reader().end(); context.reader().end();
} }
} }
}
private boolean isTextRenderedVisibly(GState gState, Rect textBBox, InvisibleElementRemovalContext context) throws PDFNetException { private boolean isTextRenderedVisibly(GState gState, Rect textBBox, InvisibleElementRemovalContext context) throws PDFNetException {
@ -582,10 +587,10 @@ public class InvisibleElementRemovalService {
@SneakyThrows @SneakyThrows
private void drawBBox(ElementWriter writer, Rectangle2D r, String hexcolor) { private void drawBBox(ElementWriter writer, Rectangle2D r, String hexcolor) {
ColorPt colorPt = new ColorPt(Integer.valueOf(hexcolor.substring(1, 3), 16) / 255d, try(ColorPt colorPt = new ColorPt(Integer.valueOf(hexcolor.substring(1, 3), 16) / 255d,
Integer.valueOf(hexcolor.substring(3, 5), 16) / 255d, Integer.valueOf(hexcolor.substring(3, 5), 16) / 255d,
Integer.valueOf(hexcolor.substring(5, 7), 16) / 255d); Integer.valueOf(hexcolor.substring(5, 7), 16) / 255d)) {
ElementBuilder eb = new ElementBuilder(); try(ElementBuilder eb = new ElementBuilder()) {
Element rect = eb.createRect(r.getX(), r.getY(), r.getWidth(), r.getHeight()); Element rect = eb.createRect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
rect.setPathStroke(true); rect.setPathStroke(true);
rect.getGState().setStrokeColorSpace(ColorSpace.createDeviceRGB()); rect.getGState().setStrokeColorSpace(ColorSpace.createDeviceRGB());
@ -595,6 +600,8 @@ public class InvisibleElementRemovalService {
colorPt.destroy(); colorPt.destroy();
eb.destroy(); eb.destroy();
} }
}
}
@Builder @Builder

View File

@ -7,33 +7,33 @@ import java.util.Set;
public class MarkedContentStack { public class MarkedContentStack {
Deque<MarkedContent> markedContentStack = new LinkedList<>(); Deque<MarkedContent> markedContentQueue = new LinkedList<>();
public void enterMarkedContent(String name) { public void enterMarkedContent(String name) {
markedContentStack.push(new MarkedContent(name)); markedContentQueue.push(new MarkedContent(name));
} }
public void leaveMarkedContent() { public void leaveMarkedContent() {
markedContentStack.pop(); markedContentQueue.pop();
} }
public String currentMarkedContent() { public String currentMarkedContent() {
if (markedContentStack.isEmpty()) { if (markedContentQueue.isEmpty()) {
return ""; return "";
} }
return markedContentStack.peek().name(); return markedContentQueue.peek().name();
} }
public boolean currentMarkedContentContains(String name) { public boolean currentMarkedContentContains(String name) {
Iterator<MarkedContent> markedContentIterator = markedContentStack.descendingIterator(); Iterator<MarkedContent> markedContentIterator = markedContentQueue.descendingIterator();
while (markedContentIterator.hasNext()) { while (markedContentIterator.hasNext()) {
var markedContent = markedContentIterator.next(); var markedContent = markedContentIterator.next();
if (markedContent.name().equals(name)) { if (markedContent.name().equals(name)) {
@ -46,10 +46,10 @@ public class MarkedContentStack {
public boolean currentMarkedContentContainsAny(Set<String> names) { public boolean currentMarkedContentContainsAny(Set<String> names) {
if (markedContentStack.isEmpty()) { if (markedContentQueue.isEmpty()) {
return false; return false;
} }
Iterator<MarkedContent> markedContentIterator = markedContentStack.descendingIterator(); Iterator<MarkedContent> markedContentIterator = markedContentQueue.descendingIterator();
while (markedContentIterator.hasNext()) { while (markedContentIterator.hasNext()) {
var markedContent = markedContentIterator.next(); var markedContent = markedContentIterator.next();
if (names.contains(markedContent.name())) { if (names.contains(markedContent.name())) {
@ -62,7 +62,7 @@ public class MarkedContentStack {
public void clear() { public void clear() {
markedContentStack.clear(); markedContentQueue.clear();
} }

View File

@ -43,8 +43,8 @@ public class OCGWatermarkRemovalService {
@SneakyThrows @SneakyThrows
private void removeOCGWatermarks(PDFDoc pdfDoc) { private void removeOCGWatermarks(PDFDoc pdfDoc) {
ElementReader reader = new ElementReader(); try(ElementReader reader = new ElementReader()) {
ElementWriter writer = new ElementWriter(); try(ElementWriter writer = new ElementWriter()) {
Set<Long> visitedXObjIds = new TreeSet<>(); Set<Long> visitedXObjIds = new TreeSet<>();
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) { for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -56,6 +56,8 @@ public class OCGWatermarkRemovalService {
reader.destroy(); reader.destroy();
writer.destroy(); writer.destroy();
} }
}
}
@SneakyThrows @SneakyThrows
@ -124,7 +126,7 @@ public class OCGWatermarkRemovalService {
visitedXObjIds.add(element.getXObject().getObjNum()); visitedXObjIds.add(element.getXObject().getObjNum());
// writer needs to be newly initialized when entering a new content stream // writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest) // see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter(); try(ElementWriter formWriter = new ElementWriter()) {
reader.formBegin(); reader.formBegin();
formWriter.begin(element.getXObject()); formWriter.begin(element.getXObject());
@ -136,6 +138,7 @@ public class OCGWatermarkRemovalService {
formWriter.destroy(); formWriter.destroy();
reader.end(); reader.end();
} }
}
} }

View File

@ -16,8 +16,8 @@ import lombok.experimental.UtilityClass;
@UtilityClass @UtilityClass
public class PdfTextExtraction { public class PdfTextExtraction {
private static String execute(PDFDoc pdfDoc) throws IOException, PDFNetException{ private static String execute(PDFDoc pdfDoc) throws PDFNetException{
TextExtractor extractor = new TextExtractor(); try(TextExtractor extractor = new TextExtractor()) {
List<String> texts = new ArrayList<>(); List<String> texts = new ArrayList<>();
PageIterator iterator = pdfDoc.getPageIterator(); PageIterator iterator = pdfDoc.getPageIterator();
@ -31,6 +31,7 @@ public class PdfTextExtraction {
pdfDoc.close(); pdfDoc.close();
return String.join("\n", texts); return String.join("\n", texts);
} }
}
public static String extractAllTextFromDocument(InputStream fileStream) throws IOException, PDFNetException { public static String extractAllTextFromDocument(InputStream fileStream) throws IOException, PDFNetException {
PDFDoc pdfDoc = new PDFDoc(fileStream); PDFDoc pdfDoc = new PDFDoc(fileStream);

View File

@ -93,7 +93,7 @@ public class WatermarkRemovalService {
Map<Long, List<ElementFeatures>> formObjectsAndImagesForPages = new HashMap<>(); Map<Long, List<ElementFeatures>> formObjectsAndImagesForPages = new HashMap<>();
Set<Long> visitedXObjIds = new TreeSet<>(); Set<Long> visitedXObjIds = new TreeSet<>();
ElementReader reader = new ElementReader(); try(ElementReader reader = new ElementReader()) {
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) { for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -115,6 +115,7 @@ public class WatermarkRemovalService {
return formObjectsAndImagesForPages; return formObjectsAndImagesForPages;
} }
}
private void processElement(Element element, private void processElement(Element element,
@ -220,13 +221,14 @@ public class WatermarkRemovalService {
} }
if (visitedXObjIds.add(element.getXObject().getObjNum())) { if (visitedXObjIds.add(element.getXObject().getObjNum())) {
ElementReader xObjectReader = new ElementReader(); try(ElementReader xObjectReader = new ElementReader()) {
xObjectReader.begin(element.getXObject()); xObjectReader.begin(element.getXObject());
for (Element element1 = xObjectReader.next(); element1 != null; element1 = xObjectReader.next()) { for (Element element1 = xObjectReader.next(); element1 != null; element1 = xObjectReader.next()) {
processElement(element1, visitedXObjIds, elementFeaturesLinkedList, formObjectsOccuringMoreThanOnceOnAPage, minAreaCoveringPage, page); processElement(element1, visitedXObjIds, elementFeaturesLinkedList, formObjectsOccuringMoreThanOnceOnAPage, minAreaCoveringPage, page);
} }
elementFeaturesLinkedList.add(ElementFeatureFactory.extractFeatures(element)); elementFeaturesLinkedList.add(ElementFeatureFactory.extractFeatures(element));
xObjectReader.destroy(); xObjectReader.destroy();
}
} else { } else {
elementFeaturesLinkedList.add(ElementFeatureFactory.extractFeatures(element)); elementFeaturesLinkedList.add(ElementFeatureFactory.extractFeatures(element));
} }
@ -256,8 +258,8 @@ public class WatermarkRemovalService {
@SneakyThrows @SneakyThrows
private void removeAllWatermarks(PDFDoc pdfDoc, List<ElementFeatures> watermarksElementFeaturesList) { private void removeAllWatermarks(PDFDoc pdfDoc, List<ElementFeatures> watermarksElementFeaturesList) {
ElementReader reader = new ElementReader(); try(ElementReader reader = new ElementReader()) {
ElementWriter writer = new ElementWriter(); try (ElementWriter writer = new ElementWriter()) {
Set<Long> visitedXObjIds = new TreeSet<>(); Set<Long> visitedXObjIds = new TreeSet<>();
for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) { for (PageIterator iterator = pdfDoc.getPageIterator(); iterator.hasNext(); ) {
@ -270,7 +272,8 @@ public class WatermarkRemovalService {
reader.destroy(); reader.destroy();
writer.destroy(); writer.destroy();
}
}
} }
@ -390,7 +393,7 @@ public class WatermarkRemovalService {
visitedXObjIds.add(element.getXObject().getObjNum()); visitedXObjIds.add(element.getXObject().getObjNum());
// writer needs to be newly initialized when entering a new content stream // writer needs to be newly initialized when entering a new content stream
// see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest) // see ElementEditTest in PDFTron (https://www.pdftron.com/documentation/samples/android/java/ElementEditTest)
ElementWriter formWriter = new ElementWriter(); try(ElementWriter formWriter = new ElementWriter()) {
reader.formBegin(); reader.formBegin();
formWriter.begin(element.getXObject()); formWriter.begin(element.getXObject());
@ -402,6 +405,7 @@ public class WatermarkRemovalService {
formWriter.destroy(); formWriter.destroy();
reader.end(); reader.end();
} }
}
} }

View File

@ -13,6 +13,7 @@ import com.pdftron.pdf.PDFNet;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@SuppressWarnings("PMD")
class InvisibleElementRemovalServiceTest { class InvisibleElementRemovalServiceTest {
InvisibleElementRemovalService invisibleElementRemovalService; InvisibleElementRemovalService invisibleElementRemovalService;

View File

@ -13,6 +13,7 @@ import com.pdftron.pdf.PDFNet;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@Disabled @Disabled
@SuppressWarnings("PMD")
class WatermarkRemovalServiceTest { class WatermarkRemovalServiceTest {
@SneakyThrows @SneakyThrows