2016-05-25 5 views
3

У меня действительно возникают проблемы при редактировании закладок в шаблоне Word, используя Document.Format.OpenXML, а затем сохраняя его в новом PDF-файле. Я не могу использовать Microsoft.Word.Interop, так как он дает COM-ошибку на сервере.Как отредактировать закладки в шаблоне Word с помощью DocumentFormat.OpenXml и сохранить его как новый файл PDF?

Мой код заключается в следующем:

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

Я пытался заменить закладки с моим текстом, но метод UpdateBookmark не работает. Я пишу поток и сохраняю его, потому что думал, что если закладки заменены, я могу сохранить их в другом файле.

ответ

0

Я думаю, вы хотите убедиться, что когда вы ссылаетесь на mark.Parent, вы получаете правильный экземпляр, который вы ожидаете.

Как только вы получите ссылку на правильный элемент Paragraph, куда должен идти ваш контент, используйте следующий код для добавления/замены прогона.

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

В ответах второй части вашего вопроса, когда я сделал аналогичный проект несколько лет назад мы использовали iTextSharp для создания PDF-файлов из Docx. Он работал очень хорошо, и API был легко взломан. Мы даже добавили шифрование паролей и встроенные водяные знаки в PDF-файлы.

+0

Я не могу найти код для преобразования Docx в PDF с помощью itextSharp, можете ли вы поделиться им? – user2801308

+0

уверен. дай мне пару минут –

Смежные вопросы