Добавьте первый комментарий и comments.xml к слову doc - PullRequest
0 голосов
/ 03 ноября 2019

Я пишу приложение RoR для добавления комментариев в файл docx. Nokogiri отлично подходит для изменения XML для добавления / редактирования комментариев в документе, где по крайней мере один комментарий уже существует. В этих документах есть файл comments.xml, вставленный по слову в пакете docx.

Там, где я застрял, программно добавляется первый комментарий. В документе без ранее существующих комментариев нет файла comments.xml. Простое добавление файла не работает, для этого необходимо определить соответствующие отношения. Я изо всех сил пытаюсь найти, как именно добавить его и идентифицировать его в структуре отношений с пакетом docx, чтобы document.xml (там, где существует основное содержимое) знал, что искать в comments.xml для комментариев.

I 'буду публиковать почтовый индекс, но я пробовал так много разных вещей, что я почти на нуле. Я в основном ищу тех, кто имеет опыт работы с Office Open XML, кто мог сделать это раньшеЯ могу разобраться с Rails / Nokogiri, я просто застрял в понимании того, что на самом деле нужно изменить в пакете Office Open XML.

1 Ответ

1 голос
/ 03 ноября 2019

В следующем примере C # показано, как это сделать с помощью Open XML SDK:

public void CreateComment()
{
    // Let's say we have a document called Comments.docx with a single
    // paragraph saying "Hello World!".
    using WordprocessingDocument wordDocument = WordprocessingDocument.Create(
        "Comments.docx", WordprocessingDocumentType.Document);

    MainDocumentPart mainDocumentPart = wordDocument.AddMainDocumentPart();
    mainDocumentPart.Document =
        new Document(
            new Body(
                new Paragraph(
                    new Run(
                        new Text("Hello World!")))));

    // Our MainDocumentPart needs to have a related WordprocessingCommentsPart,
    // which you see as the comments.xml file. That file needs to have a
    // w:comments root element.

    // The next line of code is the key step that adds the comments.xml file
    // and the required relationships and content types. To add individual
    // w:comment elements, we need the root w:comments element.
    var commentsPart = mainDocumentPart.AddNewPart<WordprocessingCommentsPart>();
    commentsPart.Comments = new Comments();

    // The rest of the code just shows how you would use the Open XML SDK
    // to add a comment.
    // So say we want to comment on the whole paragraph. As a first step,
    // we create a comment and add it to the w:comments root element. 
    var comment = new Comment(new Paragraph(new Run(new Text("This is my comment."))))
    {
        Id = "1",
        Author = "Thomas Barnekow"
    };

    commentsPart.Comments.AppendChild(comment);

    // Then, we need to add w:commentRangeStart and w:commentRangeEnd
    // elements to the text on which we want to comment. In this example,
    // we are getting "some" w:p element and some first and last w:r
    // elements and insert the w:commentRangeStart before the first and
    // the w:commentRangeEnd after the last w:r.
    Paragraph p = mainDocumentPart.Document.Descendants<Paragraph>().First();
    Run firstRun = p.Elements<Run>().First();
    Run lastRun = p.Elements<Run>().Last();

    firstRun.InsertBeforeSelf(new CommentRangeStart { Id = "1" });
    CommentRangeEnd commentRangeEnd = lastRun.InsertAfterSelf(new CommentRangeEnd { Id = "1" });
    commentRangeEnd.InsertAfterSelf(new Run(new CommentReference { Id = "1" }));
}

Таким образом, если вы можете использовать Open XML SDK, очень легко добавить часть comments.xml. Если вы не можете использовать SDK, вам придется написать собственный код, чтобы создать тот же эффект. Для этого вам нужно понять, где вносить какие изменения.

Первый шаг - создать файл comments.xml в папке / word. Пустой файл comments.xml должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
</w:comments>

Далее необходимо установить связь между MainDocumentPart (documents.xml) и WordprocessingCommentsPart (comments.xml). Для этого вам нужно создать или изменить файл document.xml.rels, содержащийся в папке / word / _rels. Для документа, созданного в приведенном выше примере, document.xml.rels имеет следующее содержимое (т. Е. Одну связанную дочернюю часть):

<?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="/word/comments.xml" Id="Rf416c937546c47ef" />
</Relationships>

Последний файл для рассмотрения - [Content_Types] .xml вкорень пакета. Добавив часть comments.xml с Open XML SDK в приведенном выше примере, она имеет следующее содержимое:

<?xml version="1.0" encoding="utf-8"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" />
  <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
  <Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml" />
</Types>

Обратите внимание на последний дочерний элемент, который переопределяет тип содержимого / word/comments.xml part.

...