diff options
13 files changed, 227 insertions, 243 deletions
diff --git a/doc/PDFAS4_Dokumentation.docx b/doc/PDFAS4_Dokumentation.docx Binary files differindex b1bd82d5..736f7672 100644 --- a/doc/PDFAS4_Dokumentation.docx +++ b/doc/PDFAS4_Dokumentation.docx diff --git a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java index 86e270d0..33b6cf85 100644 --- a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java +++ b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java @@ -49,8 +49,12 @@ package at.knowcenter.wag.egov.egiz.pdf; import java.io.Serializable; +import java.text.MessageFormat; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; /** * Class that holds the exact position where the table should be written to the @@ -59,9 +63,14 @@ import at.gv.egiz.pdfas.common.exceptions.PdfAsException; * @author wprinz * @author mruhmer */ +@NoArgsConstructor public class TablePos implements Serializable { + public enum PAGE_MODE {AUTO, LAST, EXACT, NEW}; + public enum POS_MODE {AUTO, EXACT}; + + /** * SVUID. */ @@ -71,198 +80,215 @@ public class TablePos implements Serializable * The page on which the block should be displayed. * */ + @Getter private int page = 0; /** * The x position. */ - private float pos_x = 0.0f; + @Getter + private float posX = 0.0f; /** * The y position. */ - private float pos_y = 0.0f; + @Getter + private float posY = 0.0f; /** * The width of the block. */ - public float width = 0.0f; + @Getter + @Setter + private float width = 0.0f; + /** * The top y position of the footer line. */ - public float footer_line = 0.0f; + private float footerLine = 0.0f; /** * The rotation of the signature block */ - public float rotation = 0.0f; - - /** - * The y position. - */ - public String myposstring = ""; + @Getter + private float rotation = 0.0f; - private boolean newpage = false; - private boolean autoX = true; - private boolean autoY = true; - private boolean autoW = true; - private boolean autoP = true; + + @Getter + private PAGE_MODE pageMode = PAGE_MODE.AUTO; + + @Getter + private POS_MODE xMode = POS_MODE.AUTO; + + @Getter + private POS_MODE yMode = POS_MODE.AUTO; + + @Getter + private POS_MODE wMode = POS_MODE.AUTO; + + public boolean isXauto() { + return xMode.equals(POS_MODE.AUTO); - public boolean isXauto() - { - return this.autoX; } - public boolean isYauto() - { - return this.autoY; + + public boolean isYauto() { + return yMode.equals(POS_MODE.AUTO); + } - public boolean isWauto() - { - return this.autoW; + + public boolean isWauto() { + return wMode.equals(POS_MODE.AUTO); } - public boolean isPauto() - { - return this.autoP; + + public float getFooterLine() { + //ignore if newpage and y is not auto + return yMode.equals(POS_MODE.EXACT) || pageMode.equals(PAGE_MODE.NEW) ? 0.0f : footerLine; + + } + + /** + * Constructor. + * + * @param pos_string The pos instruction. + * format : [x:x_algo];[y:y_algo];[w:w_algo][p:p_algo];[f:f_algo];[r:r_algo] + * x_algo:='auto' ... automatic positioning x + * floatvalue ... absolute x + * y_algo:='auto' ... automatic positioning y + * floatvalue ... absolute y + * w_algo:='auto' ... automatic width + * floatvalue ... absolute width + * p_algo:='auto' ... automatic last page + * 'new' ... new page + * 'last' ... force last page + * intvalue ... pagenumber + * f_algo floatvalue ... consider footerline (only if y_algo is auto and p_algo is not 'new') + * r_algo floatvalue ... rotate the table arround the lower left corner anti clockwise in degree + * @throws PdfAsException + */ + public TablePos(String pos_string) throws PdfAsException { + parsePosString(pos_string); + } - public boolean isNewPage() - { - return this.newpage; + + /** + * Constructor + * @param pos_string The pos instruction. + * format : [x:x_algo];[y:y_algo];[w:w_algo][p:p_algo];[f:f_algo];[r:r_algo] + * x_algo:='auto' ... automatic positioning x + * floatvalue ... absolute x + * y_algo:='auto' ... automatic positioning y + * floatvalue ... absolute y + * w_algo:='auto' ... automatic width + * floatvalue ... absolute width + * p_algo:='auto' ... automatic position + * 'new' ... new page + * 'last' ... force last page + * intvalue ... pagenumber + * f_algo floatvalue ... consider footerline (only if y_algo is auto and p_algo is not 'new') + * r_algo floatvalue ... rotate the table arround the lower left corner anti clockwise in degree + * @param basePosition The base Table Position these values are the base values + * @throws PdfAsException + */ + public TablePos(String pos_string, TablePos basePosition) throws PdfAsException { + if(basePosition != null) { + readFromPos(basePosition); + + } + parsePosString(pos_string); + } - public int getPage() - { - return this.page; + + public String toString() { + String thatsme = "pos_x:"+this.posX+" pos_y:"+this.posY+" page:"+this.page+" width:"+this.width+" footer:"+this.footerLine+" rotation:"+this.rotation+"\n "+" autoX:"+xMode+" autoY:"+yMode+" autoW:"+wMode+" pageMode:"+pageMode; + return thatsme; + + } + + + private float parseAndCheck(String commandval, int minValue, String errorMsg) + throws PdfAsException, NumberFormatException { + float value= Float.parseFloat(commandval); + if (value < minValue) { + throw new PdfAsException(MessageFormat.format(errorMsg, value)); + + } + return value; + } - public float getFooterLine() - { - //ignore if newpage and y is not auto - if (!this.autoY || this.newpage) - { - return 0.0f; - } - return this.footer_line; - } - public float getPosX() - { - return this.pos_x; - } - public float getPosY() - { - return this.pos_y; - } - public float getWidth() - { - return this.width; - } - public TablePos() - { - //nothing to do --> default - } private void parsePosString(String pos_string) throws PdfAsException { //parse posstring and throw exception //[x:x_algo];[y:y_algo];[w:w_algo][p:p_algo];[f:f_algo] String[] strs = pos_string.split(";"); - try - { - for (int cmds = 0;cmds<strs.length;cmds++) - { - + try { + for (int cmds = 0;cmds<strs.length;cmds++) { String cmd_kvstring = strs[cmds]; String[] cmd_kv = cmd_kvstring.split(":"); - if (cmd_kv.length != 2) - { + + if (cmd_kv.length != 2) { throw new PdfAsException("Pos string (=" + pos_string + ") is invalid."); + } + String cmdstr = cmd_kv[0]; - if (cmdstr.length() != 1) - { + if (cmdstr.length() != 1) { throw new PdfAsException("Pos string (=" + pos_string + ") is invalid."); - } + + } + char command = cmdstr.charAt(0); - String commandval= cmd_kv[1]; - switch (command) - { + String commandval= cmd_kv[1]; + switch (command) { case 'x': { - if (!commandval.equalsIgnoreCase("auto")) - { - float xval= Float.parseFloat(commandval); - if (xval<0) - { - throw new PdfAsException("Pos string (x:" + xval + ") is invalid."); - } - this.pos_x = xval; - this.autoX = false; - } else { - this.pos_x = 0.0f; - this.autoX = true; + if (!commandval.equalsIgnoreCase("auto")) { + this.posX = parseAndCheck(commandval, 0, "Pos string (x:{0}) is invalid."); + this.xMode = POS_MODE.EXACT; } break; } case 'y': { - if (!commandval.equalsIgnoreCase("auto")) - { - float yval= Float.parseFloat(commandval); - if (yval<0) - { - throw new PdfAsException("Pos string (y:" + yval + ") is invalid."); - } - this.pos_y = yval; - this.autoY = false; - } else { - this.pos_y = 0.0f; - this.autoY = true; - } + if (!commandval.equalsIgnoreCase("auto")) { + this.posY = parseAndCheck(commandval, 0, "Pos string (y:{0}) is invalid."); + this.yMode = POS_MODE.EXACT; + } break; } case 'w': { - if (!commandval.equalsIgnoreCase("auto")) - { - float wval= Float.parseFloat(commandval); - if (wval<=0) - { - throw new PdfAsException("pos.width (w:" + wval + ") must not be lower or equal 0."); - } - this.width = wval; - this.autoW = false; - } else { - this.width = 0.0f; - this.autoW = true; - } + if (!commandval.equalsIgnoreCase("auto")) { + this.width = parseAndCheck(commandval, 1, "pos.width (w:{0}) must not be lower or equal 0."); + this.wMode = POS_MODE.EXACT; + } break; } case 'p': { - if (!commandval.equalsIgnoreCase("auto")) - { - if (commandval.equalsIgnoreCase("new")) - { - this.newpage = true; - } - else - { + if (!commandval.equalsIgnoreCase("auto")) { + if (commandval.equalsIgnoreCase("new")) { + pageMode = PAGE_MODE.NEW; + + } else if (commandval.equalsIgnoreCase("last")) { + pageMode = PAGE_MODE.LAST; + + } else { int pval = Integer.parseInt(commandval); - if (pval<1) - { + if (pval<1) { throw new PdfAsException("Page (p:" + pval + ") must not be lower than 1."); + } - this.page = pval; - this.autoP = false; + this.page =pval; + pageMode = PAGE_MODE.EXACT; + } + } else { - this.page = 0; - this.autoP = true; - this.newpage = false; + pageMode = PAGE_MODE.AUTO; + } break; } case 'f': { - float flval=Float.parseFloat(commandval); - if (flval<0) - { - throw new PdfAsException("Pos string (=" + pos_string + ") is invalid."); - } - this.footer_line = flval; - break; + footerLine = parseAndCheck(commandval, 0, "Footer pos string (f={0}) is invalid."); + break; } case 'r': { float flval=Float.parseFloat(commandval); @@ -280,7 +306,7 @@ public class TablePos implements Serializable } } } - this.myposstring=pos_string; + } catch (NumberFormatException e) { @@ -289,73 +315,18 @@ public class TablePos implements Serializable } private void readFromPos(TablePos base) { - this.autoP = base.autoP; - this.autoW = base.autoW; - this.autoX = base.autoX; - this.autoY = base.autoY; + this.pageMode = base.getPageMode(); + this.xMode = base.getXMode(); + this.yMode = base.getYMode(); + this.wMode = base.getWMode(); - this.footer_line = base.footer_line; - this.myposstring = base.myposstring; - this.newpage = base.newpage; + this.footerLine = base.getFooterLine(); this.page = base.page; - this.pos_x = base.pos_x; - this.pos_y = base.pos_y; + this.posX = base.posX; + this.posY = base.posY; this.rotation = base.rotation; this.width = base.width; + } - /** - * Constructor. - * - * @param pos_string The pos instruction. - * format : [x:x_algo];[y:y_algo];[w:w_algo][p:p_algo];[f:f_algo];[r:r_algo] - * x_algo:='auto' ... automatic positioning x - * floatvalue ... absolute x - * y_algo:='auto' ... automatic positioning y - * floatvalue ... absolute y - * w_algo:='auto' ... automatic width - * floatvalue ... absolute width - * p_algo:='auto' ... automatic last page - * 'new' ... new page - * intvalue ... pagenumber - * f_algo floatvalue ... consider footerline (only if y_algo is auto and p_algo is not 'new') - * r_algo floatvalue ... rotate the table arround the lower left corner anti clockwise in degree - * @throws PdfAsException - */ - public TablePos(String pos_string) throws PdfAsException - { - parsePosString(pos_string); - } - - /** - * Constructor - * @param pos_string The pos instruction. - * format : [x:x_algo];[y:y_algo];[w:w_algo][p:p_algo];[f:f_algo];[r:r_algo] - * x_algo:='auto' ... automatic positioning x - * floatvalue ... absolute x - * y_algo:='auto' ... automatic positioning y - * floatvalue ... absolute y - * w_algo:='auto' ... automatic width - * floatvalue ... absolute width - * p_algo:='auto' ... automatic last page - * 'new' ... new page - * intvalue ... pagenumber - * f_algo floatvalue ... consider footerline (only if y_algo is auto and p_algo is not 'new') - * r_algo floatvalue ... rotate the table arround the lower left corner anti clockwise in degree - * @param basePosition The base Table Position these values are the base values - * @throws PdfAsException - */ - public TablePos(String pos_string, TablePos basePosition) throws PdfAsException - { - if(basePosition != null) { - readFromPos(basePosition); - } - parsePosString(pos_string); - } - - public String toString() - { - String thatsme = "cmd:"+this.myposstring+" pos_x:"+this.pos_x+" pos_y:"+this.pos_y+" page:"+this.page+" width:"+this.width+" footer:"+this.footer_line+" rotation:"+this.rotation+"\n "+" autoX:"+this.autoX+" autoY:"+this.autoY+" autoW:"+this.autoW+" Newpage:"+this.newpage+" autoP:"+this.autoP; - return thatsme; - } } diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java index d1d097aa..f9dc62fd 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java @@ -40,6 +40,7 @@ import at.gv.egiz.pdfas.lib.impl.pdfbox2.utils.PdfBoxUtils; import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; import at.knowcenter.wag.egov.egiz.pdf.TablePos; +import at.knowcenter.wag.egov.egiz.pdf.TablePos.PAGE_MODE; import at.knowcenter.wag.egov.egiz.pdfbox2.pdf.PDFUtilities; import lombok.extern.slf4j.Slf4j; @@ -100,55 +101,31 @@ public class Positioning { // get pages of currentdocument final int doc_pages = pdfDataSource.getNumberOfPages(); int page = doc_pages; - boolean make_new_page = pos.isNewPage(); + boolean make_new_page = PAGE_MODE.NEW.equals(pos.getPageMode()); - - if (!(pos.isNewPage() || pos.isPauto())) { + if (PAGE_MODE.EXACT.equals(pos.getPageMode())) { // we should posit signaturtable on this page page = pos.getPage(); if (page > doc_pages) { - log.debug("Document is shorter than requested page for signature block. Adding new page ..."); + log.info("Document is shorter than requested page for signature block. Adding new page ..."); make_new_page = true; page = doc_pages; - } + } } - + make_new_page = checkIfNewPageIsAllowed(make_new_page, numberOfExistingSignatures, settings, profilConfig); - - + final PDPage pdPage = pdfDataSource.getPage(page - 1); - PDRectangle cropBox = pdPage.getCropBox(); - - // fallback to MediaBox if Cropbox not available! - - if (cropBox == null) { - cropBox = pdPage.getCropBox(); - } - - if (cropBox == null) { - cropBox = pdPage.getCropBox(); - } - - // getPagedimensions - // Rectangle psize = reader.getPageSizeWithRotation(page); - // int page_rotation = reader.getPageRotation(page); - - // Integer rotation = pdPage.getRotation(); - // int page_rotation = rotation.intValue(); - - final int rotation = pdPage.getRotation(); - log.debug("Original CropBox: " + cropBox.toString()); - + + final int rotation = pdPage.getRotation(); cropBox = rotateBox(cropBox, rotation); - log.debug("Rotated CropBox: " + cropBox.toString()); final float page_width = cropBox.getWidth(); final float page_height = cropBox.getHeight(); - log.debug("CropBox width: " + page_width); log.debug("CropBox heigth: " + page_height); @@ -161,6 +138,8 @@ public class Positioning { // calculate width // center float pre_width = page_width - 2 * pre_pos_x; + + if (!pos.isWauto()) { // we do have absolute width pre_width = pos.getWidth(); @@ -178,9 +157,19 @@ public class Positioning { pdf_table.fixWidth(); final float table_height = pdf_table.getHeight(); + // now check pos_y - float pos_y = pos.getPosY(); - + + // last page was requested. Use all parameters as they was + if (PAGE_MODE.LAST.equals(pos.getPageMode())) { + log.debug("Positioning on last page was requested. Selecting this and use y-position as requested ... "); + return new PositioningInstruction(make_new_page, page, pos_x, + pos.isYauto() ? page_height - SIGNATURE_MARGIN_VERTICAL : pos.getPosY(), + pos.getRotation()); + + } + + // in case an absolute y position is already given OR // if the table is related to an invisible signature // there is no need for further calculations @@ -190,8 +179,9 @@ public class Positioning { if (make_new_page) { page++; - } - return new PositioningInstruction(make_new_page, page, pos_x, pos_y, pos.rotation); + } + + return new PositioningInstruction(make_new_page, page, pos_x, pos.getPosY(), pos.getRotation()); } @@ -199,8 +189,8 @@ public class Positioning { if (make_new_page) { // ignore footer in new page page++; - pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; - return new PositioningInstruction(make_new_page, page, pos_x, pos_y, pos.rotation); + return new PositioningInstruction(make_new_page, page, pos_x, + page_height - SIGNATURE_MARGIN_VERTICAL, pos.getRotation()); } @@ -210,16 +200,16 @@ public class Positioning { float pre_page_length = calculatePrePageLength(pdfDataSource, page, pdf_table, pos.getFooterLine(), settings); if (pre_page_length == Float.NEGATIVE_INFINITY) { - // we do have an empty page or nothing in area above footerline - pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; - return buildPostitionInfoOnSubpage(pdfDataSource, make_new_page, page, pos_x, pos_y, pos.rotation, + // we do have an empty page or nothing in area above footerline + return buildPostitionInfoOnSubpage(pdfDataSource, make_new_page, page, pos_x, + page_height - SIGNATURE_MARGIN_VERTICAL, pos.getRotation(), pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings, profilConfig); } else { // we do have text take SIGNATURE_MARGIN - pos_y = page_height - pre_page_length - SIGNATURE_MARGIN_VERTICAL; - return buildPostitionInfoOnSubpage(pdfDataSource, make_new_page, page, pos_x, pos_y, pos.rotation, - pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings, profilConfig); + return buildPostitionInfoOnSubpage(pdfDataSource, make_new_page, page, pos_x, + page_height - pre_page_length - SIGNATURE_MARGIN_VERTICAL, + pos.getRotation(), pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings, profilConfig); } } @@ -274,15 +264,17 @@ public class Positioning { private static PositioningInstruction buildPostitionInfoOnSubpage(PDDocument pdfDataSource, boolean make_new_page, int page, float pos_x, float pos_y, float rotation, float footer_line, float table_height, TablePos pos, float page_height, long numberOfExistingSignatures, ISettings settings, SignatureProfileSettings profilConfig) throws PdfAsException { + if (pos_y - footer_line <= table_height) { + boolean isPageModeAuto = PAGE_MODE.AUTO.equals(pos.getPageMode()); - make_new_page = checkIfNewPageIsAllowed(pos.isPauto(), numberOfExistingSignatures, settings, profilConfig); + make_new_page = checkIfNewPageIsAllowed(isPageModeAuto, numberOfExistingSignatures, settings, profilConfig); if (make_new_page) { page++; } - if (!pos.isPauto()) { + if (!isPageModeAuto) { // we have to correct pagenumber page = pdfDataSource.getNumberOfPages(); @@ -292,7 +284,7 @@ public class Positioning { } - return new PositioningInstruction(make_new_page, page, pos_x, pos_y, pos.rotation); + return new PositioningInstruction(make_new_page, page, pos_x, pos_y, pos.getRotation()); } diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java index 7aa46149..b32935c6 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java @@ -598,7 +598,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { TablePos tablePos = nextPlaceholderData.getTablePos(); if (minWidth > 0) { if (tablePos.getWidth() < minWidth) { - tablePos.width = minWidth; + tablePos.setWidth(minWidth); log.debug("Correcting placeholder with to minimum width {}", minWidth); } } diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/config.properties new file mode 100644 index 00000000..7013bc17 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/config.properties @@ -0,0 +1,7 @@ +test.type=position +test.name=POS_AUTO_WITH_NEWPAGE +profile.id=SIGNATURBLOCK_DE +position.positioning_string=p:auto +position.page_number=3 +parent=../auto_pos_example.properties +position.ignored_areas=208,803,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/example.pdf Binary files differnew file mode 100644 index 00000000..488e5898 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/example.pdf diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/example_ref.png Binary files differnew file mode 100644 index 00000000..6f537317 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_AUTO_WITH_NEWPAGE/example_ref.png diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/config.properties new file mode 100644 index 00000000..94af6eec --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/config.properties @@ -0,0 +1,7 @@ +test.type=position +test.name=POS_LAST +profile.id=SIGNATURBLOCK_DE +position.positioning_string=p:last +position.page_number=2 +parent=../auto_pos_example.properties +position.ignored_areas=208,803,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/example.pdf Binary files differnew file mode 100644 index 00000000..488e5898 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/example.pdf diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/example_ref.png Binary files differnew file mode 100644 index 00000000..063bf516 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST/example_ref.png diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/config.properties b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/config.properties new file mode 100644 index 00000000..def92788 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/config.properties @@ -0,0 +1,7 @@ +test.type=position +test.name=POS_LAST_WITH_POS +profile.id=SIGNATURBLOCK_DE +position.positioning_string=y:200;p:last +position.page_number=2 +parent=../auto_pos_example.properties +position.ignored_areas=208,181,142,9 diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/example.pdf b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/example.pdf Binary files differnew file mode 100644 index 00000000..488e5898 --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/example.pdf diff --git a/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/example_ref.png b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/example_ref.png Binary files differnew file mode 100644 index 00000000..f43f91dc --- /dev/null +++ b/pdf-as-tests/src/test/test-suites/public_pdfbox2/POS_LAST_WITH_POS/example_ref.png |