Search in sources :

Example 1 with PdfArray

use of com.itextpdf.kernel.pdf.PdfArray in project i7j-pdfsweep by itext.

the class PdfCleanUpProcessor method annotationIsToBeRedacted.

private boolean annotationIsToBeRedacted(PdfAnnotation annotation, Rectangle redactRegion) {
    // TODO(DEVSIX-1605,DEVSIX-1606,DEVSIX-1607,DEVSIX-1608,DEVSIX-1609)
    removeAnnotIfPartOverlap = true;
    PdfName annotationType = annotation.getPdfObject().getAsName(PdfName.Subtype);
    if (annotationType.equals(PdfName.Watermark)) {
        // TODO /FixedPrint entry effect is not fully investigated: DEVSIX-2471
        Logger logger = LoggerFactory.getLogger(PdfCleanUpProcessor.class);
        logger.warn(CleanUpLogMessageConstant.REDACTION_OF_ANNOTATION_TYPE_WATERMARK_IS_NOT_SUPPORTED);
    }
    PdfArray rectAsArray = annotation.getRectangle();
    Rectangle rect = null;
    if (rectAsArray != null) {
        rect = rectAsArray.toRectangle();
    }
    boolean annotationIsToBeRedacted = processAnnotationRectangle(redactRegion, rect);
    // Special processing for some types of annotations.
    if (PdfName.Link.equals(annotationType)) {
        PdfArray quadPoints = ((PdfLinkAnnotation) annotation).getQuadPoints();
        if (quadPointsForLinkAnnotationAreValid(rect, quadPoints)) {
            annotationIsToBeRedacted = processAnnotationQuadPoints(redactRegion, quadPoints);
        }
    } else if (annotationType.equals(PdfName.Highlight) || annotationType.equals(PdfName.Underline) || annotationType.equals(PdfName.Squiggly) || annotationType.equals(PdfName.StrikeOut)) {
        PdfArray quadPoints = ((PdfTextMarkupAnnotation) annotation).getQuadPoints();
        // The annotation dictionary’s AP entry, if present, shall take precedence over QuadPoints.
        if (quadPoints != null && annotation.getAppearanceDictionary() == null) {
            try {
                annotationIsToBeRedacted = processAnnotationQuadPoints(redactRegion, quadPoints);
            } catch (PdfException ignored) {
            // if quad points array cannot be processed, simply ignore it
            }
        }
    } else if (annotationType.equals(PdfName.Line)) {
        PdfArray line = ((PdfLineAnnotation) annotation).getLine();
        if (line != null) {
            Rectangle drawnLineRectangle = line.toRectangle();
            // Line annotation might contain line leaders, so let's double check overlapping with /Rect area, for simplicity.
            // TODO DEVSIX-1607
            annotationIsToBeRedacted = annotationIsToBeRedacted || processAnnotationRectangle(redactRegion, drawnLineRectangle);
        }
    }
    return annotationIsToBeRedacted;
}
Also used : PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfException(com.itextpdf.kernel.exceptions.PdfException) PdfName(com.itextpdf.kernel.pdf.PdfName) PdfLinkAnnotation(com.itextpdf.kernel.pdf.annot.PdfLinkAnnotation) PdfLineAnnotation(com.itextpdf.kernel.pdf.annot.PdfLineAnnotation) Rectangle(com.itextpdf.kernel.geom.Rectangle) Logger(org.slf4j.Logger)

Example 2 with PdfArray

use of com.itextpdf.kernel.pdf.PdfArray in project i7j-pdfsweep by itext.

the class PdfCleanUpProcessor method areColorSpacesDifferent.

static boolean areColorSpacesDifferent(PdfImageXObject originalImage, PdfImageXObject clearedImage) {
    PdfObject originalImageCS = originalImage.getPdfObject().get(PdfName.ColorSpace);
    PdfObject clearedImageCS = clearedImage.getPdfObject().get(PdfName.ColorSpace);
    if (originalImageCS == clearedImageCS) {
        return false;
    } else if (originalImageCS == null || clearedImageCS == null) {
        return true;
    } else if (originalImageCS.equals(clearedImageCS)) {
        return false;
    } else if (originalImageCS.isArray() && clearedImageCS.isArray()) {
        PdfArray originalCSArray = (PdfArray) originalImageCS;
        PdfArray clearedCSArray = (PdfArray) clearedImageCS;
        if (originalCSArray.size() != clearedCSArray.size()) {
            return true;
        }
        for (int i = 0; i < originalCSArray.size(); ++i) {
            PdfObject objectFromOriginal = originalCSArray.get(i);
            PdfObject objectFromCleared = clearedCSArray.get(i);
            if (!objectFromOriginal.equals(objectFromCleared)) {
                return true;
            }
        }
        return false;
    }
    return true;
}
Also used : PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfObject(com.itextpdf.kernel.pdf.PdfObject)

Example 3 with PdfArray

use of com.itextpdf.kernel.pdf.PdfArray in project i7j-pdfsweep by itext.

the class PdfCleanUpTool method extractLocationsFromSingleRedactAnnotation.

/**
 * Note: annotation can consist not only of one area specified by the RECT entry, but also of multiple areas specified
 * by the QuadPoints entry in the annotation dictionary.
 */
