opsec2022
Goto Top

CSharp Docx Bookmarks mit Microsoft Interop füllen und entfernen

Ich verwende eine Docx-Vorlage, aktualisiere einige DocVariables und möchte ein Bild mit einem zuvor gesetzten Lesezeichen hinzufügen. Das funktioniert, aber es fügt weiterhin Bilder zur gleichen Vorlage hinzu.

Ich habe einige Zeilen entfernt, da der relevante Teil das Hinzufügen und Entfernen des Bildes zum und vom Lesezeichen ist. Ziel ist, dass es PDFs aus der Docx-Vorlage generiert, aber nur ein Bild enthält und somit in der Vorlage keines gespeichert wird.

Ich habe versucht, zuvor hinzugefügte Bilder mit dem folgenden Code zu entfernen:

while (bookmarkRange.InlineShapes.Count > 0)
{
    bookmarkRange.InlineShapes[1].Delete();
}

Trotz dessen sind auf dem 10. PDF, 10 Bilder, auf dem 20., 20 usw.

private void Convert()
    {

        // Exemplarische Pfade
        string wordTemplatePath = "C:\\Users\\Name\\Desktop\\Neuer_Ordner\\Template.docx";  

        var word = new Microsoft.Office.Interop.Word.Application();
        var template = word.Documents.Open(wordTemplatePath);
        word.Visible = false;

        // Für jede Zeile
        for (int i = 2; i <= totalRows; i++)
        {
            // Bookmark
            Microsoft.Office.Interop.Word.Bookmark bookmark = template.Bookmarks["Signatur"];  

            // Position
            Microsoft.Office.Interop.Word.Range bookmarkRange = bookmark.Range;

            while (bookmarkRange.InlineShapes.Count > 0)
            {
                bookmarkRange.InlineShapes[1].Delete();
            }

            // Pfad
            string signatureFileName = Person + ".png";  
            string signatureFilePath = Path.Combine(Path.GetDirectoryName(wordTemplatePath), signatureFileName);

            // Hinzufügen
            bookmarkRange.InlineShapes.AddPicture(signatureFilePath);

            template.Fields.Update();
            string pdfDocName = $@"{tbOutputPath.Text}\\Doc_{name}_{zeitpunkt.Date:dd.MM.yy}.pdf";  
            if (template != null)
            {
                template.ExportAsFixedFormat(pdfDocName,
                WdExportFormat.wdExportFormatPDF);
            }

        }
        template.Close();
        word.Quit();
    }

Hat hier jemand eine Idee?

Vielen Dank im Voraus

Content-ID: 6257390457

Url: https://administrator.de/forum/csharp-docx-bookmarks-mit-microsoft-interop-fuellen-und-entfernen-6257390457.html

Ausgedruckt am: 22.12.2024 um 11:12 Uhr

6247018886
6247018886 07.03.2023 aktualisiert um 13:01:39 Uhr
Goto Top
Moin.
aber es fügt weiterhin Bilder zur gleichen Vorlage hinzu.
Hat hier jemand eine Idee?
Ja, du erstellt nur ein Dokument vor der Schleife also fügt es alle Bilder in das selbe Dokument ein anstatt für jeden Durchlauf in der Schleife ein separates Dokument zu erstellen ... Du musst also das erstellen eines neuen Dokuments in Zeile 8 in die Schleife verlagern nicht davor.

Cheers briggs
opsec2022
opsec2022 07.03.2023 aktualisiert um 13:35:10 Uhr
Goto Top
Hallo,

danke für die Antwort. Auch mit
 var template = word.Documents.Open(wordTemplatePath);
und
template.Close();
innerhalb der Schleife, verbleiben die Bilder im Template und somit auch in den PDFs

