Как отредактировать закладки в шаблоне Word с помощью DocumentFormat.OpenXml и сохранить его как новый файл PDF?

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

Мой код такой:

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 метод не работает. Я пишу поток и сохраняю его, потому что я думал, что если закладки будут заменены, то я могу сохранить его в другой файл.

1 ответ

Я думаю, что вы хотите убедиться, что когда вы ссылаетесь 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-файлы.

Другие вопросы по тегам