Search in sources :

Example 6 with PDAppearanceStream

use of org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream in project pdfbox-graphics2d by rototor.

the class PdfBoxGraphics2DPaintApplier method applyTexturePaint.

private void applyTexturePaint(TexturePaint texturePaint, PaintApplierState state) throws IOException {
    Rectangle2D anchorRect = texturePaint.getAnchorRect();
    PDTilingPattern pattern = new PDTilingPattern();
    pattern.setPaintType(PDTilingPattern.PAINT_COLORED);
    pattern.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING_FASTER_TILING);
    pattern.setBBox(new PDRectangle((float) anchorRect.getX(), (float) anchorRect.getY(), (float) anchorRect.getWidth(), (float) anchorRect.getHeight()));
    pattern.setXStep((float) anchorRect.getWidth());
    pattern.setYStep((float) anchorRect.getHeight());
    AffineTransform patternTransform = new AffineTransform();
    patternTransform.translate(0, anchorRect.getHeight());
    patternTransform.scale(1f, -1f);
    pattern.setMatrix(patternTransform);
    PDAppearanceStream appearance = new PDAppearanceStream(state.document);
    appearance.setResources(pattern.getResources());
    appearance.setBBox(pattern.getBBox());
    PDPageContentStream imageContentStream = new PDPageContentStream(state.document, appearance, ((COSStream) pattern.getCOSObject()).createOutputStream());
    BufferedImage texturePaintImage = texturePaint.getImage();
    PDImageXObject imageXObject = state.imageEncoder.encodeImage(state.document, imageContentStream, texturePaintImage);
    float ratioW = (float) ((anchorRect.getWidth()) / texturePaintImage.getWidth());
    float ratioH = (float) ((anchorRect.getHeight()) / texturePaintImage.getHeight());
    float paintHeight = (texturePaintImage.getHeight()) * ratioH;
    imageContentStream.drawImage(imageXObject, (float) anchorRect.getX(), (float) (paintHeight + anchorRect.getY()), texturePaintImage.getWidth() * ratioW, -paintHeight);
    imageContentStream.close();
    PDColorSpace patternCS1 = new PDPattern(null, imageXObject.getColorSpace());
    COSName tilingPatternName = state.resources.add(pattern);
    PDColor patternColor = new PDColor(tilingPatternName, patternCS1);
    state.contentStream.setNonStrokingColor(patternColor);
    state.contentStream.setStrokingColor(patternColor);
}
Also used : PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) Rectangle2D(java.awt.geom.Rectangle2D) BufferedImage(java.awt.image.BufferedImage) PDColor(org.apache.pdfbox.pdmodel.graphics.color.PDColor) PDImageXObject(org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) PDTilingPattern(org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) AffineTransform(java.awt.geom.AffineTransform) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)

Example 7 with PDAppearanceStream

use of org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream in project pdfbox-graphics2d by rototor.

the class PdfBoxGraphics2DPaintApplier method applyPatternPaint.

/*
	 * Batik SVG Pattern Paint
	 */