private void extractLocationsFromSingleRedactAnnotation(PdfRedactAnnotation redactAnnotation) {
    List<Rectangle> regions;
    PdfArray quadPoints = redactAnnotation.getQuadPoints();
    if (quadPoints != null && !quadPoints.isEmpty()) {
        regions = translateQuadPointsToRectangles(quadPoints);
    } else {
        regions = new ArrayList<>();
        regions.add(redactAnnotation.getRectangle().toRectangle());
    }
    redactAnnotations.put(redactAnnotation, regions);
    int page = pdfDocument.getPageNumber(redactAnnotation.getPage());
    Color cleanUpColor = redactAnnotation.getInteriorColor();
    PdfDictionary ro = redactAnnotation.getRedactRolloverAppearance();
    if (ro != null) {
        cleanUpColor = null;
    }
    for (Rectangle region : regions) {
        addCleanupLocation(new PdfCleanUpLocation(page, region, cleanUpColor));
    }
}
Also used : PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfDictionary(com.itextpdf.kernel.pdf.PdfDictionary) Color(com.itextpdf.kernel.colors.Color) Rectangle(com.itextpdf.kernel.geom.Rectangle)

Example 4 with PdfArray

use of com.itextpdf.kernel.pdf.PdfArray in project i7j-pdfsweep by itext.

the class PdfCleanUpFilter method filterStrokePath.

/**
 * Filter a PathRenderInfo object.
 *
 * @param path the PathRenderInfo object to be filtered
 * @return a filtered {@link com.itextpdf.kernel.geom.Path} object.
 */
com.itextpdf.kernel.geom.Path filterStrokePath(PathRenderInfo path) {
    PdfArray dashPattern = path.getLineDashPattern();
    LineDashPattern lineDashPattern = new LineDashPattern(dashPattern.getAsArray(0), dashPattern.getAsNumber(1).floatValue());
    return filterStrokePath(path.getPath(), path.getCtm(), path.getLineWidth(), path.getLineCapStyle(), path.getLineJoinStyle(), path.getMiterLimit(), lineDashPattern);
}
Also used : PdfArray(com.itextpdf.kernel.pdf.PdfArray)

Example 5 with PdfArray

use of com.itextpdf.kernel.pdf.PdfArray in project i7j-pdfsweep by itext.

the class PdfAutoSweepTools method tentativeCleanUp.

/**
 * Perform tentative cleanup of areas of interest on a given {@link PdfPage}
 * This method will add all redaction annotations to the given page, allowing
 * the end-user to choose which redactions to keep or delete.
 *
 * @param pdfPage the page to clean up
 */
public void tentativeCleanUp(PdfPage pdfPage) {
    List<PdfCleanUpLocation> cleanUpLocations = getPdfCleanUpLocations(pdfPage);
    for (PdfCleanUpLocation loc : cleanUpLocations) {
        PdfString title = new PdfString("Annotation:" + annotationNumber);
        annotationNumber++;
        float[] color = loc.getCleanUpColor().getColorValue();
        // convert to annotation
        PdfAnnotation redact = new PdfRedactAnnotation(loc.getRegion()).setDefaultAppearance(new PdfString("Helvetica 12 Tf 0 g")).setTitle(title).put(PdfName.Subj, PdfName.Redact).put(PdfName.IC, new PdfArray(new float[] { 0f, 0f, 0f })).put(PdfName.OC, new PdfArray(color));
        pdfPage.addAnnotation(redact);
    }
}
Also used : PdfRedactAnnotation(com.itextpdf.kernel.pdf.annot.PdfRedactAnnotation) PdfArray(com.itextpdf.kernel.pdf.PdfArray) PdfAnnotation(com.itextpdf.kernel.pdf.annot.PdfAnnotation) PdfCleanUpLocation(com.itextpdf.pdfcleanup.PdfCleanUpLocation) PdfString(com.itextpdf.kernel.pdf.PdfString)

Aggregations

PdfArray (com.itextpdf.kernel.pdf.PdfArray)19 ExtendedITextTest (com.itextpdf.test.ExtendedITextTest)12 UnitTest (com.itextpdf.test.annotations.type.UnitTest)12 Test (org.junit.Test)12 PdfNumber (com.itextpdf.kernel.pdf.PdfNumber)6 PdfStream (com.itextpdf.kernel.pdf.PdfStream)4 PdfNull (com.itextpdf.kernel.pdf.PdfNull)3 PdfObject (com.itextpdf.kernel.pdf.PdfObject)3 Rectangle (com.itextpdf.kernel.geom.Rectangle)2 PdfBoolean (com.itextpdf.kernel.pdf.PdfBoolean)2 PdfCanvas (com.itextpdf.kernel.pdf.canvas.PdfCanvas)2 Logger (org.slf4j.Logger)2 ImageData (com.itextpdf.io.image.ImageData)1 Color (com.itextpdf.kernel.colors.Color)1 PdfException (com.itextpdf.kernel.exceptions.PdfException)1 Point (com.itextpdf.kernel.geom.Point)1 PdfDictionary (com.itextpdf.kernel.pdf.PdfDictionary)1 PdfLiteral (com.itextpdf.kernel.pdf.PdfLiteral)1 PdfName (com.itextpdf.kernel.pdf.PdfName)1 PdfString (com.itextpdf.kernel.pdf.PdfString)1