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);
}
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);
}
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);
}
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;
}
}
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);
}
Aggregations