private void applyPatternPaint(Paint paint, PaintApplierState state) throws IOException {
    Rectangle2D anchorRect = getPropertyValue(paint, "getPatternRect");
    AffineTransform paintPatternTransform = getPropertyValue(paint, "getPatternTransform");
    PDTilingPattern pattern = new PDTilingPattern();
    pattern.setPaintType(PDTilingPattern.PAINT_COLORED);
    pattern.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING_FASTER_TILING);
    pattern.setBBox(new PDRectangle((float) anchorRect.getX(), (float) anchorRect.getY(), (float) anchorRect.getWidth(), (float) anchorRect.getHeight()));
    pattern.setXStep((float) anchorRect.getWidth());
    pattern.setYStep((float) anchorRect.getHeight());
    AffineTransform patternTransform = new AffineTransform();
    if (paintPatternTransform != null) {
        paintPatternTransform = new AffineTransform(paintPatternTransform);
        paintPatternTransform.preConcatenate(state.tf);
        patternTransform.concatenate(paintPatternTransform);
    } else
        patternTransform.concatenate(state.tf);
    patternTransform.scale(1f, -1f);
    pattern.setMatrix(patternTransform);
    PDAppearanceStream appearance = new PDAppearanceStream(state.document);
    appearance.setResources(pattern.getResources());
    appearance.setBBox(pattern.getBBox());
    Object graphicsNode = getPropertyValue(paint, "getGraphicsNode");
    PdfBoxGraphics2D pdfBoxGraphics2D = new PdfBoxGraphics2D(state.document, pattern.getBBox(), state.env.getGraphics2D());
    try {
        Method paintMethod = graphicsNode.getClass().getMethod("paint", Graphics2D.class);
        paintMethod.invoke(graphicsNode, pdfBoxGraphics2D);
    } catch (Exception e) {
        System.err.println("PdfBoxGraphics2DPaintApplier error while drawing Batik PatternPaint");
        e.printStackTrace();
        return;
    }
    pdfBoxGraphics2D.dispose();
    PDFormXObject xFormObject = pdfBoxGraphics2D.getXFormObject();
    PDPageContentStream imageContentStream = new PDPageContentStream(state.document, appearance, ((COSStream) pattern.getCOSObject()).createOutputStream());
    imageContentStream.drawForm(xFormObject);
    imageContentStream.close();
    PDColorSpace patternCS1 = new PDPattern(null);
    COSName tilingPatternName = state.resources.add(pattern);
    PDColor patternColor = new PDColor(tilingPatternName, patternCS1);
    state.contentStream.setNonStrokingColor(patternColor);
    state.contentStream.setStrokingColor(patternColor);
}
Also used : PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) Rectangle2D(java.awt.geom.Rectangle2D) Method(java.lang.reflect.Method) IOException(java.io.IOException) PDColor(org.apache.pdfbox.pdmodel.graphics.color.PDColor) PDTilingPattern(org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) AffineTransform(java.awt.geom.AffineTransform) PDFormXObject(org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDImageXObject(org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) PDFormXObject(org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)

Example 8 with PDAppearanceStream

use of org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream in project pdfbox-graphics2d by rototor.

the class PdfBoxGraphics2D method applyShadingAsColor.

private void applyShadingAsColor(PDShading shading) throws IOException {
    /*
		 * If the paint has a shading we must create a tiling pattern and set that as
		 * stroke color...
		 */
    PDTilingPattern pattern = new PDTilingPattern();
    pattern.setPaintType(PDTilingPattern.PAINT_COLORED);
    pattern.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING_FASTER_TILING);
    PDRectangle anchorRect = bbox;
    pattern.setBBox(anchorRect);
    pattern.setXStep(anchorRect.getWidth());
    pattern.setYStep(anchorRect.getHeight());
    PDAppearanceStream appearance = new PDAppearanceStream(this.document);
    appearance.setResources(pattern.getResources());
    appearance.setBBox(pattern.getBBox());
    PDPageContentStream imageContentStream = new PDPageContentStream(document, appearance, ((COSStream) pattern.getCOSObject()).createOutputStream());
    imageContentStream.addRect(0, 0, anchorRect.getWidth(), anchorRect.getHeight());
    imageContentStream.clip();
    imageContentStream.shadingFill(shading);
    imageContentStream.close();
    PDColorSpace patternCS1 = new PDPattern(null);
    COSName tilingPatternName = xFormObject.getResources().add(pattern);
    PDColor patternColor = new PDColor(tilingPatternName, patternCS1);
    contentStream.setNonStrokingColor(patternColor);
    contentStream.setStrokingColor(patternColor);
}
Also used : PDTilingPattern(org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern) COSName(org.apache.pdfbox.cos.COSName) PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace) PDColor(org.apache.pdfbox.pdmodel.graphics.color.PDColor)

Example 9 with PDAppearanceStream

use of org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream in project pdfbox by apache.

the class AppearanceGeneratorHelper method setAppearanceValue.

/**
 * This is the public method for setting the appearance stream.
 *
 * @param apValue the String value which the appearance should represent
 * @throws IOException If there is an error creating the stream.
 */
