Как скопировать изображение заголовка файла docx в файл anoter docx в java - PullRequest
0 голосов
/ 31 октября 2018

Я использую docx4j api для создания docx файла. Я успешно скопировал один docx контент в другой. Для копирования содержимого заголовка я получаю текст заголовка. Но мое требование также скопировать заголовок изображения. Как я могу это сделать? Я использую код ниже, чтобы скопировать заголовок-

 WordprocessingMLPackage source = WordprocessingMLPackage.load(new File(
                        "D://PoC//Agenda Formats//test.docx"));
                RelationshipsPart rp = source.getMainDocumentPart()
                                .getRelationshipsPart();
 Relationship rel = rp.getRelationshipByType(Namespaces.HEADER);
 HeaderPart headerPart = (HeaderPart)rp.getPart(rel);
HeaderPart newHeaderPart = new HeaderPart();
newHeaderPart.setContents(XmlUtils.deepCopy(headerPart.getContents()));
return wordprocessingMLPackage.getMainDocumentPart().addTargetPart(
                                newHeaderPart, AddPartBehaviour.RENAME_IF_NAME_EXISTS);

но этот код не копирует изображение. любая помощь приветствуется.

1 Ответ

0 голосов
/ 01 ноября 2018

Попробуйте что-то вроде (не проверено):

void attachHeader(HeaderPart sourcePart, WordprocessingMLPackage targetPkg) throws Docx4JException {

    HeaderPart newHeaderPart = new HeaderPart();
    newHeaderPart.setContents(XmlUtils.deepCopy(sourcePart.getContents()));

    if (sourcePart.getRelationshipsPart()!=null) {

        // clone the rels part
        RelationshipsPart rp = sourcePart.getRelationshipsPart();
        newHeaderPart.getRelationshipsPart(true).setContents(XmlUtils.deepCopy(rp.getContents()));

        // copy/add each part
        for (Relationship r : newHeaderPart.getRelationshipsPart().getContents().getRelationship()) {

            // get the source part
            Part part = sourcePart.getRelationshipsPart().getPart(r.getId());

            // ensure it is loaded
            if (part instanceof BinaryPart) {
                ((BinaryPart)part).getBuffer();
            }

            // You might need to clone this part depending on your use case, but here I'll just attach it to targetPkg              
            targetPkg.getParts().getParts().put(part.getPartName(), part);
                // This simple approach won't work if the target package already contains a part with the same name 
                // To fix that, you'd need to rename the part (also in the rel)

            part.setPackage(targetPkg);
            part.setOwningRelationshipPart(newHeaderPart.getRelationshipsPart());

        }

    }
    targetPkg.getMainDocumentPart().addTargetPart(newHeaderPart,
            AddPartBehaviour.RENAME_IF_NAME_EXISTS);        
}
...