Skip to content

Commit 9632cab

Browse files
committed
Layout: flush image xObjects created in Layout's Image constructor. Make work with WmfImage more consistent
DEVSIX-479
1 parent cb2153e commit 9632cab

File tree

6 files changed

+45
-21
lines changed

6 files changed

+45
-21
lines changed

kernel/src/main/java/com/itextpdf/kernel/PdfException.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public class PdfException extends RuntimeException {
2626
public static final String CannotCopyObjectContent = "cannot.copy.object.content";
2727
public static final String CannotCopyIndirectObjectFromTheDocumentThatIsBeingWritten = "cannot.copy.indirect.object.from.the.document.that.is.being.written";
2828
public static final String CannotCopyToDocumentOpenedInReadingMode = "cannot.copy.to.document.opened.in.reading.mode";
29+
public static final String CannotCreateLayoutImageByWmfImage = "Cannot create layout image by WmfImage instance. First convert the image into FormXObject and then use the corresponding layout image constructor";
30+
public static final String CannotCreatePdfImageXObjectByWmfImage = "Cannot create PdfImageXObject instance by WmfImage. Use PdfFormXObject constructor instead.";
2931
public static final String CannotCreatePdfStreamByInputStreamWithoutPdfDocument = "cannot.create.pdfstream.by.inputstream.without.pdfdocument";
3032
public static final String CannotGetContentBytes = "cannot.get.content.bytes";
3133
public static final String CannotGetPdfStreamBytes = "cannot.get.pdfstream.bytes";

kernel/src/main/java/com/itextpdf/kernel/pdf/xobject/PdfFormXObject.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.itextpdf.kernel.pdf.PdfResources;
1111
import com.itextpdf.kernel.pdf.PdfStream;
1212
import com.itextpdf.kernel.pdf.PdfString;
13+
import com.itextpdf.kernel.pdf.canvas.wmf.WmfImage;
14+
import com.itextpdf.kernel.pdf.canvas.wmf.WmfImageHelper;
1315

1416
public class PdfFormXObject extends PdfXObject {
1517

@@ -41,6 +43,17 @@ public PdfFormXObject(PdfPage page) {
4143
getPdfObject().put(PdfName.Resources, resources.getPdfObject());
4244
}
4345

46+
/**
47+
* Creates a form XObject from {@link WmfImage}.
48+
* Unlike other images, {@link WmfImage} images are represented as {@link PdfFormXObject}, not as
49+
* {@link PdfImageXObject}.
50+
* @param image image to create form object from
51+
* @param pdfDocument document instance which is needed for writing form stream contents
52+
*/
53+
public PdfFormXObject(WmfImage image, PdfDocument pdfDocument) {
54+
this(new WmfImageHelper(image).createPdfForm(pdfDocument).getPdfObject());
55+
}
56+
4457
public PdfResources getResources() {
4558
if (this.resources == null) {
4659
PdfDictionary resources = getPdfObject().getAsDictionary(PdfName.Resources);

kernel/src/main/java/com/itextpdf/kernel/pdf/xobject/PdfImageXObject.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.itextpdf.io.image.RawImage;
88
import com.itextpdf.io.image.RawImageHelper;
99
import com.itextpdf.io.source.ByteArrayOutputStream;
10+
import com.itextpdf.kernel.PdfException;
1011
import com.itextpdf.kernel.Version;
1112
import com.itextpdf.kernel.pdf.PdfArray;
1213
import com.itextpdf.kernel.pdf.PdfBoolean;
@@ -20,6 +21,7 @@
2021
import com.itextpdf.kernel.pdf.PdfReader;
2122
import com.itextpdf.kernel.pdf.PdfStream;
2223
import com.itextpdf.kernel.pdf.PdfString;
24+
import com.itextpdf.kernel.pdf.canvas.wmf.WmfImage;
2325
import com.itextpdf.kernel.pdf.filters.DoNothingFilter;
2426
import com.itextpdf.kernel.pdf.filters.FilterHandler;
2527
import com.itextpdf.kernel.pdf.filters.FilterHandlers;
@@ -48,7 +50,7 @@ public PdfImageXObject(Image image) {
4850
}
4951

5052
public PdfImageXObject(Image image, PdfImageXObject imageMask) {
51-
this(createPdfStream(image, imageMask));
53+
this(createPdfStream(checkImageType(image), imageMask));
5254
mask = image.isMask();
5355
softMask = image.isSoftMask();
5456
}
@@ -425,4 +427,12 @@ private void findColorspace(PdfObject colorspace, boolean allowIndexed) {
425427
}
426428
}
427429

430+
private static Image checkImageType(Image image) {
431+
if (image instanceof WmfImage) {
432+
throw new PdfException(PdfException.CannotCreatePdfImageXObjectByWmfImage);
433+
}
434+
return image;
435+
}
436+
437+
428438
}

layout/src/main/java/com/itextpdf/layout/Property.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum Property {
2727
COLSPAN,
2828
DESTINATION,
2929
FIRST_LINE_INDENT(true),
30+
FLUSH_ON_DRAW,
3031
FONT(true),
3132
FONT_COLOR(true),
3233
FONT_KERNING(true),

layout/src/main/java/com/itextpdf/layout/element/Image.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.itextpdf.layout.element;
22

33
import com.itextpdf.io.LogMessageConstant;
4+
import com.itextpdf.kernel.PdfException;
45
import com.itextpdf.kernel.pdf.PdfName;
6+
import com.itextpdf.kernel.pdf.canvas.wmf.WmfImage;
57
import com.itextpdf.kernel.pdf.tagutils.AccessibleElementProperties;
68
import com.itextpdf.kernel.pdf.tagutils.IAccessibleElement;
79
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
@@ -96,8 +98,8 @@ public Image(PdfFormXObject xObject, float x, float y) {
9698
* @param img an internal representation of the {@link com.itextpdf.io.image.Image image resource}
9799
*/
98100
public Image(com.itextpdf.io.image.Image img) {
99-
this(new PdfImageXObject(img));
100-
// TODO flush this on renderer's draw DEVSIX-479
101+
this(new PdfImageXObject(checkImageType(img)));
102+
setProperty(Property.FLUSH_ON_DRAW, true);
101103
}
102104

103105
/**
@@ -108,14 +110,7 @@ public Image(com.itextpdf.io.image.Image img) {
108110
* @param y a float value representing the vertical offset of the lower left corner of the image
109111
*/
110112
public Image(com.itextpdf.io.image.Image img, float x, float y) {
111-
//@TODO DEVSIX-329
112-
// if (img instanceof WmfImage) {
113-
// this.xObject = new PdfFormXObject(new WmfImageHelper(img).createPdfForm());
114-
// } else {
115-
// this.xObject = new PdfImageXObject(img);
116-
// }
117-
// setProperty(Property.X, x).setProperty(Property.Y, y);
118-
this(new PdfImageXObject(img), x, y);
113+
this(new PdfImageXObject(checkImageType(img)), x, y);
119114
}
120115

121116
/**
@@ -127,14 +122,7 @@ public Image(com.itextpdf.io.image.Image img, float x, float y) {
127122
* @param width a float value
128123
*/
129124
public Image(com.itextpdf.io.image.Image img, float x, float y, float width) {
130-
//@TODO DEVSIX-329
131-
// if (img instanceof WmfImage) {
132-
// this.xObject = new PdfFormXObject(new WmfImageHelper(img).createPdfForm());
133-
// } else {
134-
// this.xObject = new PdfImageXObject(img);
135-
// }
136-
// setProperty(Property.X, x).setProperty(Property.Y, y).setWidth(width).setProperty(Property.POSITION, LayoutPosition.FIXED);
137-
this(new PdfImageXObject(img), x, y, width);
125+
this(new PdfImageXObject(checkImageType(img)), x, y, width);
138126
}
139127

140128
/**
@@ -422,4 +410,11 @@ public AccessibleElementProperties getAccessibilityProperties() {
422410
protected IRenderer makeNewRenderer() {
423411
return new ImageRenderer(this);
424412
}
413+
414+
private static com.itextpdf.io.image.Image checkImageType(com.itextpdf.io.image.Image image) {
415+
if (image instanceof WmfImage) {
416+
throw new PdfException(PdfException.CannotCreatePdfStreamByInputStreamWithoutPdfDocument);
417+
}
418+
return image;
419+
}
425420
}

layout/src/main/java/com/itextpdf/layout/renderer/ImageRenderer.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,11 @@ public void draw(DrawContext drawContext) {
160160
canvas.openTag(new CanvasArtifact());
161161
}
162162

163-
canvas.addXObject(((Image) (getModelElement())).getXObject(), matrix[0], matrix[1], matrix[2], matrix[3],
164-
fixedXPosition + deltaX, fixedYPosition);
163+
PdfXObject xObject = ((Image) (getModelElement())).getXObject();
164+
canvas.addXObject(xObject, matrix[0], matrix[1], matrix[2], matrix[3], fixedXPosition + deltaX, fixedYPosition);
165+
if (Boolean.valueOf(true).equals(getPropertyAsBoolean(Property.FLUSH_ON_DRAW))) {
166+
xObject.flush();
167+
}
165168

166169
if (isTagged || isArtifact) {
167170
canvas.closeTag();

0 commit comments

Comments
 (0)