public void setAppearanceValue(String apValue) throws IOException {
    value = apValue;
    // see PDFBOX-3911
    if (field instanceof PDTextField && !((PDTextField) field).isMultiline()) {
        value = apValue.replaceAll("\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029]", " ");
    }
    for (PDAnnotationWidget widget : field.getWidgets()) {
        // some fields have the /Da at the widget level if the
        // widgets differ in layout.
        PDDefaultAppearanceString acroFormAppearance = defaultAppearance;
        if (widget.getCOSObject().getDictionaryObject(COSName.DA) != null) {
            defaultAppearance = getWidgetDefaultAppearanceString(widget);
        }
        PDRectangle rect = widget.getRectangle();
        if (rect == null) {
            widget.getCOSObject().removeItem(COSName.AP);
            LOG.warn("widget of field " + field.getFullyQualifiedName() + " has no rectangle, no appearance stream created");
            continue;
        }
        PDFormFieldAdditionalActions actions = field.getActions();
        // when it is opened. See FreedomExpressions.pdf for an example of this.
        if (actions == null || actions.getF() == null || widget.getCOSObject().getDictionaryObject(COSName.AP) != null) {
            PDAppearanceDictionary appearanceDict = widget.getAppearance();
            if (appearanceDict == null) {
                appearanceDict = new PDAppearanceDictionary();
                widget.setAppearance(appearanceDict);
            }
            PDAppearanceEntry appearance = appearanceDict.getNormalAppearance();
            // TODO support appearances other than "normal"
            PDAppearanceStream appearanceStream;
            if (appearance != null && appearance.isStream()) {
                appearanceStream = appearance.getAppearanceStream();
            } else {
                appearanceStream = new PDAppearanceStream(field.getAcroForm().getDocument());
                // Calculate the entries for the bounding box and the transformation matrix
                // settings for the appearance stream
                int rotation = resolveRotation(widget);
                Matrix matrix = Matrix.getRotateInstance(Math.toRadians(rotation), 0, 0);
                Point2D.Float point2D = matrix.transformPoint(rect.getWidth(), rect.getHeight());
                PDRectangle bbox = new PDRectangle(Math.abs((float) point2D.getX()), Math.abs((float) point2D.getY()));
                appearanceStream.setBBox(bbox);
                appearanceStream.setMatrix(calculateMatrix(bbox, rotation));
                appearanceStream.setFormType(1);
                appearanceStream.setResources(new PDResources());
                appearanceDict.setNormalAppearance(appearanceStream);
            // TODO support appearances other than "normal"
            }
            /*
                 * Adobe Acrobat always recreates the complete appearance stream if there is an appearance characteristics
                 * entry (the widget dictionaries MK entry). In addition if there is no content yet also create the appearance
                 * stream from the entries.
                 * 
                 */
            if (widget.getAppearanceCharacteristics() != null || appearanceStream.getContentStream().getLength() == 0) {
                initializeAppearanceContent(widget, appearanceStream);
            }
            setAppearanceContent(widget, appearanceStream);
        }
        // restore the field level appearance
        defaultAppearance = acroFormAppearance;
    }
}
Also used : PDFormFieldAdditionalActions(org.apache.pdfbox.pdmodel.interactive.action.PDFormFieldAdditionalActions) PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) PDResources(org.apache.pdfbox.pdmodel.PDResources) PDAppearanceEntry(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceEntry) Matrix(org.apache.pdfbox.util.Matrix) PDAppearanceDictionary(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary) Point2D(java.awt.geom.Point2D) PDAnnotationWidget(org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle)

Example 10 with PDAppearanceStream

use of org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream in project pdfbox by apache.

the class PDAcroForm method flatten.

/**
 * This will flatten the specified form fields.
 *
 * <p>Flattening a form field will take the current appearance and make that part
 * of the pages content stream. All form fields and annotations associated are removed.</p>
 *
 * <p>Invisible and hidden fields will be skipped and will not become part of the
 * page content stream</p>
 *
 * @param fields
 * @param refreshAppearances if set to true the appearances for the form field widgets will be updated
 * @throws IOException
 */
