/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.pdfbox.pdmodel.documentinterchange.taggedpdf; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.color.PDGamma; /** * A Layout attribute object. * * @author Johannes Koch */ public class PDLayoutAttributeObject extends PDStandardAttributeObject { /** * standard attribute owner: Layout */ public static final String OWNER_LAYOUT = "Layout"; private static final String PLACEMENT = "Placement"; private static final String WRITING_MODE = "WritingMode"; private static final String BACKGROUND_COLOR = "BackgroundColor"; private static final String BORDER_COLOR = "BorderColor"; private static final String BORDER_STYLE = "BorderStyle"; private static final String BORDER_THICKNESS = "BorderThickness"; private static final String PADDING = "Padding"; private static final String COLOR = "Color"; private static final String SPACE_BEFORE = "SpaceBefore"; private static final String SPACE_AFTER = "SpaceAfter"; private static final String START_INDENT = "StartIndent"; private static final String END_INDENT = "EndIndent"; private static final String TEXT_INDENT = "TextIndent"; private static final String TEXT_ALIGN = "TextAlign"; private static final String BBOX = "BBox"; private static final String WIDTH = "Width"; private static final String HEIGHT = "Height"; private static final String BLOCK_ALIGN = "BlockAlign"; private static final String INLINE_ALIGN = "InlineAlign"; private static final String T_BORDER_STYLE = "TBorderStyle"; private static final String T_PADDING = "TPadding"; private static final String BASELINE_SHIFT = "BaselineShift"; private static final String LINE_HEIGHT = "LineHeight"; private static final String TEXT_DECORATION_COLOR = "TextDecorationColor"; private static final String TEXT_DECORATION_THICKNESS = "TextDecorationThickness"; private static final String TEXT_DECORATION_TYPE = "TextDecorationType"; private static final String RUBY_ALIGN = "RubyAlign"; private static final String RUBY_POSITION = "RubyPosition"; private static final String GLYPH_ORIENTATION_VERTICAL = "GlyphOrientationVertical"; private static final String COLUMN_COUNT = "ColumnCount"; private static final String COLUMN_GAP = "ColumnGap"; private static final String COLUMN_WIDTHS = "ColumnWidths"; /** * Placement: Block: Stacked in the block-progression direction within an * enclosing reference area or parent BLSE. */ public static final String PLACEMENT_BLOCK = "Block"; /** * Placement: Inline: Packed in the inline-progression direction within an * enclosing BLSE. */ public static final String PLACEMENT_INLINE = "Inline"; /** * Placement: Before: Placed so that the before edge of the element’s * allocation rectangle coincides with that of the nearest enclosing * reference area. The element may float, if necessary, to achieve the * specified placement. The element shall be treated as a block occupying * the full extent of the enclosing reference area in the inline direction. * Other content shall be stacked so as to begin at the after edge of the * element’s allocation rectangle. */ public static final String PLACEMENT_BEFORE = "Before"; /** * Placement: Start: Placed so that the start edge of the element’s * allocation rectangle coincides with that of the nearest enclosing * reference area. The element may float, if necessary, to achieve the * specified placement. Other content that would intrude into the element’s * allocation rectangle shall be laid out as a runaround. */ public static final String PLACEMENT_START = "Start"; /** * Placement: End: Placed so that the end edge of the element’s allocation * rectangle coincides with that of the nearest enclosing reference area. * The element may float, if necessary, to achieve the specified placement. * Other content that would intrude into the element’s allocation rectangle * shall be laid out as a runaround. */ public static final String PLACEMENT_END = "End"; /** * WritingMode: LrTb: Inline progression from left to right; block * progression from top to bottom. This is the typical writing mode for * Western writing systems. */ public static final String WRITING_MODE_LRTB = "LrTb"; /** * WritingMode: RlTb: Inline progression from right to left; block * progression from top to bottom. This is the typical writing mode for * Arabic and Hebrew writing systems. */ public static final String WRITING_MODE_RLTB = "RlTb"; /** * WritingMode: TbRl: Inline progression from top to bottom; block * progression from right to left. This is the typical writing mode for * Chinese and Japanese writing systems. */ public static final String WRITING_MODE_TBRL = "TbRl"; /** * BorderStyle: None: No border. Forces the computed value of * BorderThickness to be 0. */ public static final String BORDER_STYLE_NONE = "None"; /** * BorderStyle: Hidden: Same as {@link #BORDER_STYLE_NONE}, except in terms * of border conflict resolution for table elements. */ public static final String BORDER_STYLE_HIDDEN = "Hidden"; /** * BorderStyle: Dotted: The border is a series of dots. */ public static final String BORDER_STYLE_DOTTED = "Dotted"; /** * BorderStyle: Dashed: The border is a series of short line segments. */ public static final String BORDER_STYLE_DASHED = "Dashed"; /** * BorderStyle: Solid: The border is a single line segment. */ public static final String BORDER_STYLE_SOLID = "Solid"; /** * BorderStyle: Double: The border is two solid lines. The sum of the two * lines and the space between them equals the value of BorderThickness. */ public static final String BORDER_STYLE_DOUBLE = "Double"; /** * BorderStyle: Groove: The border looks as though it were carved into the * canvas. */ public static final String BORDER_STYLE_GROOVE = "Groove"; /** * BorderStyle: Ridge: The border looks as though it were coming out of the * canvas (the opposite of {@link #BORDER_STYLE_GROOVE}). */ public static final String BORDER_STYLE_RIDGE = "Ridge"; /** * BorderStyle: Inset: The border makes the entire box look as though it * were embedded in the canvas. */ public static final String BORDER_STYLE_INSET = "Inset"; /** * BorderStyle: Outset: The border makes the entire box look as though it * were coming out of the canvas (the opposite of {@link #BORDER_STYLE_INSET}. */ public static final String BORDER_STYLE_OUTSET = "Outset"; /** * TextAlign: Start: Aligned with the start edge. */ public static final String TEXT_ALIGN_START = "Start"; /** * TextAlign: Center: Centered between the start and end edges. */ public static final String TEXT_ALIGN_CENTER = "Center"; /** * TextAlign: End: Aligned with the end edge. */ public static final String TEXT_ALIGN_END = "End"; /** * TextAlign: Justify: Aligned with both the start and end edges, with * internal spacing within each line expanded, if necessary, to achieve such * alignment. The last (or only) line shall be aligned with the start edge * only. */ public static final String TEXT_ALIGN_JUSTIFY = "Justify"; /** * Width: Auto */ public static final String WIDTH_AUTO = "Auto"; /** * Height: Auto */ public static final String HEIGHT_AUTO = "Auto"; /** * BlockAlign: Before: Before edge of the first child’s allocation rectangle * aligned with that of the table cell’s content rectangle. */ public static final String BLOCK_ALIGN_BEFORE = "Before"; /** * BlockAlign: Middle: Children centered within the table cell. The distance * between the before edge of the first child’s allocation rectangle and * that of the table cell’s content rectangle shall be the same as the * distance between the after edge of the last child’s allocation rectangle * and that of the table cell’s content rectangle. */ public static final String BLOCK_ALIGN_MIDDLE = "Middle"; /** * BlockAlign: After: After edge of the last child’s allocation rectangle * aligned with that of the table cell’s content rectangle. */ public static final String BLOCK_ALIGN_AFTER = "After"; /** * BlockAlign: Justify: Children aligned with both the before and after * edges of the table cell’s content rectangle. The first child shall be * placed as described for {@link #BLOCK_ALIGN_BEFORE} and the last child as * described for {@link #BLOCK_ALIGN_AFTER}, with equal spacing between the * children. If there is only one child, it shall be aligned with the before * edge only, as for {@link #BLOCK_ALIGN_BEFORE}. */ public static final String BLOCK_ALIGN_JUSTIFY = "Justify"; /** * InlineAlign: Start: Start edge of each child’s allocation rectangle * aligned with that of the table cell’s content rectangle. */ public static final String INLINE_ALIGN_START = "Start"; /** * InlineAlign: Center: Each child centered within the table cell. The * distance between the start edges of the child’s allocation rectangle and * the table cell’s content rectangle shall be the same as the distance * between their end edges. */ public static final String INLINE_ALIGN_CENTER = "Center"; /** * InlineAlign: End: End edge of each child’s allocation rectangle aligned * with that of the table cell’s content rectangle. */ public static final String INLINE_ALIGN_END = "End"; /** * LineHeight: NormalAdjust the line height to include any nonzero value * specified for BaselineShift. */ public static final String LINE_HEIGHT_NORMAL = "Normal"; /** * LineHeight: Auto: Adjustment for the value of BaselineShift shall not be * made. */ public static final String LINE_HEIGHT_AUTO = "Auto"; /** * TextDecorationType: None: No text decoration */ public static final String TEXT_DECORATION_TYPE_NONE = "None"; /** * TextDecorationType: Underline: A line below the text */ public static final String TEXT_DECORATION_TYPE_UNDERLINE = "Underline"; /** * TextDecorationType: Overline: A line above the text */ public static final String TEXT_DECORATION_TYPE_OVERLINE = "Overline"; /** * TextDecorationType: LineThrough: A line through the middle of the text */ public static final String TEXT_DECORATION_TYPE_LINE_THROUGH = "LineThrough"; /** * RubyAlign: Start: The content shall be aligned on the start edge in the * inline-progression direction. */ public static final String RUBY_ALIGN_START = "Start"; /** * RubyAlign: Center: The content shall be centered in the * inline-progression direction. */ public static final String RUBY_ALIGN_CENTER = "Center"; /** * RubyAlign: End: The content shall be aligned on the end edge in the * inline-progression direction. */ public static final String RUBY_ALIGN_END = "End"; /** * RubyAlign: Justify: The content shall be expanded to fill the available * width in the inline-progression direction. */ public static final String RUBY_ALIGN_JUSTIFY = "Justify"; /** * RubyAlign: Distribute: The content shall be expanded to fill the * available width in the inline-progression direction. However, space shall * also be inserted at the start edge and end edge of the text. The spacing * shall be distributed using a 1:2:1 (start:infix:end) ratio. It shall be * changed to a 0:1:1 ratio if the ruby appears at the start of a text line * or to a 1:1:0 ratio if the ruby appears at the end of the text line. */ public static final String RUBY_ALIGN_DISTRIBUTE = "Distribute"; /** * RubyPosition: Before: The RT content shall be aligned along the before * edge of the element. */ public static final String RUBY_POSITION_BEFORE = "Before"; /** * RubyPosition: After: The RT content shall be aligned along the after edge * of the element. */ public static final String RUBY_POSITION_AFTER = "After"; /** * RubyPosition: Warichu: The RT and associated RP elements shall be * formatted as a warichu, following the RB element. */ public static final String RUBY_POSITION_WARICHU = "Warichu"; /** * RubyPosition: Inline: The RT and associated RP elements shall be * formatted as a parenthesis comment, following the RB element. */ public static final String RUBY_POSITION_INLINE = "Inline"; /** * GlyphOrientationVertical: Auto */ public static final String GLYPH_ORIENTATION_VERTICAL_AUTO = "Auto"; /** * GlyphOrientationVertical: -180° */ public static final String GLYPH_ORIENTATION_VERTICAL_MINUS_180_DEGREES = "-180"; /** * GlyphOrientationVertical: -90° */ public static final String GLYPH_ORIENTATION_VERTICAL_MINUS_90_DEGREES = "-90"; /** * GlyphOrientationVertical: 0° */ public static final String GLYPH_ORIENTATION_VERTICAL_ZERO_DEGREES = "0"; /** * GlyphOrientationVertical: 90° */ public static final String GLYPH_ORIENTATION_VERTICAL_90_DEGREES = "90"; /** * GlyphOrientationVertical: 180° */ public static final String GLYPH_ORIENTATION_VERTICAL_180_DEGREES = "180"; /** * GlyphOrientationVertical: 270° */ public static final String GLYPH_ORIENTATION_VERTICAL_270_DEGREES = "270"; /** * GlyphOrientationVertical: 360° */ public static final String GLYPH_ORIENTATION_VERTICAL_360_DEGREES = "360"; /** * Default constructor. */ public PDLayoutAttributeObject() { this.setOwner(OWNER_LAYOUT); } /** * Creates a new Layout attribute object with a given dictionary. * * @param dictionary the dictionary */ public PDLayoutAttributeObject(COSDictionary dictionary) { super(dictionary); } /** * Gets the positioning of the element with respect to the enclosing * reference area and other content (Placement). The default value is * {@link #PLACEMENT_INLINE}. * * @return the placement */ public String getPlacement() { return this.getName(PLACEMENT, PLACEMENT_INLINE); } /** * Sets the positioning of the element with respect to the enclosing * reference area and other content (Placement). The value should be one of: * <ul> * <li>{@link #PLACEMENT_BLOCK},</li> * <li>{@link #PLACEMENT_INLINE},</li> * <li>{@link #PLACEMENT_BEFORE},</li> * <li>{@link #PLACEMENT_START},</li> * <li>{@link #PLACEMENT_END}.</li> * </ul> * * @param placement the placement */ public void setPlacement(String placement) { this.setName(PLACEMENT, placement); } /** * Gets the writing mode (WritingMode). The default value is * {@link #WRITING_MODE_LRTB}. * * @return the writing mode */ public String getWritingMode() { return this.getName(WRITING_MODE, WRITING_MODE_LRTB); } /** * Sets the writing mode (WritingMode). The value should be one of: * <ul> * <li>{@link #WRITING_MODE_LRTB},</li> * <li>{@link #WRITING_MODE_RLTB},</li> * <li>{@link #WRITING_MODE_TBRL}.</li> * </ul> * * @param writingMode the writing mode */ public void setWritingMode(String writingMode) { this.setName(WRITING_MODE, writingMode); } /** * Gets the background colour (BackgroundColor). * * @return the background colour */ public PDGamma getBackgroundColor() { return this.getColor(BACKGROUND_COLOR); } /** * Sets the background colour (BackgroundColor). * * @param backgroundColor the background colour */ public void setBackgroundColor(PDGamma backgroundColor) { this.setColor(BACKGROUND_COLOR, backgroundColor); } /** * Gets the border colour (BorderColor). * * @return a single border colour ({@link PDGamma}) or four border colours * ({@link PDFourColours}) */ public Object getBorderColors() { return this.getColorOrFourColors(BORDER_COLOR); } /** * Sets the same border colour for all four sides (BorderColor). * * @param borderColor the border colour */ public void setAllBorderColors(PDGamma borderColor) { this.setColor(BORDER_COLOR, borderColor); } /** * Sets the border colours for four sides separately (BorderColor). * * @param borderColors the border colours */ public void setBorderColors(PDFourColours borderColors) { this.setFourColors(BORDER_COLOR, borderColors); } /** * Gets the border style (BorderStyle). The default value is * {@link #BORDER_STYLE_NONE}. * * @return the border styles (a String or an array of four Strings) */ public Object getBorderStyle() { return this.getNameOrArrayOfName(BORDER_STYLE, BORDER_STYLE_NONE); } /** * Sets the same border style for all four sides (BorderStyle). The value * should be one of: * <ul> * <li>{@link #BORDER_STYLE_NONE},</li> * <li>{@link #BORDER_STYLE_HIDDEN},</li> * <li>{@link #BORDER_STYLE_DOTTED},</li> * <li>{@link #BORDER_STYLE_DASHED},</li> * <li>{@link #BORDER_STYLE_SOLID},</li> * <li>{@link #BORDER_STYLE_DOUBLE},</li> * <li>{@link #BORDER_STYLE_GROOVE},</li> * <li>{@link #BORDER_STYLE_RIDGE},</li> * <li>{@link #BORDER_STYLE_INSET},</li> * <li>{@link #BORDER_STYLE_OUTSET}.</li> * </ul> * * @param borderStyle the border style */ public void setAllBorderStyles(String borderStyle) { this.setName(BORDER_STYLE, borderStyle); } /** * Sets the border styles for four sides separately (BorderStyle). The * values should be of: * <ul> * <li>{@link #BORDER_STYLE_NONE},</li> * <li>{@link #BORDER_STYLE_HIDDEN},</li> * <li>{@link #BORDER_STYLE_DOTTED},</li> * <li>{@link #BORDER_STYLE_DASHED},</li> * <li>{@link #BORDER_STYLE_SOLID},</li> * <li>{@link #BORDER_STYLE_DOUBLE},</li> * <li>{@link #BORDER_STYLE_GROOVE},</li> * <li>{@link #BORDER_STYLE_RIDGE},</li> * <li>{@link #BORDER_STYLE_INSET},</li> * <li>{@link #BORDER_STYLE_OUTSET}.</li> * </ul> * * @param borderStyles the border styles (an array of four Strings) */ public void setBorderStyles(String[] borderStyles) { this.setArrayOfName(BORDER_STYLE, borderStyles); } /** * Gets the border thickness (BorderThickness). * * @return the border thickness (a Float or an array of four floats) */ public Object getBorderThickness() { return this.getNumberOrArrayOfNumber(BORDER_THICKNESS, UNSPECIFIED); } /** * Sets the same border thickness for all four sides (BorderThickness). * * @param borderThickness the border thickness */ public void setAllBorderThicknesses(float borderThickness) { this.setNumber(BORDER_THICKNESS, borderThickness); } /** * Sets the same border thickness for all four sides (BorderThickness). * * @param borderThickness the border thickness */ public void setAllBorderThicknesses(int borderThickness) { this.setNumber(BORDER_THICKNESS, borderThickness); } /** * Sets the border thicknesses for four sides separately (BorderThickness). * * @param borderThicknesses the border thickness (an array of four floats) */ public void setBorderThicknesses(float[] borderThicknesses) { this.setArrayOfNumber(BORDER_THICKNESS, borderThicknesses); } /** * Gets the padding (Padding). The default value is 0. * * @return the padding (a Float or an array of float) */ public Object getPadding() { return this.getNumberOrArrayOfNumber(PADDING, 0.f); } /** * Sets the same padding for all four sides (Padding). * * @param padding the padding */ public void setAllPaddings(float padding) { this.setNumber(PADDING, padding); } /** * Sets the same padding for all four sides (Padding). * * @param padding the padding */ public void setAllPaddings(int padding) { this.setNumber(PADDING, padding); } /** * Sets the paddings for four sides separately (Padding). * * @param paddings the paddings (an array of four floats) */ public void setPaddings(float[] paddings) { this.setArrayOfNumber(PADDING, paddings); } /** * Gets the color to be used for drawing text and the default value for the * colour of table borders and text decorations (Color). * * @return the colour */ public PDGamma getColor() { return this.getColor(COLOR); } /** * Sets the color to be used for drawing text and the default value for the * colour of table borders and text decorations (Color). * * @param color the colour */ public void setColor(PDGamma color) { this.setColor(COLOR, color); } /** * Gets the amount of extra space preceding the before edge of the BLSE in * the block-progression direction (SpaceBefore). The default value is 0. * * @return the space before */ public float getSpaceBefore() { return this.getNumber(SPACE_BEFORE, 0.f); } /** * Sets the amount of extra space preceding the before edge of the BLSE in * the block-progression direction (SpaceBefore). * * @param spaceBefore the space before */ public void setSpaceBefore(float spaceBefore) { this.setNumber(SPACE_BEFORE, spaceBefore); } /** * Sets the amount of extra space preceding the before edge of the BLSE in * the block-progression direction (SpaceBefore). * * @param spaceBefore the space before */ public void setSpaceBefore(int spaceBefore) { this.setNumber(SPACE_BEFORE, spaceBefore); } /** * Gets the amount of extra space following the after edge of the BLSE in * the block-progression direction (SpaceAfter). The default value is 0. * * @return the space after */ public float getSpaceAfter() { return this.getNumber(SPACE_AFTER, 0.f); } /** * Sets the amount of extra space following the after edge of the BLSE in * the block-progression direction (SpaceAfter). * * @param spaceAfter the space after */ public void setSpaceAfter(float spaceAfter) { this.setNumber(SPACE_AFTER, spaceAfter); } /** * Sets the amount of extra space following the after edge of the BLSE in * the block-progression direction (SpaceAfter). * * @param spaceAfter the space after */ public void setSpaceAfter(int spaceAfter) { this.setNumber(SPACE_AFTER, spaceAfter); } /** * Gets the distance from the start edge of the reference area to that of * the BLSE in the inline-progression direction (StartIndent). The default value is 0. * * @return the start indent */ public float getStartIndent() { return this.getNumber(START_INDENT, 0.f); } /** * Sets the distance from the start edge of the reference area to that of * the BLSE in the inline-progression direction (StartIndent). * * @param startIndent the start indent */ public void setStartIndent(float startIndent) { this.setNumber(START_INDENT, startIndent); } /** * Sets the distance from the start edge of the reference area to that of * the BLSE in the inline-progression direction (StartIndent). * * @param startIndent the start indent */ public void setStartIndent(int startIndent) { this.setNumber(START_INDENT, startIndent); } /** * Gets the distance from the end edge of the BLSE to that of the reference * area in the inline-progression direction (EndIndent). The default value * is 0. * * @return the end indent */ public float getEndIndent() { return this.getNumber(END_INDENT, 0.f); } /** * Sets the distance from the end edge of the BLSE to that of the reference * area in the inline-progression direction (EndIndent). * * @param endIndent the end indent */ public void setEndIndent(float endIndent) { this.setNumber(END_INDENT, endIndent); } /** * Sets the distance from the end edge of the BLSE to that of the reference * area in the inline-progression direction (EndIndent). * * @param endIndent the end indent */ public void setEndIndent(int endIndent) { this.setNumber(END_INDENT, endIndent); } /** * Gets the additional distance in the inline-progression direction from the * start edge of the BLSE, as specified by StartIndent, to that of the first * line of text (TextIndent). The default value is 0. * * @return the text indent */ public float getTextIndent() { return this.getNumber(TEXT_INDENT, 0.f); } /** * Sets the additional distance in the inline-progression direction from the * start edge of the BLSE, as specified by StartIndent, to that of the first * line of text (TextIndent). * * @param textIndent the text indent */ public void setTextIndent(float textIndent) { this.setNumber(TEXT_INDENT, textIndent); } /** * Sets the additional distance in the inline-progression direction from the * start edge of the BLSE, as specified by StartIndent, to that of the first * line of text (TextIndent). * * @param textIndent the text indent */ public void setTextIndent(int textIndent) { this.setNumber(TEXT_INDENT, textIndent); } /** * Gets the alignment, in the inline-progression direction, of text and * other content within lines of the BLSE (TextAlign). The default value is * {@link #TEXT_ALIGN_START}. * * @return the text alignment */ public String getTextAlign() { return this.getName(TEXT_ALIGN, TEXT_ALIGN_START); } /** * Sets the alignment, in the inline-progression direction, of text and * other content within lines of the BLSE (TextAlign). The value should be * one of: * <ul> * <li>{@link #TEXT_ALIGN_START},</li> * <li>{@link #TEXT_ALIGN_CENTER},</li> * <li>{@link #TEXT_ALIGN_END},</li> * <li>{@link #TEXT_ALIGN_JUSTIFY}.</li> * </ul> * * @param textIndent the text alignment */ public void setTextAlign(String textIndent) { this.setName(TEXT_ALIGN, textIndent); } /** * Gets the bounding box. * * @return the bounding box. */ public PDRectangle getBBox() { COSArray array = (COSArray) this.getCOSObject().getDictionaryObject(BBOX); if (array != null) { return new PDRectangle(array); } return null; } /** * Sets the bounding box. * * @param bbox the bounding box */ public void setBBox(PDRectangle bbox) { String name = BBOX; COSBase oldValue = this.getCOSObject().getDictionaryObject(name); this.getCOSObject().setItem(name, bbox); COSBase newValue = bbox == null ? null : bbox.getCOSObject(); this.potentiallyNotifyChanged(oldValue, newValue); } /** * Gets the width of the element’s content rectangle in the * inline-progression direction (Width). The default value is * {@link #WIDTH_AUTO}. * * @return the width (a Float or a String) */ public Object getWidth() { return this.getNumberOrName(WIDTH, WIDTH_AUTO); } /** * Sets the width of the element’s content rectangle in the * inline-progression direction (Width) to {@link #WIDTH_AUTO}. */ public void setWidthAuto() { this.setName(WIDTH, WIDTH_AUTO); } /** * Sets the width of the element’s content rectangle in the * inline-progression direction (Width). * * @param width the width */ public void setWidth(float width) { this.setNumber(WIDTH, width); } /** * Sets the width of the element’s content rectangle in the * inline-progression direction (Width). * * @param width the width */ public void setWidth(int width) { this.setNumber(WIDTH, width); } /** * Gets the height of the element’s content rectangle in the * block-progression direction (Height). The default value is * {@link #HEIGHT_AUTO}. * * @return the height (a Float or a String) */ public Object getHeight() { return this.getNumberOrName(HEIGHT, HEIGHT_AUTO); } /** * Sets the height of the element’s content rectangle in the * block-progression direction (Height) to {@link #HEIGHT_AUTO}. */ public void setHeightAuto() { this.setName(HEIGHT, HEIGHT_AUTO); } /** * Sets the height of the element’s content rectangle in the * block-progression direction (Height). * * @param height the height */ public void setHeight(float height) { this.setNumber(HEIGHT, height); } /** * Sets the height of the element’s content rectangle in the * block-progression direction (Height). * * @param height the height */ public void setHeight(int height) { this.setNumber(HEIGHT, height); } /** * Gets the alignment, in the block-progression direction, of content within * the table cell (BlockAlign). The default value is * {@link #BLOCK_ALIGN_BEFORE}. * * @return the block alignment */ public String getBlockAlign() { return this.getName(BLOCK_ALIGN, BLOCK_ALIGN_BEFORE); } /** * Sets the alignment, in the block-progression direction, of content within * the table cell (BlockAlign). The value should be one of: * <ul> * <li>{@link #BLOCK_ALIGN_BEFORE},</li> * <li>{@link #BLOCK_ALIGN_MIDDLE},</li> * <li>{@link #BLOCK_ALIGN_AFTER},</li> * <li>{@link #BLOCK_ALIGN_JUSTIFY}.</li> * </ul> * * @param blockAlign the block alignment */ public void setBlockAlign(String blockAlign) { this.setName(BLOCK_ALIGN, blockAlign); } /** * Gets the alignment, in the inline-progression direction, of content * within the table cell (InlineAlign). The default value is * {@link #INLINE_ALIGN_START}. * * @return the inline alignment */ public String getInlineAlign() { return this.getName(INLINE_ALIGN, INLINE_ALIGN_START); } /** * Sets the alignment, in the inline-progression direction, of content * within the table cell (InlineAlign). The value should be one of * <ul> * <li>{@link #INLINE_ALIGN_START},</li> * <li>{@link #INLINE_ALIGN_CENTER},</li> * <li>{@link #INLINE_ALIGN_END}.</li> * </ul> * * @param inlineAlign the inline alignment */ public void setInlineAlign(String inlineAlign) { this.setName(INLINE_ALIGN, inlineAlign); } /** * Gets the style of the border drawn on each edge of a table cell * (TBorderStyle). * * @return the border style. */ public Object getTBorderStyle() { return this.getNameOrArrayOfName(T_BORDER_STYLE, BORDER_STYLE_NONE); } /** * Sets the same table border style for all four sides (TBorderStyle). The * value should be one of: * <ul> * <li>{@link #BORDER_STYLE_NONE},</li> * <li>{@link #BORDER_STYLE_HIDDEN},</li> * <li>{@link #BORDER_STYLE_DOTTED},</li> * <li>{@link #BORDER_STYLE_DASHED},</li> * <li>{@link #BORDER_STYLE_SOLID},</li> * <li>{@link #BORDER_STYLE_DOUBLE},</li> * <li>{@link #BORDER_STYLE_GROOVE},</li> * <li>{@link #BORDER_STYLE_RIDGE},</li> * <li>{@link #BORDER_STYLE_INSET},</li> * <li>{@link #BORDER_STYLE_OUTSET}.</li> * </ul> * * @param tBorderStyle the table border style */ public void setAllTBorderStyles(String tBorderStyle) { this.setName(T_BORDER_STYLE, tBorderStyle); } /** * Sets the style of the border drawn on each edge of a table cell * (TBorderStyle). The values should be of: * <ul> * <li>{@link #BORDER_STYLE_NONE},</li> * <li>{@link #BORDER_STYLE_HIDDEN},</li> * <li>{@link #BORDER_STYLE_DOTTED},</li> * <li>{@link #BORDER_STYLE_DASHED},</li> * <li>{@link #BORDER_STYLE_SOLID},</li> * <li>{@link #BORDER_STYLE_DOUBLE},</li> * <li>{@link #BORDER_STYLE_GROOVE},</li> * <li>{@link #BORDER_STYLE_RIDGE},</li> * <li>{@link #BORDER_STYLE_INSET},</li> * <li>{@link #BORDER_STYLE_OUTSET}.</li> * </ul> * * @param tBorderStyles */ public void setTBorderStyles(String[] tBorderStyles) { this.setArrayOfName(T_BORDER_STYLE, tBorderStyles); } /** * Gets the offset to account for the separation between the table cell’s * content rectangle and the surrounding border (TPadding). The default * value is 0. * * @return the table padding (a Float or an array of float) */ public Object getTPadding() { return this.getNumberOrArrayOfNumber(T_PADDING, 0.f); } /** * Sets the same table padding for all four sides (TPadding). * * @param tPadding the table padding */ public void setAllTPaddings(float tPadding) { this.setNumber(T_PADDING, tPadding); } /** * Sets the same table padding for all four sides (TPadding). * * @param tPadding the table padding */ public void setAllTPaddings(int tPadding) { this.setNumber(T_PADDING, tPadding); } /** * Sets the table paddings for four sides separately (TPadding). * * @param tPaddings the table paddings (an array of four floats) */ public void setTPaddings(float[] tPaddings) { this.setArrayOfNumber(T_PADDING, tPaddings); } /** * Gets the distance by which the element’s baseline shall be shifted * relative to that of its parent element (BaselineShift). The default value * is 0. * * @return the baseline shift */ public float getBaselineShift() { return this.getNumber(BASELINE_SHIFT, 0.f); } /** * Sets the distance by which the element’s baseline shall be shifted * relative to that of its parent element (BaselineShift). * * @param baselineShift the baseline shift */ public void setBaselineShift(float baselineShift) { this.setNumber(BASELINE_SHIFT, baselineShift); } /** * Sets the distance by which the element’s baseline shall be shifted * relative to that of its parent element (BaselineShift). * * @param baselineShift the baseline shift */ public void setBaselineShift(int baselineShift) { this.setNumber(BASELINE_SHIFT, baselineShift); } /** * Gets the element’s preferred height in the block-progression direction * (LineHeight). The default value is {@link #LINE_HEIGHT_NORMAL}. * * @return the line height (a Float or a String) */ public Object getLineHeight() { return this.getNumberOrName(LINE_HEIGHT, LINE_HEIGHT_NORMAL); } /** * Sets the element’s preferred height in the block-progression direction * (LineHeight) to {@link #LINE_HEIGHT_NORMAL}. */ public void setLineHeightNormal() { this.setName(LINE_HEIGHT, LINE_HEIGHT_NORMAL); } /** * Sets the element’s preferred height in the block-progression direction * (LineHeight) to {@link #LINE_HEIGHT_AUTO}. */ public void setLineHeightAuto() { this.setName(LINE_HEIGHT, LINE_HEIGHT_AUTO); } /** * Sets the element’s preferred height in the block-progression direction * (LineHeight). * * @param lineHeight the line height */ public void setLineHeight(float lineHeight) { this.setNumber(LINE_HEIGHT, lineHeight); } /** * Sets the element’s preferred height in the block-progression direction * (LineHeight). * * @param lineHeight the line height */ public void setLineHeight(int lineHeight) { this.setNumber(LINE_HEIGHT, lineHeight); } /** * Gets the colour to be used for drawing text decorations * (TextDecorationColor). * * @return the text decoration colour */ public PDGamma getTextDecorationColor() { return this.getColor(TEXT_DECORATION_COLOR); } /** * Sets the colour to be used for drawing text decorations * (TextDecorationColor). * * @param textDecorationColor the text decoration colour */ public void setTextDecorationColor(PDGamma textDecorationColor) { this.setColor(TEXT_DECORATION_COLOR, textDecorationColor); } /** * Gets the thickness of each line drawn as part of the text decoration * (TextDecorationThickness). * * @return the text decoration thickness */ public float getTextDecorationThickness() { return this.getNumber(TEXT_DECORATION_THICKNESS); } /** * Sets the thickness of each line drawn as part of the text decoration * (TextDecorationThickness). * * @param textDecorationThickness the text decoration thickness */ public void setTextDecorationThickness(float textDecorationThickness) { this.setNumber(TEXT_DECORATION_THICKNESS, textDecorationThickness); } /** * Sets the thickness of each line drawn as part of the text decoration * (TextDecorationThickness). * * @param textDecorationThickness the text decoration thickness */ public void setTextDecorationThickness(int textDecorationThickness) { this.setNumber(TEXT_DECORATION_THICKNESS, textDecorationThickness); } /** * Gets the type of text decoration (TextDecorationType). The default value * is {@link #TEXT_DECORATION_TYPE_NONE}. * * @return the type of text decoration */ public String getTextDecorationType() { return this.getName(TEXT_DECORATION_TYPE, TEXT_DECORATION_TYPE_NONE); } /** * Sets the type of text decoration (TextDecorationType). The value should * be one of: * <ul> * <li>{@link #TEXT_DECORATION_TYPE_NONE},</li> * <li>{@link #TEXT_DECORATION_TYPE_UNDERLINE},</li> * <li>{@link #TEXT_DECORATION_TYPE_OVERLINE},</li> * <li>{@link #TEXT_DECORATION_TYPE_LINE_THROUGH}.</li> * </ul> * * @param textDecorationType the type of text decoration */ public void setTextDecorationType(String textDecorationType) { this.setName(TEXT_DECORATION_TYPE, textDecorationType); } /** * Gets the justification of the lines within a ruby assembly (RubyAlign). * The default value is {@link #RUBY_ALIGN_DISTRIBUTE}. * * @return the ruby alignment */ public String getRubyAlign() { return this.getName(RUBY_ALIGN, RUBY_ALIGN_DISTRIBUTE); } /** * Sets the justification of the lines within a ruby assembly (RubyAlign). * The value should be one of: * <ul> * <li>{@link #RUBY_ALIGN_START},</li> * <li>{@link #RUBY_ALIGN_CENTER},</li> * <li>{@link #RUBY_ALIGN_END},</li> * <li>{@link #RUBY_ALIGN_JUSTIFY},</li> * <li>{@link #RUBY_ALIGN_DISTRIBUTE},</li> * </ul> * * @param rubyAlign the ruby alignment */ public void setRubyAlign(String rubyAlign) { this.setName(RUBY_ALIGN, rubyAlign); } /** * Gets the placement of the RT structure element relative to the RB element * in a ruby assembly (RubyPosition). The default value is * {@link #RUBY_POSITION_BEFORE}. * * @return the ruby position */ public String getRubyPosition() { return this.getName(RUBY_POSITION, RUBY_POSITION_BEFORE); } /** * Sets the placement of the RT structure element relative to the RB element * in a ruby assembly (RubyPosition). The value should be one of: * <ul> * <li>{@link #RUBY_POSITION_BEFORE},</li> * <li>{@link #RUBY_POSITION_AFTER},</li> * <li>{@link #RUBY_POSITION_WARICHU},</li> * <li>{@link #RUBY_POSITION_INLINE}.</li> * </ul> * * @param rubyPosition the ruby position */ public void setRubyPosition(String rubyPosition) { this.setName(RUBY_POSITION, rubyPosition); } /** * Gets the orientation of glyphs when the inline-progression direction is * top to bottom or bottom to top (GlyphOrientationVertical). The default * value is {@link #GLYPH_ORIENTATION_VERTICAL_AUTO}. * * @return the vertical glyph orientation */ public String getGlyphOrientationVertical() { return this.getName(GLYPH_ORIENTATION_VERTICAL, GLYPH_ORIENTATION_VERTICAL_AUTO); } /** * Sets the orientation of glyphs when the inline-progression direction is * top to bottom or bottom to top (GlyphOrientationVertical). The value * should be one of: * <ul> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_AUTO},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_MINUS_180_DEGREES},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_MINUS_90_DEGREES},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_ZERO_DEGREES},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_90_DEGREES},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_180_DEGREES},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_270_DEGREES},</li> * <li>{@link #GLYPH_ORIENTATION_VERTICAL_360_DEGREES}.</li> * </ul> * * @param glyphOrientationVertical the vertical glyph orientation */ public void setGlyphOrientationVertical(String glyphOrientationVertical) { this.setName(GLYPH_ORIENTATION_VERTICAL, glyphOrientationVertical); } /** * Gets the number of columns in the content of the grouping element * (ColumnCount). The default value is 1. * * @return the column count */ public int getColumnCount() { return this.getInteger(COLUMN_COUNT, 1); } /** * Sets the number of columns in the content of the grouping element * (ColumnCount). * * @param columnCount the column count */ public void setColumnCount(int columnCount) { this.setInteger(COLUMN_COUNT, columnCount); } /** * Gets the desired space between adjacent columns in the inline-progression * direction (ColumnGap). * * @return the column gap (FLoat or array of floats) */ public Object getColumnGap() { return this.getNumberOrArrayOfNumber(COLUMN_GAP, UNSPECIFIED); } /** * Sets the desired space between all columns in the inline-progression * direction (ColumnGap). * * @param columnGap the column gap */ public void setColumnGap(float columnGap) { this.setNumber(COLUMN_GAP, columnGap); } /** * Sets the desired space between all columns in the inline-progression * direction (ColumnGap). * * @param columnGap the column gap */ public void setColumnGap(int columnGap) { this.setNumber(COLUMN_GAP, columnGap); } /** * Sets the desired space between adjacent columns in the inline-progression * direction (ColumnGap), the first element specifying the space between the * first and second columns, the second specifying the space between the * second and third columns, and so on. * * @param columnGaps the column gaps */ public void setColumnGaps(float[] columnGaps) { this.setArrayOfNumber(COLUMN_GAP, columnGaps); } /** * Gets the desired width of the columns, measured in default user space * units in the inline-progression direction (ColumnWidths). * * @return the column widths (Float or array of floats) */ public Object getColumnWidths() { return this.getNumberOrArrayOfNumber(COLUMN_WIDTHS, UNSPECIFIED); } /** * Sets the same column width for all columns (ColumnWidths). * * @param columnWidth the column width */ public void setAllColumnWidths(float columnWidth) { this.setNumber(COLUMN_WIDTHS, columnWidth); } /** * Sets the same column width for all columns (ColumnWidths). * * @param columnWidth the column width */ public void setAllColumnWidths(int columnWidth) { this.setNumber(COLUMN_WIDTHS, columnWidth); } /** * Sets the column widths for the columns separately (ColumnWidths). * * @param columnWidths the column widths */ public void setColumnWidths(float[] columnWidths) { this.setArrayOfNumber(COLUMN_WIDTHS, columnWidths); } @Override public String toString() { StringBuilder sb = new StringBuilder().append(super.toString()); if (this.isSpecified(PLACEMENT)) { sb.append(", Placement=").append(this.getPlacement()); } if (this.isSpecified(WRITING_MODE)) { sb.append(", WritingMode=").append(this.getWritingMode()); } if (this.isSpecified(BACKGROUND_COLOR)) { sb.append(", BackgroundColor=").append(this.getBackgroundColor()); } if (this.isSpecified(BORDER_COLOR)) { sb.append(", BorderColor=").append(this.getBorderColors()); } if (this.isSpecified(BORDER_STYLE)) { Object borderStyle = this.getBorderStyle(); sb.append(", BorderStyle="); if (borderStyle instanceof String[]) { sb.append(arrayToString((String[]) borderStyle)); } else { sb.append(borderStyle); } } if (this.isSpecified(BORDER_THICKNESS)) { Object borderThickness = this.getBorderThickness(); sb.append(", BorderThickness="); if (borderThickness instanceof float[]) { sb.append(arrayToString((float[]) borderThickness)); } else { sb.append(String.valueOf(borderThickness)); } } if (this.isSpecified(PADDING)) { Object padding = this.getPadding(); sb.append(", Padding="); if (padding instanceof float[]) { sb.append(arrayToString((float[]) padding)); } else { sb.append(String.valueOf(padding)); } } if (this.isSpecified(COLOR)) { sb.append(", Color=").append(this.getColor()); } if (this.isSpecified(SPACE_BEFORE)) { sb.append(", SpaceBefore=") .append(String.valueOf(this.getSpaceBefore())); } if (this.isSpecified(SPACE_AFTER)) { sb.append(", SpaceAfter=") .append(String.valueOf(this.getSpaceAfter())); } if (this.isSpecified(START_INDENT)) { sb.append(", StartIndent=") .append(String.valueOf(this.getStartIndent())); } if (this.isSpecified(END_INDENT)) { sb.append(", EndIndent=") .append(String.valueOf(this.getEndIndent())); } if (this.isSpecified(TEXT_INDENT)) { sb.append(", TextIndent=") .append(String.valueOf(this.getTextIndent())); } if (this.isSpecified(TEXT_ALIGN)) { sb.append(", TextAlign=").append(this.getTextAlign()); } if (this.isSpecified(BBOX)) { sb.append(", BBox=").append(this.getBBox()); } if (this.isSpecified(WIDTH)) { Object width = this.getWidth(); sb.append(", Width="); if (width instanceof Float) { sb.append(String.valueOf(width)); } else { sb.append(width); } } if (this.isSpecified(HEIGHT)) { Object height = this.getHeight(); sb.append(", Height="); if (height instanceof Float) { sb.append(String.valueOf(height)); } else { sb.append(height); } } if (this.isSpecified(BLOCK_ALIGN)) { sb.append(", BlockAlign=").append(this.getBlockAlign()); } if (this.isSpecified(INLINE_ALIGN)) { sb.append(", InlineAlign=").append(this.getInlineAlign()); } if (this.isSpecified(T_BORDER_STYLE)) { Object tBorderStyle = this.getTBorderStyle(); sb.append(", TBorderStyle="); if (tBorderStyle instanceof String[]) { sb.append(arrayToString((String[]) tBorderStyle)); } else { sb.append(tBorderStyle); } } if (this.isSpecified(T_PADDING)) { Object tPadding = this.getTPadding(); sb.append(", TPadding="); if (tPadding instanceof float[]) { sb.append(arrayToString((float[]) tPadding)); } else { sb.append(String.valueOf(tPadding)); } } if (this.isSpecified(BASELINE_SHIFT)) { sb.append(", BaselineShift=") .append(String.valueOf(this.getBaselineShift())); } if (this.isSpecified(LINE_HEIGHT)) { Object lineHeight = this.getLineHeight(); sb.append(", LineHeight="); if (lineHeight instanceof Float) { sb.append(String.valueOf(lineHeight)); } else { sb.append(lineHeight); } } if (this.isSpecified(TEXT_DECORATION_COLOR)) { sb.append(", TextDecorationColor=") .append(this.getTextDecorationColor()); } if (this.isSpecified(TEXT_DECORATION_THICKNESS)) { sb.append(", TextDecorationThickness=") .append(String.valueOf(this.getTextDecorationThickness())); } if (this.isSpecified(TEXT_DECORATION_TYPE)) { sb.append(", TextDecorationType=") .append(this.getTextDecorationType()); } if (this.isSpecified(RUBY_ALIGN)) { sb.append(", RubyAlign=").append(this.getRubyAlign()); } if (this.isSpecified(RUBY_POSITION)) { sb.append(", RubyPosition=").append(this.getRubyPosition()); } if (this.isSpecified(GLYPH_ORIENTATION_VERTICAL)) { sb.append(", GlyphOrientationVertical=") .append(this.getGlyphOrientationVertical()); } if (this.isSpecified(COLUMN_COUNT)) { sb.append(", ColumnCount=") .append(String.valueOf(this.getColumnCount())); } if (this.isSpecified(COLUMN_GAP)) { Object columnGap = this.getColumnGap(); sb.append(", ColumnGap="); if (columnGap instanceof float[]) { sb.append(arrayToString((float[]) columnGap)); } else { sb.append(String.valueOf(columnGap)); } } if (this.isSpecified(COLUMN_WIDTHS)) { Object columnWidth = this.getColumnWidths(); sb.append(", ColumnWidths="); if (columnWidth instanceof float[]) { sb.append(arrayToString((float[]) columnWidth)); } else { sb.append(String.valueOf(columnWidth)); } } return sb.toString(); } }