diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java | 175 | 
1 files changed, 104 insertions, 71 deletions
| diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java index f9ab652..59a4987 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java @@ -1018,38 +1018,118 @@ public abstract class PdfAS          pos = PdfAS.parsePositionFromPosString(pos_string);
        }
      }
 -
      if (pos == null)
      {
 -      // The automatic algorithm.
 -      return PdfAS.adjustTableAndCalculatePosition(pdf, pdf_table);
 +      // The default algorithm. x,y,w =auto ,p=lastpage, f:ignored because y:auto
 +      pos = new TablePos();	
      }
 -
 -    if (pos.page == -2)
 +    //System.out.println("Tablepos="+pos);
 +    return PdfAS.adjustSignatureTableandCalculatePosition(pdf, pdf_table, pos);    
 +  }
 +  /**
 +   * Sets the width of the table according to the layout of the document and
 +   * calculates the y position where the PDFPTable should be placed.
 +   * 
 +   * @param pdf
 +   *          The PDF document.
 +   * @param pdf_table
 +   *          The PDFPTable to be placed.
 +   * @return Returns the position where the PDFPTable should be placed.
 +   * @throws PDFDocumentException
 +   *           F.e.
 +   */
 +  public static PositioningInstruction adjustSignatureTableandCalculatePosition(
 +      final byte[] pdf, PdfPTable pdf_table, TablePos pos) throws PDFDocumentException
 +  {
 +    //first check pageinstruction in TablePos-object
 +	//new,auto,absolut
 +	PdfReader reader = readInPdfDocument(pdf);
 +	//get pages of currentdocument
 +	int doc_pages = reader.getNumberOfPages();
 +	int page = doc_pages;
 +	if(!(pos.isNewPage() || pos.isPauto()))
 +	{
 +	  //we should posit signaturtable on this page
 +	  page = pos.getPage();
 +	  if (page > doc_pages)
 +	  {
 +		  throw new PDFDocumentException(227, "Page number is to big(=" + page+ ") cannot be parsed.");
 +	  }
 +	}
 +	boolean make_new_page = pos.isNewPage();
 +    //getPagedimensions
 +    Rectangle psize = reader.getPageSizeWithRotation(page);
 +    float page_width = psize.width();
 +    float page_height = psize.height();
 +    //now we can calculate x-position
 +    float pre_pos_x = SIGNATURE_BORDER / 2;
 +    if (!pos.isXauto())
 +    {
 +      //we do have absolute x
 +      pre_pos_x = pos.getPosX();
 +    }     
 +    final float pos_x = pre_pos_x;
 +    //calculate width
 +    float pre_width = page_width - pos_x - SIGNATURE_BORDER / 2;
 +    if (!pos.isWauto())
      {
 -      // The automatic algorithm regarding the footer.
 -      return PdfAS.adjustTableAndCalculatePositionRegardingFooter(pdf, pdf_table, pos.footer_line);
 +      //we do have absolute width
 +      pre_width = pos.getWidth();
 +    }    
 +    final float width = pre_width;
 +    //Signatur table dimensions are complete 
 +    pdf_table.setTotalWidth(width);
 +    pdf_table.setLockedWidth(true);
 +    final float table_height = pdf_table.getTotalHeight();
 +    //now check pos_y
 +    float pos_y = pos.getPosY();
 +    if (!pos.isYauto())
 +    {
 +    	//we do have y-position too --> all parameters but page ok 
 +        if (make_new_page)
 +        {
 +        	page++;
 +        } 
 +        return new PositioningInstruction(make_new_page, page, pos_x, pos_y);
      }
 -
 -    boolean make_new_page = false;
 -    int page = pos.page;
 -
 -    if (pos.page == -1)
 +    //pos_y is auto
 +    if (make_new_page)
 +    {
 +    	//ignore footer in new page
 +    	page++;
 +    	pos_y = page_height - SIGNATURE_BORDER / 2;
 +    	return new PositioningInstruction(make_new_page, page, pos_x, pos_y); 
 +    }     
 +    //up to here no checks have to be made if Tablesize and Pagesize are fit 
 +    //Now we have to getfreespace in page and reguard footerline  
 +    float footer_line = pos.getFooterLine();
 +    float pre_page_length = PDFUtilities.calculatePageLength(pdf, page-1, page_height-footer_line);
 +    if (pre_page_length == Float.NEGATIVE_INFINITY)
 +    {
 +    	//we do have an empty page
 +    	//pre_page_length = page_height;
 +    	pos_y = page_height - SIGNATURE_BORDER / 2;
 +    	return new PositioningInstruction(make_new_page, page, pos_x, pos_y);
 +    }    
 +    final float page_length = pre_page_length;
 +    pos_y = page_height - page_length - SIGNATURE_MARGIN;
 +    if (pos_y - footer_line <= table_height)
      {
 -      // Absolute positioning on a new page.
        make_new_page = true;
 -      PdfReader reader = PdfAS.readInPdfDocument(pdf);
 -      page = reader.getNumberOfPages() + 1;
 -      reader = null;
 +      if (!pos.isPauto())
 +      {  
 +    	page = reader.getNumberOfPages();
 +        
 +      }
 +      page++;
 +      pos_y = page_height - SIGNATURE_BORDER / 2;
      }
 -
 -    pdf_table.setTotalWidth(pos.width);
 -    pdf_table.setLockedWidth(true);
 -
 -    return new PositioningInstruction(make_new_page, page, pos.pos_x, pos.pos_y);
 -
 +    return new PositioningInstruction(make_new_page, page, pos_x, pos_y);
    }
 +  
 +  
 +  
    /**
     * Sets the width of the table according to the layout of the document and
     * calculates the y position where the PDFPTable should be placed.
 @@ -1175,61 +1255,14 @@ public abstract class PdfAS     * Parses the TablePos object from a given String with the appropriate format.
     * 
     * @param pos_string
 -   *          The pos string. e.g. 1;40.0;600.0;300.0
 +   *          The pos string. e.g. x:40.0;y:auto;w:auto;p:1;f:300.0 
     * @return Returns the parsed TablePos object.
     * @throws PDFDocumentException
     *           Thrown, if the String doesn't have the proper format.
     */
    public static TablePos parsePositionFromPosString(String pos_string) throws PDFDocumentException
    {
 -    String[] strs = pos_string.split(";");
 -
 -    try
 -    {
 -      TablePos pos = new TablePos();
 -      pos.page = Integer.parseInt(strs[0]);
 -
 -      if (pos.page < 1 && pos.page != -1 && pos.page != -2)
 -      {
 -        throw new PDFDocumentException(225, "Page (=" + pos.page + ") must not be lower than -2 and must not be 0.");
 -      }
 -
 -      if (pos.page == -2)
 -      {
 -        if (strs.length != 2)
 -        {
 -          throw new PDFDocumentException(224, "Pos string (=" + pos_string + ") is invalid.");
 -        }
 -
 -        pos.footer_line = Float.parseFloat(strs[1]);
 -      }
 -      else
 -      {
 -        if (strs.length != 4)
 -        {
 -          throw new PDFDocumentException(224, "Pos string (=" + pos_string + ") is invalid.");
 -        }
 -
 -        pos.pos_x = Float.parseFloat(strs[1]);
 -        pos.pos_y = Float.parseFloat(strs[2]);
 -        pos.width = Float.parseFloat(strs[3]);
 -
 -        if (pos.page < 1 && pos.page != -1)
 -        {
 -          throw new PDFDocumentException(225, "pos.page (=" + pos.page + ") must not be lower than -1 and must not be 0.");
 -        }
 -
 -        if (pos.width <= 0.0f)
 -        {
 -          throw new PDFDocumentException(226, "pos.width (=" + pos.width + ") must not be lower or equal 0.");
 -        }
 -      }
 -
 +      TablePos pos = new TablePos(pos_string);
        return pos;
 -    }
 -    catch (NumberFormatException e)
 -    {
 -      throw new PDFDocumentException(224, "Pos string (=" + pos_string + ") cannot be parsed.");
 -    }
    }
  }
 | 