Gruß
6247018886
6247018886 07.03.2023 aktualisiert um 13:40:11 Uhr
Goto Top
verbleiben die Bilder im Template und somit auch in den PDFs
Was willst du denn dann ?? Wenn du Bilder hinzufügst ist es normal das diese auch in er PDF Datei landen?! Dann füge halt keine Bilder hinzu fertig.
Oben schriebst du das du da Bilder drin haben willst und jetzt auf einmal nicht mehr, entscheide dich doch mal oder beschreibe dein Vorhaben detaillierter.
opsec2022
opsec2022 07.03.2023 aktualisiert um 13:45:58 Uhr
Goto Top
verbleiben die Bilder im Template und somit auch in den PDFs
Was willst du denn dann ?? Wenn du Bilder hinzufügst ist es normal das diese auch in er PDF Datei landen?! Dann füge halt keine Bilder hinzu fertig.
Oben schriebst du das du da Bilder drin haben willst und jetzt auf einmal nicht mehr, entscheide dich doch mal oder beschreibe dein Vorhaben detaillierter.

Ziel ist, dass es PDFs aus der Docx-Vorlage generiert, aber nur ein Bild enthält und somit in der Vorlage keines gespeichert wird.

Die Antwort war evtl. unglücklich formuliert. Nach 10 Durchläufen, enthält das Template 10 der Bilder. Ziel ist ein Bild pro PDF, welches somit im Template nicht verbleibt oder ggf. noch in der Schleife, vor dem Hinzufügen entfernt wird.

Mein Ansatz dahingehend

                while (bookmarkRange.InlineShapes.Count > 0)
                {
                    bookmarkRange.InlineShapes[1].Delete();
                }

funktioniert nicht.

Gruß
6247018886
Lösung 6247018886 07.03.2023 aktualisiert um 13:56:36 Uhr
Goto Top
Nach 10 Durchläufen, enthält das Template 10 der Bilder.
Ist ja auch kein Wunder denn du verwendest kein richtiges Template. Das Template selbst sollte die Endung *.dotx haben nicht *.docx.
Hast du das befolgt, kann kann es aus Prinzip nicht sein das sich das Template selbst verändert, weil dann für jeden Schleifendurchlauf ein neues Dokument aus dem Template generiert wird!! Außerdem solltest du den Parameter zum Speichern im Close Befehl auf "false" definieren, template.close(false).

Ziel ist ein Bild pro PDF, welches somit im Template nicht verbleibt oder ggf. noch in der Schleife, vor dem Hinzufügen entfernt wird.
Entfernen brauchst du nicht weil das Template selbst nicht verändert wird. Also überflüssig- Das Template selbst sollte nur das Bookmark und selbst keine Bild mehr enthalten.
opsec2022
opsec2022 07.03.2023 um 14:04:12 Uhr
Goto Top
Ist ja auch kein Wunder denn du verwendest kein richtiges Template. Das Template selbst sollte die Endung *.xlst haben nicht *.xlsx.

Hast du das von den totalRows abgeleitet? Es geht nämlich um eine Docx Word-Datei aus der ich PDFs generiere. Ich habe wie erwähnt, um die Frage auf das relevanteste zu beschränken, einige Zeilen entfernt.

Hast du das bevolgt, kann kann es aus Prinzip nicht sein das sich das Template selbst verändert, weil dann für jeden Schleifendurchlauf ein neues Dokument aus dem Template generiert wird!! Außerdem solltest du den Parameter zum Speichern im Close Befehl auf "false" definieren, template.close(false).

Das werde ich testen.

Entfernen brauchst du nicht weil das Template selbst nicht verändert wird. Also überflüssig- Das Template selbst sollte nur das Bookmark und selbst keine Bild mehr enthalten.

Danke

Gruß
6247018886
6247018886 07.03.2023 um 15:52:08 Uhr
Goto Top
Zitat von @opsec2022:
Es geht nämlich um eine Docx Word-Datei aus der ich PDFs generiere.
Ohuu, sorry muss natürlich *.dotx heißen ich i... face-smile.