public void flatten(List<PDField> fields, boolean refreshAppearances) throws IOException {
    // from the XFA content into a static PDF.
    if (xfaIsDynamic()) {
        LOG.warn("Flatten for a dynamix XFA form is not supported");
        return;
    }
    // refresh the appearances if set
    if (refreshAppearances) {
        refreshAppearances(fields);
    }
    // indicates if the original content stream
    // has been wrapped in a q...Q pair.
    boolean isContentStreamWrapped;
    // the content stream to write to
    PDPageContentStream contentStream;
    // preserve all non widget annotations
    for (PDPage page : document.getPages()) {
        isContentStreamWrapped = false;
        List<PDAnnotation> annotations = new ArrayList<>();
        for (PDAnnotation annotation : page.getAnnotations()) {
            if (!(annotation instanceof PDAnnotationWidget)) {
                annotations.add(annotation);
            } else if (!annotation.isInvisible() && !annotation.isHidden() && annotation.getNormalAppearanceStream() != null) {
                if (!isContentStreamWrapped) {
                    contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true, true);
                    isContentStreamWrapped = true;
                } else {
                    contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true);
                }
                PDAppearanceStream appearanceStream = annotation.getNormalAppearanceStream();
                PDFormXObject fieldObject = new PDFormXObject(appearanceStream.getCOSObject());
                contentStream.saveGraphicsState();
                // translate the appearance stream to the widget location if there is
                // not already a transformation in place
                boolean needsTranslation = resolveNeedsTranslation(appearanceStream);
                // scale the appearance stream - mainly needed for images
                // in buttons and signatures
                boolean needsScaling = resolveNeedsScaling(appearanceStream);
                Matrix transformationMatrix = new Matrix();
                boolean transformed = false;
                if (needsTranslation) {
                    transformationMatrix.translate(annotation.getRectangle().getLowerLeftX(), annotation.getRectangle().getLowerLeftY());
                    transformed = true;
                }
                if (needsScaling) {
                    PDRectangle bbox = appearanceStream.getBBox();
                    PDRectangle fieldRect = annotation.getRectangle();
                    if (Float.compare(bbox.getWidth() - fieldRect.getWidth(), 0) != 0 && Float.compare(bbox.getHeight() - fieldRect.getHeight(), 0) != 0) {
                        float xScale = fieldRect.getWidth() / bbox.getWidth();
                        float yScale = fieldRect.getHeight() / bbox.getHeight();
                        Matrix scalingMatrix = Matrix.getScaleInstance(xScale, yScale);
                        transformationMatrix.concatenate(scalingMatrix);
                        transformed = true;
                    }
                }
                if (transformed) {
                    contentStream.transform(transformationMatrix);
                }
                contentStream.drawForm(fieldObject);
                contentStream.restoreGraphicsState();
                contentStream.close();
            }
        }
        page.setAnnotations(annotations);
    }
    // remove the fields
    setFields(Collections.<PDField>emptyList());
    // remove XFA for hybrid forms
    dictionary.removeItem(COSName.XFA);
}
Also used : Matrix(org.apache.pdfbox.util.Matrix) PDPage(org.apache.pdfbox.pdmodel.PDPage) PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) PDAnnotation(org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation) COSArrayList(org.apache.pdfbox.pdmodel.common.COSArrayList) ArrayList(java.util.ArrayList) PDAnnotationWidget(org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget) PDFormXObject(org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle)

Aggregations

PDAppearanceStream (org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream)10 PDRectangle (org.apache.pdfbox.pdmodel.common.PDRectangle)7 PDPageContentStream (org.apache.pdfbox.pdmodel.PDPageContentStream)5 PDResources (org.apache.pdfbox.pdmodel.PDResources)4 PDFormXObject (org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject)4 PDImageXObject (org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject)4 PDAppearanceDictionary (org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary)4 PDPage (org.apache.pdfbox.pdmodel.PDPage)3 PDColor (org.apache.pdfbox.pdmodel.graphics.color.PDColor)3 PDColorSpace (org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)3 PDPattern (org.apache.pdfbox.pdmodel.graphics.color.PDPattern)3 PDTilingPattern (org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern)3 PDAnnotationWidget (org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget)3 Matrix (org.apache.pdfbox.util.Matrix)3 AffineTransform (java.awt.geom.AffineTransform)2 Rectangle2D (java.awt.geom.Rectangle2D)2 IOException (java.io.IOException)2 PDDocument (org.apache.pdfbox.pdmodel.PDDocument)2 PDAnnotation (org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation)2 Point2D (java.awt.geom.Point2D)1