Сохранять размер нового изображения при замене старого изображения с помощью docx4j - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно добавить изображение в мой файл docx. Изображение является png изображением подписи, которое помещается за текстом в строке подписи сертификата, которое пользователь должен загрузить в виде docx, pdf или jpg. Первая проблема, с которой я столкнулся, заключается в том, что вы можете добавить встроенное изображение только с использованием последней версии docx4j (v6.1.2), и создание изображения Anchor в настоящее время отключено (см. BinaryPartAbstractImage.java: строка 1029 ). Это проблема, поскольку изображение подписи не является встроенным, оно должно появляться за именем в строке подписи. Вместо того, чтобы вставлять один сам, мой обходной путь должен поместить изображение заполнителя:

enter image description here

Эти изображения отображаются как image1.png и image2.png, соответственно, в каталоге /word/media несжатой версии docx. Затем программа заменяет их на имя, должность и фактическую png подписи при каждом создании сертификата.

enter image description here

Проблема в том, что изображения масштабируются так же, как и изображение-заполнитель, где фактически оно должно выглядеть следующим образом:

enter image description here

Как мне сохранить размер изображения после замены или хотя бы соотношение сторон? Вот как я заменяю изображение-заполнитель новым изображением:

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);
}

1 Ответ

0 голосов
/ 12 апреля 2019

Вам нужно установить размеры (или, возможно, просто удалить то, что у вас есть?) На вашем изображении-заполнителе.

За помощь в этом: -

docx4j проверяет изображение на https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/BinaryPartAbstractImage.java#L512, используя org.apache.xmlgraphics ImageInfo.

См. Также CxCy: https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/BinaryPartAbstractImage.java#L1164

https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/BinaryPartAbstractImage.java#L815 показывает масштабирование для поддержания соотношения сторон.

...