2016-05-25 18 views
3

Ich habe wirklich Probleme beim Bearbeiten von Lesezeichen in einer Word-Vorlage mit Document.Format.OpenXML und speichern Sie es dann in einer neuen PDF-Datei. Ich kann Microsoft.Word.Interop nicht verwenden, da es einen COM-Fehler auf dem Server gibt.Wie können Sie Lesezeichen in einer Word-Vorlage mit DocumentFormat.OpenXml bearbeiten und als neue PDF-Datei speichern?

Mein Code ist dies:

public static void CreateWordDoc(string templatePath, string destinationPath, Dictionary<string, dynamic> dictionary) 
{ 

    byte[] byteArray = File.ReadAllBytes(templatePath); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     stream.Write(byteArray, 0, (int)byteArray.Length); 
     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true)) 
     { 
      var bookmarks = (from bm in wordDoc.MainDocumentPart.Document.Body.Descendants<BookmarkStart>() 
          select bm).ToList(); 

      foreach (BookmarkStart mark in bookmarks) 
      { 

       if (mark.Name != "Table" && mark.Name != "_GoBack") 
       { 

       UpdateBookmark(dictionary, mark);//Not doing anything 

       } 
       else if (mark.Name != "Table") 
       { 
        // CreateTable(dictionary, wordDoc, mark); 
       } 
      } 
      File.WriteAllBytes("D:\\RohitDocs\\newfile_rohitsingh.docx", stream.ToArray()); 

      wordDoc.Close(); 

     } 
     // Save the file with the new name 

    } 
} 

private static void UpdateBookmark(Dictionary<string, dynamic> dictionary, BookmarkStart mark) 
{ 
    string name = mark.Name; 
    string value = dictionary[name]; 

    Run run = new Run(new Text(value)); 
    RunProperties props = new RunProperties(); 

    props.AppendChild(new FontSize() { Val = "20" }); 
    run.RunProperties = props; 
    var paragraph = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(run); 
    mark.Parent.InsertAfterSelf(paragraph); 

    paragraph.PreviousSibling().Remove(); 
    mark.Remove(); 
} 

ich Lesezeichen mit meinem Text zu ersetzen versuchte aber die UpdateBookmark Methode funktioniert nicht. Ich schreibe Stream und speichere es, weil ich dachte, wenn Lesezeichen ersetzt werden, dann kann ich es in einer anderen Datei speichern.

Antwort

0

Ich denke, Sie möchten sicherstellen, dass, wenn Sie mark.Parent verweisen, dass Sie die richtige Instanz erhalten, die Sie erwarten.

Sobald Sie einen Verweis auf das korrekte Element Paragraph erhalten haben, in dem sich Ihr Inhalt befinden sollte, verwenden Sie den folgenden Code, um den Lauf hinzuzufügen/auszutauschen.

// assuming you have a reference to a paragraph called "p" 
p.AppendChild<Run>(new Run(new Text(content)) { RunProperties = props }); 

// and here is some code to remove a run 
p.RemoveChild<Run>(run); 

Um Antworten der zweite Teil Ihrer Frage, wenn ich ein ähnliches Projekt vor ein paar Jahren haben wir iTextSharp PDFs von Docx zu erstellen. Es funktionierte sehr gut und die API war einfach zu grok. Wir haben sogar die Passwortverschlüsselung und eingebettete Wasserzeichen zu den PDFs hinzugefügt.

+0

Ich bin nicht in der Lage, einen Code zum Konvertieren von Docx zu PDF mit itextSharp zu finden, können Sie teilen? – user2801308

+0

sicher. gib mir ein paar Minuten –