Java Поля документа PDF перекрываются, когда содержимое слишком большое - PullRequest
0 голосов
/ 19 февраля 2020

Я конвертирую изображение в PDF-документ с помощью iText. У меня возникают проблемы, когда я придаю изображению нестандартный размер, который больше, чем сам документ.

Перед тем, как сделать doc.open(), я устанавливаю поля следующим образом doc.setMargins(marginLeft, marginRight, marginTop, marginBottom);

Когда я используйте мой fit метод, он работает как шарм:

// scale
scaledAwtImage = new BufferedImage(scaledWidth, scaledHeight, bufferedImageType);
// instantiate
image = instantiateImage(awtImage, scaledAwtImage, scaledWidth, scaledHeight);
setAutoRotate(image);
// scaleWithMargins
float targetWidth = doc.getPageSize().getWidth() - mmToUnit(Float.parseFloat(marginLeft) + Float.parseFloat(marginRight));
float targetHeight = doc.getPageSize().getHeight() - mmToUnit(Float.parseFloat(marginBottom) + Float.parseFloat(marginTop));
image.scaleToFit(targetWidth, targetHeight);

Возможно из-за image.scaleToFit(). Вот код, с которым у меня проблемы. Как видите, правое поле будет перезаписано изображением. Я не могу использовать image.scaleToFit() здесь, потому что я хочу сохранить нестандартные размеры. Кто-нибудь есть идея?

// printWidth
if(printWidth != null && !printWidth.isEmpty() ){
   scaledWidth = (int) mmToUnit(printWidth);
}
// printHeight
if(printHeight != null && !printHeight.isEmpty() ){
   scaledHeight = (int) mmToUnit(printHeight);
}
scaledAwtImage = new BufferedImage(scaledWidth, scaledHeight, bufferedImageType);
//instantiate
image = instantiateImage(awtImage,scaledAwtImage, scaledWidth, scaledHeight);

enter image description here

РЕДАКТИРОВАТЬ

Забыли опубликовать мой instantiateImage() метод для получения дополнительной информации.

private Image instantiateImage(BufferedImage awtImage, BufferedImage scaledAwtImage, int scaledWidth, int scaledHeight) throws IOException, BadElementException {
 Graphics2D g = scaledAwtImage.createGraphics();
 g.drawImage(awtImage, 0, 0, scaledWidth, scaledHeight, null);
 g.dispose();

 ByteArrayOutputStream bout = new ByteArrayOutputStream();
 ImageIO.write(scaledAwtImage, "jpeg", bout);
 byte[] imageBytes = bout.toByteArray();

 Image image = Image.getInstance(imageBytes);
 return image;
}
...