Apache POI Bild in Word ersetzen

Diskutiere Apache POI Bild in Word ersetzen im Allgemeine Java-Themen Bereich.
I

imox

Hey Leute,

ich denke die Überschrift sagt alles ;) Kann mir jemand eine gute Lösung, zum ersetzen von Bilder in einem Word Dokument mit Apache POI, anbieten?

Ich habe schon ein wenig gegoogelt und auch einige Lösungen gefunden, allerdings funktionieren die nicht wirklich. Ich würde auch gerne, dass die Formatierung von dem Bild erhalten bleibt.

Gruß
Imox
 
mihe7

mihe7

Der Vergleich hinkt, da Du nicht zeichnest (oder schreiben wir aneinander vorbei?). Wenn Du an einer Pinnwand ein Bild ersetzen willst, musst Du das bestehende von der Pinnwand entfernen und das neue anpinnen.
 
Flown

Flown

@imox
1. Mind your language
2. Was hast du bereits versucht? Was funktioniert nicht?
3. @mihe7 hat dir genau gesagt wie es funktioniert. Ersetzen ist im wahrsten Sinne des Wortes wegnehmen und neues hinhängen. Auch in Word.
 
I

imox

@imox
1. Mind your language
Ähm mache ich doch!
2. Was hast du bereits versucht? Was funktioniert nicht?
Ich habe das hier bei Stackoverflow gefunden:

Java:
    public static XWPFDocument replaceImage(XWPFDocument document, String imageOldName, String imagePathNew,
            int newImageWidth, int newImageHeight) throws Exception {
        try {
            int imageParagraphPos = -1;
            XWPFParagraph imageParagraph = null;

            List<IBodyElement> documentElements = document.getHeaderFooterPolicy().getDefaultFooter().getBodyElements();
            for (IBodyElement documentElement : documentElements) {
                imageParagraphPos++;

                if (documentElement instanceof XWPFParagraph) {
                    imageParagraph = (XWPFParagraph) documentElement;
                    if (imageParagraph != null && imageParagraph.getCTP() != null
                            && imageParagraph.getCTP().toString().trim().indexOf(imageOldName) != -1) {
                        System.out.println(imageParagraph.getText());
                        System.out.println("sdfsf");
                        break;
                    }
                }
            }

            if (imageParagraph == null) {
                throw new Exception("Unable to replace image data due to the exception:\n" + "'" + imageOldName
                        + "' not found in in document.");
            }
            ParagraphAlignment oldImageAlignment = imageParagraph.getAlignment();

            // remove old image
            document.removeBodyElement(imageParagraphPos);

            // now add new image

            // BELOW LINE WILL CREATE AN IMAGE
            // PARAGRAPH AT THE END OF THE DOCUMENT.
            // REMOVE THIS IMAGE PARAGRAPH AFTER
            // SETTING THE NEW IMAGE AT THE OLD IMAGE POSITION
            XWPFParagraph newImageParagraph = document.createParagraph();
            XWPFRun newImageRun = newImageParagraph.createRun();
            // newImageRun.setText(newImageText);
            newImageParagraph.setAlignment(oldImageAlignment);
            try (FileInputStream is = new FileInputStream(imagePathNew)) {
                newImageRun.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, imagePathNew, Units.toEMU(newImageWidth),
                        Units.toEMU(newImageHeight));
            }
//            imageParagraphPos;
            // set new image at the old image position
            document.setParagraph(newImageParagraph, imageParagraphPos);

            // NOW REMOVE REDUNDANT IMAGE FORM THE END OF DOCUMENT
            document.removeBodyElement(document.getBodyElements().size() - 1);

            return document;
        } catch (Exception e) {
            throw new Exception("Unable to replace image '" + imageOldName + "' due to the exception:\n" + e);
        } finally {
            // cleanup code
        }
    }
3. @mihe7 hat dir genau gesagt wie es funktioniert. Ersetzen ist im wahrsten Sinne des Wortes wegnehmen und neues hinhängen. Auch in Word.
Ähm ja dass ist aber schon klar. Ist irgendwie so als wenn ich dir sage: Um eine App zu schreiben musst du programmieren können. Ist schon irgendwie logisch oder? Anyway!!!



Also der code funktioniert soweit halbwegs. Aber irgendwie auch nicht richtig. Manchmal löscht es trotzdem andere Texte raus oder word files wo viel drin steht funktionieren nicht.

Es würd eigentlich vollkommen in Ordnung sein, wenn ich gar kein Bild ersetze, sondern einfach nur ein neues Bild an eine Bestimmte Position einsetze mit einer bestimmten Formatierung.

Hab hier eine Idee wie genau ich das machen kann?
 
Zuletzt bearbeitet von einem Moderator:
mrBrown

mrBrown

Manchmal löscht es trotzdem andere Texte raus
Spontan würde ich denken, dass du mit document.removeBodyElement(imageParagraphPos); das Element an Position imageParagraphPos entfernst, alle nachfolgenden rutschen dann eins auf, und mit document.setParagraph(newImageParagraph, imageParagraphPos); überschreibst du dann das Element, welches jetzt an Position imageParagraphPos steht.


word files wo viel drin steht funktionieren nicht
Was bedeutet "funktionieren nicht"?
Dein Code stürzt ab? Word-File ist danach einfach kaputt? Es wird nichts geändert?
 
I

imox

Ja genau das Bild wird gesucht dann wird sich die Position gemerkt und ein neues hinzugefügt und das alte dann gelöscht. Wenn ich die Zeile auskommentiere, dann ist das bild doppelt drin also das remove brauchts schon.

Es verschwinden halt manchmal Texte. Und je nachdem wie viel man das Word file bearbeitet hat, funktionierts irgendwie nicht. Also dann wird diese Exception geschmissen:

throw new Exception("Unable to replace image '" + imageOldName + "' due to the exception:\n" + e);

Aber eigentlich brauche ich dass gar nicht. Es reicht auch wenn ich einfach ein neues Bild hinzufüge. Mein Problem ist nur, dass ich noch nicht herausgefunden habe, wie ich ein Bild formatieren kann. Ich will halt dass es hinter dem Text steht und nicht nur die Größe von dem Bild angegeben wird, sondern auch an welcher Position im Word file das angeordnet wird.

Kurz zu Erklärung: Wir haben sehr viele verschiedene Briefbögen. Und wir haben jeden Briefbogen als wmf file welches wir in den Header setzen. Das funktioniert auch wunderbar. Und ich würde halt gerne mit Java das richtige Bild für den jeweiligen Briefbogen setzen.
 
mrBrown

mrBrown

Ja genau das Bild wird gesucht dann wird sich die Position gemerkt und ein neues hinzugefügt und das alte dann gelöscht. Wenn ich die Zeile auskommentiere, dann ist das bild doppelt drin also das remove brauchts schon.
Ich meine *nicht* das letzte remove, sondern das erste.

Und je nachdem wie viel man das Word file bearbeitet hat, funktionierts irgendwie nicht. Also dann wird diese Exception geschmissen:

throw new Exception("Unable to replace image '" + imageOldName + "' due to the exception:\n" + e);
Da steht doch dann sicher ein Grund bei.
 
I

imox

ja index out of range. Also irgendwas haut dann da nicht mehr genau hin. Aber wie gesagt dass ist jetzt eigentlich auch völlig egal. Weil das eigentliche worum es mir ja geht ist die Formatierung. Und das geht hier auch nicht.
 
Thema: 

Apache POI Bild in Word ersetzen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben