Мне нужно добавить изображение в мой файл docx
. Изображение является png
изображением подписи, которое помещается за текстом в строке подписи сертификата, которое пользователь должен загрузить в виде docx
, pdf
или jpg
. Первая проблема, с которой я столкнулся, заключается в том, что вы можете добавить встроенное изображение только с использованием последней версии docx4j (v6.1.2), и создание изображения Anchor
в настоящее время отключено (см. BinaryPartAbstractImage.java: строка 1029 ). Это проблема, поскольку изображение подписи не является встроенным, оно должно появляться за именем в строке подписи. Вместо того, чтобы вставлять один сам, мой обходной путь должен поместить изображение заполнителя:
![enter image description here](https://i.stack.imgur.com/HcOj6.png)
Эти изображения отображаются как image1.png
и image2.png
, соответственно, в каталоге /word/media
несжатой версии docx
. Затем программа заменяет их на имя, должность и фактическую png
подписи при каждом создании сертификата.
![enter image description here](https://i.stack.imgur.com/tS68x.png)
Проблема в том, что изображения масштабируются так же, как и изображение-заполнитель, где фактически оно должно выглядеть следующим образом:
![enter image description here](https://i.stack.imgur.com/36HGV.jpg)
Как мне сохранить размер изображения после замены или хотя бы соотношение сторон? Вот как я заменяю изображение-заполнитель новым изображением:
File approveBySignatureImage = new File(...);
final String approvedByImageNodeId = "rId5";
replaceImageById(approvedByImageNodeId,
"image1.png", approveBySignatureImage);
Это фактический метод, где происходит замена:
public void replaceImageById(String id, String placeholderImageName, File newImage) throws Exception {
Relationship rel = document.getMainDocumentPart().getRelationshipsPart().getRelationshipByID(id);
BinaryPartAbstractImage imagePart;
if(FilenameUtils.getExtension(placeholderImageName).toLowerCase() == ContentTypes.EXTENSION_BMP) {
imagePart = new ImageBmpPart(new PartName("/word/media/" + placeholderImageName));
}
else if([ContentTypes.EXTENSION_JPG_1, ContentTypes.EXTENSION_JPG_2].contains(FilenameUtils.getExtension(placeholderImageName).toLowerCase())) {
imagePart = new ImageJpegPart(new PartName("/word/media/" + placeholderImageName));
}
else if(FilenameUtils.getExtension(placeholderImageName).toLowerCase() == ContentTypes.EXTENSION_PNG) {
imagePart = new ImagePngPart(new PartName("/word/media/" + placeholderImageName));
}
InputStream stream = new FileInputStream(newImage);
imagePart.setBinaryData(stream);
if(FilenameUtils.getExtension(newImage.getName()).toLowerCase() == ContentTypes.EXTENSION_BMP) {
imagePart.setContentType(new ContentType(ContentTypes.IMAGE_BMP));
}
else if([ContentTypes.EXTENSION_JPG_1, ContentTypes.EXTENSION_JPG_2].contains(FilenameUtils.getExtension(newImage.getName()).toLowerCase())) {
imagePart.setContentType(new ContentType(ContentTypes.IMAGE_JPEG));
}
else if(FilenameUtils.getExtension(newImage.getName()).toLowerCase() == ContentTypes.EXTENSION_PNG) {
imagePart.setContentType(new ContentType(ContentTypes.IMAGE_PNG));
}
imagePart.setRelationshipType(Namespaces.IMAGE);
final String embedId = rel.getId();
rel = document.getMainDocumentPart().addTargetPart(imagePart);
rel.setId(embedId);
}