Рисование изображений в вашем первом файле примера
Я пытался воспроизвести проблему следующим образом:
float CONVERSION_FACTOR_FROM_PIXEL_TO_POINT = 0.75f;
List<DocumentField> documentField = new ArrayList<>();
try ( InputStream resource = getClass().getResourceAsStream("Mix PDF.pdf");
InputStream imageResource = getClass().getResourceAsStream("Signature.png") ) {
byte[] imageBytes = StreamUtil.inputStreamToArray(imageResource);
documentField.add(new DocumentField(0, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(1, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(2, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(3, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(4, "70", "600", "image", imageBytes));
PdfReader pdfReader = new PdfReader(resource);
PdfReader.unethicalreading=true;
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(new File(RESULT_FOLDER, "StampImagesLikeSubhenduMahanta.pdf")));
for(DocumentField df:documentField){
int pageNumber = df.getPageNumber()+1;
PdfContentByte content = pdfStamper.getOverContent(pageNumber);
Rectangle cropBox = pdfReader.getCropBox(pageNumber);
if(pdfReader.getPageRotation(pageNumber) > 0) {
float width = cropBox.getRight();
cropBox.setRight(cropBox.getHeight());
cropBox.setTop(width);
}
if(df.getFieldType().equals("image")){
df.setxPosition(
Float.parseFloat(df.getLeft())*
CONVERSION_FACTOR_FROM_PIXEL_TO_POINT);
df.setyPosition(Float.parseFloat(df.getTop())*CONVERSION_FACTOR_FROM_PIXEL_TO_POINT);
float x = cropBox.getLeft() + df.getxPosition();
float y = cropBox.getTop() - df.getyPosition();
Image image = Image.getInstance(df.getFieldValue());
image.scaleToFit(150*CONVERSION_FACTOR_FROM_PIXEL_TO_POINT, 50*CONVERSION_FACTOR_FROM_PIXEL_TO_POINT);
image.setAbsolutePosition(x, y - 36f);
content.addImage(image);
}else if(df.getFieldType().equals("checkbox")){
//...
}else{
//...
}
}
pdfStamper.close();
}
( StampImages test testStampImagesLikeSubhenduMahanta
)
с этим классом POJO
class DocumentField {
DocumentField(int pageNumber, String left, String top, String fieldType, byte[] fieldValue) {
this.pageNumber = pageNumber;
this.left = left;
this.top = top;
this.fieldType = fieldType;
this.fieldValue = fieldValue;
}
int getPageNumber() { return pageNumber; }
final int pageNumber;
String getLeft() { return left; }
final String left;
String getTop() { return top; }
final String top;
String getFieldType() { return fieldType; }
final String fieldType;
byte[] getFieldValue() { return fieldValue; }
final byte[] fieldValue;
float getxPosition() { return xPosition; }
void setxPosition(float xPosition) { this.xPosition = xPosition; }
float xPosition = 0;
float getyPosition() { return yPosition; }
void setyPosition(float yPosition) { this.yPosition = yPosition; }
float yPosition = 0;
}
( StampImages класс помощника)
В комментарии вы сказали:
Я подписываюсь в одном месте на всех 5 страницах.
Таким образом, я использовал left значения 70
и top значения 600
для всех DocumentField
экземпляров
documentField.add(new DocumentField(0, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(1, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(2, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(3, "70", "600", "image", imageBytes));
documentField.add(new DocumentField(4, "70", "600", "image", imageBytes));
но результат выглядит так:
Как видите, изображения подписи находятся там, где их можно ожидать.
Таким образом, я не могу воспроизвести вашу проблему.
Вы должны проверить значения всех DocumentField
экземпляров и проверить их правильность.
Анализ значений базы данных для вашего второго файла примера
Этот второй пример PDF имеет 3 страницы, размеры для 1-й страницы 682,04 x 297,12, 2-й страницы 610,52 x 788,6, 3-я страница почти такая же, как 2-ая страница 611 X 789,08. [...]
Затем я попытался разместить подпись в нижнем левом углу каждой страницы. Это не удалось. Я сохраняю координаты изображения, перетаскиваемого в базу данных, и значения (0, 350,484), (0,352,328) и (7, 301.688). [...]
Теперь на 1-й странице подпись вставляется в нужном месте. Но для 2-й и 3-й страницы они являются почти серединой страницы в направлении у
Учитывая, что вторая и третья страницы более чем в два раза превышают первую, используя приблизительно одинаковое значение базы данных y (верхняя часть y поля в пикселях от верхней части видимой страницы) на всех страницах (страница 1: ок. 350, стр. 2: около 350, стр. 3: около 300), вероятно, будут иметь совершенно разные визуальные эффекты: эти значения базы данных, очевидно, поместят подпись на среднюю высоту на второй и третьей страницах.
Так что значения в вашей базе данных просто не имеют смысла. Пожалуйста, проверьте процесс генерации и сохранения этих координат.