4

Document.Format.OpenXMLWord テンプレートでブックマークを編集し、それを新しい 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方法は機能しません。ブックマークを置き換えれば別のファイルに保存できると思ったので、ストリームを書いて保存しています。

4

1 に答える 1

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

質問の 2 番目の部分に答えるために、私が数年前に同様のプロジェクトを行ったとき、iTextSharp を使用して Docx から PDF を作成しました。それは非常にうまく機能し、API は理解しやすいものでした。さらに、パスワード暗号化と埋め込み透かしを PDF に追加しました。

于 2016-05-25T14:45:40.800 に答える