aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpdanner <pdanner@7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c>2010-11-09 10:34:41 +0000
committerpdanner <pdanner@7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c>2010-11-09 10:34:41 +0000
commit4f296fc3f837412b330f5a5183769dba50704649 (patch)
tree58123ba9fe09c643a1d13a5b14873fbd76d7ae56
parent85ec627dba6daa69ea41593e5b1258ba589cadb3 (diff)
downloadpdf-as-3-4f296fc3f837412b330f5a5183769dba50704649.tar.gz
pdf-as-3-4f296fc3f837412b330f5a5183769dba50704649.tar.bz2
pdf-as-3-4f296fc3f837412b330f5a5183769dba50704649.zip
signature positioning bugfix
git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@607 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java287
1 files changed, 36 insertions, 251 deletions
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java
index 0bae3d2..cb4e642 100644
--- a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java
@@ -88,248 +88,6 @@ public class PDFPage extends PDFTextStripper
operators.put("Do", newInvoke);
}
- // /**
- // * You should override this method if you want to perform an action when a
- // * string is being shown.
- // *
- // * @param string The string to display.
- // *
- // * @throws IOException If there is an error showing the string
- // */
- // public void showString( byte[] string ) throws IOException
- // {
- // float spaceWidth = 0;
- // float spacing = 0;
- // StringBuffer stringResult = new StringBuffer(string.length);
- //
- // float characterDisplacement = 0;
- // float spaceDisplacement = 0;
- //
- // PDGraphicsState graphicsState = getGraphicsState();
- // float fontSize = graphicsState.getTextState().getFontSize();
- // float horizontalScaling =
- // graphicsState.getTextState().getHorizontalScalingPercent()/100f;
- // float rise = graphicsState.getTextState().getRise();
- // final float wordSpacing = graphicsState.getTextState().getWordSpacing();
- // final float characterSpacing =
- // graphicsState.getTextState().getCharacterSpacing();
- // float wordSpacingDisplacement = 0;
- //
- // PDFont font = graphicsState.getTextState().getFont();
- //
- // //This will typically be 1000 but in the case of a type3 font
- // //this might be a different number
- // float glyphSpaceToTextSpaceFactor = 1f/font.getFontMatrix().getValue( 0, 0
- // );
- // Float averageWidth = (Float)fontToAverageWidths.get( font );
- // if( averageWidth == null )
- // {
- // averageWidth = new Float( font.getAverageFontWidth() );
- // fontToAverageWidths.put( font, averageWidth );
- // }
- //
- // Matrix initialMatrix = new Matrix();
- // initialMatrix.setValue(0,0,1);
- // initialMatrix.setValue(0,1,0);
- // initialMatrix.setValue(0,2,0);
- // initialMatrix.setValue(1,0,0);
- // initialMatrix.setValue(1,1,1);
- // initialMatrix.setValue(1,2,0);
- // initialMatrix.setValue(2,0,0);
- // initialMatrix.setValue(2,1,rise);
- // initialMatrix.setValue(2,2,1);
- //
- //
- // //this
- // int codeLength = 1;
- // Matrix ctm = graphicsState.getCurrentTransformationMatrix();
- //
- // //lets see what the space displacement should be
- // spaceDisplacement = (font.getFontWidth( SPACE_BYTES, 0, 1
- // )/glyphSpaceToTextSpaceFactor);
- // if( spaceDisplacement == 0 )
- // {
- // spaceDisplacement =
- // (averageWidth.floatValue()/glyphSpaceToTextSpaceFactor);
- // //The average space width appears to be higher than necessary
- // //so lets make it a little bit smaller.
- // spaceDisplacement *= .80f;
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "Font: Space From Average=" + spaceDisplacement );
- // }
- // }
- // int pageRotation = page.findRotation();
- //
- // // very strange.... the ctms are multiplied by right, but suddenly the
- // textM is multiplied from the left.
- // // but: PDF matrices are multiplied from left ==> ctm is wrong
- // Matrix trm = initialMatrix.multiply( textMatrix ).multiply( ctm );
- // float x = trm.getValue(2,0);
- // float y = trm.getValue(2,1);
- // float flipped_y = -y + page.findMediaBox().getHeight();
- // if( pageRotation == 0 )
- // {
- // trm.setValue( 2,1, flipped_y );
- // }
- // else if( pageRotation == 90 )
- // {
- // trm.setValue( 2,0, y );
- // trm.setValue( 2,1, x );
- // }
- // else if( pageRotation == 270 )
- // {
- // trm.setValue( 2,0, flipped_y );
- // trm.setValue( 2,1, x );
- // }
- // for( int i=0; i<string.length; i+=codeLength )
- // {
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "initialMatrix=" + initialMatrix );
- // log.debug( "textMatrix=" + textMatrix );
- // log.debug( "initialMatrix.multiply( textMatrix )=" +
- // initialMatrix.multiply( textMatrix ) );
- // log.debug( "ctm=" + ctm );
- // log.debug( "trm=" + initialMatrix.multiply( textMatrix ).multiply( ctm ) );
- // }
- // codeLength = 1;
- //
- // String c = font.encode( string, i, codeLength );
- //
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "Character Code=" + string[i] + "='" + c + "'" );
- // }
- // if( c == null && i+1<string.length)
- // {
- // //maybe a multibyte encoding
- // codeLength++;
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "Multibyte Character Code=" + string[i] + string[i+1] );
- // }
- // c = font.encode( string, i, codeLength );
- // }
- // stringResult.append( c );
- //
- // //todo, handle horizontal displacement
- // characterDisplacement += (font.getFontWidth( string, i, codeLength
- // )/glyphSpaceToTextSpaceFactor);
- //
- //
- // // PDF Spec - 5.5.2 Word Spacing
- // //
- // // Word spacing works the same was as character spacing, but applies
- // // only to the space character, code 32.
- // //
- // // Note: Word spacing is applied to every occurrence of the single-byte
- // // character code 32 in a string. This can occur when using a simple
- // // font or a composite font that defines code 32 as a single-byte code.
- // // It does not apply to occurrences of the byte value 32 in multiple-byte
- // // codes.
- // //
- // // RDD - My interpretation of this is that only character code 32's that
- // // encode to spaces should have word spacing applied. Cases have been
- // // observed where a font has a space character with a character code
- // // other than 32, and where word spacing (Tw) was used. In these cases,
- // // applying word spacing to either the non-32 space or to the character
- // // code 32 non-space resulted in errors consistent with this
- // interpretation.
- // //
- //
- // boolean withCS = false;
- // if( (string[i] == 0x20) && c.equals( " " ) )
- // {
- // spacing += wordSpacing + characterSpacing;
- // withCS = true;
- // }
- // else
- // {
- // spacing += characterSpacing;
- // }
- //
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "Checking code '" + c + "' font=" +
- // graphicsState.getTextState().getFont() +
- // " Tc=" + characterSpacing +
- // " Tw=" + wordSpacing +
- // " fontSize=" + fontSize +
- // " horizontalScaling=" + horizontalScaling +
- // " totalDisp=" + characterDisplacement +
- // " spacing=" + spacing + "(" + withCS + ")" );
- // }
- // // We want to update the textMatrix using the width, in text space units.
- // //
- //
- // }
- //
- // //The adjustment will always be zero. The adjustment as shown in the
- // //TJ operator will be handled separately.
- // float adjustment=0;
- // //todo, need to compute the horizontal displacement
- // float ty = 0;
- // float tx =
- // ((characterDisplacement-adjustment/glyphSpaceToTextSpaceFactor)*fontSize +
- // spacing)
- // *horizontalScaling;
- //
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "disp=" + characterDisplacement + " adj=" + adjustment +
- // " fSize=" + fontSize + " tx=" + tx );
- // }
- //
- // float xScale = trm.getXScale();
- // float yScale = trm.getYScale();
- // float xPos = trm.getXPosition();
- // float yPos = trm.getYPosition();
- // spaceWidth = spaceDisplacement * xScale * fontSize;
- // wordSpacingDisplacement = wordSpacing*xScale * fontSize;
- // Matrix td = new Matrix();
- // td.setValue( 2, 0, tx );
- // td.setValue( 2, 1, ty );
- //
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "TRM=" + trm );
- // log.debug( "TextMatrix before " + textMatrix );
- // }
- // float xPosBefore = textMatrix.getXPosition();
- // float yPosBefore = textMatrix.getYPosition();
- // textMatrix = td.multiply( textMatrix );
- // if( log.isDebugEnabled() )
- // {
- // log.debug( "TextMatrix after " + textMatrix );
- // }
- // float totalStringDisplacement = 0;
- // if( pageRotation == 0 )
- // {
- // totalStringDisplacement = (textMatrix.getXPosition() - xPosBefore);
- // }
- // else if( pageRotation == 90 )
- // {
- // totalStringDisplacement = (textMatrix.getYPosition() - yPosBefore);
- // }
- // else if( pageRotation == 270 )
- // {
- // totalStringDisplacement = (yPosBefore - textMatrix.getYPosition());
- // }
- // showCharacter(
- // new TextPosition(
- // xPos,
- // yPos,
- // xScale,
- // yScale,
- // totalStringDisplacement,
- // spaceWidth,
- // stringResult.toString(),
- // graphicsState.getTextState().getFont(),
- // graphicsState.getTextState().getFontSize(),
- // wordSpacingDisplacement ));
- // }
- //
protected void processOperator(PDFOperator operator, List arguments) throws IOException
{
@@ -338,6 +96,7 @@ public class PDFPage extends PDFTextStripper
super.processOperator(operator, arguments);
}
+ // exthex
/**
* A method provided as an event interface to allow a subclass to perform some
* specific functionality when a character needs to be displayed. This method
@@ -429,7 +188,16 @@ public class PDFPage extends PDFTextStripper
Pos [] transformed_coordinates = transtormCoordinates(coordinates, ctm);
+ /**********************************************************
+ * pdf-as fix:
+ * calculating min and max point of an image to look where
+ * the signature should be placed
+ * fix solves problems with footer and images and
+ * placement of the signature in an image only pdf document
+ **********************************************************/
+
float actual_lowest_point = Float.NaN;
+ float actual_starting_point = Float.NaN;
int pageRotation = page.findRotation();
logger_.debug("PageRotation = " + pageRotation);
@@ -439,38 +207,44 @@ public class PDFPage extends PDFTextStripper
logger_.debug("min_y = " + min_y);
float page_height = page.findMediaBox().getHeight();
logger_.debug("page_height = " + page_height);
-
+
actual_lowest_point = page_height - min_y;
+ actual_starting_point = page_height - findMaxY(transformed_coordinates);
}
if (pageRotation == 90)
{
float max_x = findMaxX(transformed_coordinates);
logger_.debug("max_x = " + max_x);
-// float page_width = page.findMediaBox().getWidth();
-// logger_.debug("page_width = " + page_width);
+ float page_width = page.findMediaBox().getWidth();
+ logger_.debug("page_width = " + page_width);
actual_lowest_point = max_x;
+ actual_starting_point = findMinX(transformed_coordinates);
}
if (pageRotation == 180)
{
float min_y = findMinY(transformed_coordinates);
logger_.debug("min_y = " + min_y);
- actual_lowest_point = min_y;
+ float page_height = page.findMediaBox().getHeight();
+ actual_lowest_point = page_height - findMaxY(transformed_coordinates);
+ actual_starting_point = page_height - min_y;
}
if (pageRotation == 270)
{
float min_x = findMinX(transformed_coordinates);
logger_.debug("min_x = " + min_x);
-// float page_width = page.findMediaBox().getWidth();
-// logger_.debug("page_width = " + page_width);
-
- actual_lowest_point = min_x;
+
+ float page_width = page.findMediaBox().getWidth();
+ logger_.debug("page_width = " + page_width);
+
+ actual_lowest_point = page_width - min_x;
+ actual_starting_point = page_width - findMaxX(transformed_coordinates);
}
logger_.debug("actual_lowest_point = " + actual_lowest_point);
- if (actual_lowest_point > PDFPage.this.footer_line)
+ if (actual_lowest_point > PDFPage.this.footer_line && actual_starting_point > PDFPage.this.footer_line)
{
logger_.debug("image is below footer_line. footer_line = " + PDFPage.this.footer_line);
return;
@@ -533,6 +307,17 @@ public class PDFPage extends PDFTextStripper
}
return min;
}
+
+ public static float findMaxY(Pos[] coordinates) {
+ float max = 0;
+ for (int i = 0; i < coordinates.length; i++) {
+ if (coordinates[i].y > max) {
+ max = coordinates[i].y;
+ }
+ }
+ return max;
+ }
+
public static float findMaxX (Pos [] coordinates)
{
float max = Float.NEGATIVE_INFINITY;