2017-02-28 3 views
1

OpenXml을 사용하여 문서를 생성하는 C# 프로그램이 있습니다. 다음 방법을 사용하여 책갈피를 값으로 대체합니다.Word 책갈피 편집 글꼴 변경

private void FillBookmark(BookmarkStart bookmark, string value) 
{ 
    var text = new Text(value); 
    bookmark.RemoveAllChildren(); 

    IEnumerable<OpenXmlElement> elementsAfter = bookmark.ElementsAfter(); 
    IEnumerable<OpenXmlElement> insideBookmark = elementsAfter.TakeWhile(element => !(element is BookmarkEnd)); 
    foreach (OpenXmlElement element in insideBookmark) 
    { 
     element.RemoveAllChildren(); 
    } 
    OpenXmlElement previousSibling = bookmark.PreviousSibling(); 
    while (previousSibling is BookmarkStart || previousSibling is BookmarkEnd) 
    { 
     previousSibling = previousSibling.PreviousSibling(); 
    } 
    var container = new Run(text); 
    previousSibling.AppendChild(container); 
} 

이 특정 단어 문서에서 사용되는 글꼴은 Raleway입니다. 몇 가지 책갈피가 있고이 방법을 실행 한 후 두 개의 책갈피가 Calibri 글꼴을 사용하고 있습니다. 나는이 논문의 책갈피를 재작 성하여 Raleway에 있는지 확인하려고 노력했지만 계속해서 Calibri로 바뀌었다.

어떻게 가능합니까?

답변

2

먼저 코드는 이전 RunProperties없이 새 요소를 만듭니다. 대신의

<w:r> 
    <w:t>valuexX</w:t> 
</w:r> 

:

<w:r w:rsidRPr="00DE66A4"> 
    <w:rPr> 
     <w:rFonts w:ascii="Algerian" w:hAnsi="Algerian" /> 
      <w:lang w:val="en-US" /> 
    </w:rPr> 
    <w:t>6</w:t>    
</w:r> 

당신이 원하는 속성을 복사 할 수 있습니다

private void FillBookmark(BookmarkStart bookmark, string value) 
{ 
    var text = new Text(value); 
    bookmark.RemoveAllChildren(); 

    IEnumerable<OpenXmlElement> elementsAfter = bookmark.ElementsAfter(); 
    IEnumerable<OpenXmlElement> insideBookmark = elementsAfter.TakeWhile(element => !(element is BookmarkEnd)); 
    foreach (OpenXmlElement element in insideBookmark) 
    { 
    element.RemoveAllChildren(); 
    } 
    OpenXmlElement previousSibling = bookmark.PreviousSibling(); 
    while (previousSibling is BookmarkStart || previousSibling is BookmarkEnd) 
    { 
    previousSibling = previousSibling.PreviousSibling(); 
    } 

    //Get previous font. 
    var runProperties = previousSibling.GetFirstChild<ParagraphMarkRunProperties>().GetFirstChild<RunFonts>(); 
    //var runProperties = previousSibling.GetFirstChild<RunProperties>(); - if its simple element. 

    // Clone. 
    var newProperty = (RunFonts)runProperties.Clone(); 

    // Create container with properties. 
    var container = new Run(text) 
    { 
    RunProperties = new RunProperties() { RunFonts = newProperty } 
    }; 

    previousSibling.AppendChild(container); 
} 
1

즐겨 찾기가 조금 이상해 그래서, 당신은 다음 조각 같은 것을 얻는다. 그것은 책갈피과 같이, FX Run를 포함 할 수있는 일이라고 생각하는 자연적인 것 (NB : 이것은 점을 설명하기 위해 단지, 유효 OpenXML을하지 않습니다) :

<w:bookmark> 
    <w:run> 
     <w:text>Some text</w:text> 
    </w:run> 
</w:bookmark> 

을하지만 그들이 작동하지 방법 . 대신 BookmarkStartBookmarkEnd을 사용하여 정의되며 해당 시작 및 끝 요소와 일치시키기 위해 id 속성을 사용합니다.

BookmarkStartBookmarkEnd은 모든 종류의 항목을 확장 할 수 있습니다. 즉, 동일한 단락에있을 필요조차 없습니다 (this example on MSDN으로 예시).

인접한 것으로 보이는 두 개의 북마크가있는 단어 문서는 이상한 방식으로 중첩 될 수 있습니다. 다음은 방금 함께 던진 Word 문서의 예입니다. 두 개의 책갈피가있는 단락이 있습니다 (b1b2). b2에 대한 bookmarkStart은 북마크 b1의 '내부'입니다.

<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:r> 
     <w:t>Some text with a</w:t> 
    </w:r> 
    <w:bookmarkStart w:name="b1" w:id="1" /> 
    <w:r> 
     <w:t>couple</w:t> 
    </w:r> 
    <w:bookmarkStart w:name="b2" w:id="2" /> 
    <w:bookmarkEnd w:id="1" /> 
    <w:r> 
     <w:t xml:space="preserve"> of bookmarks.</w:t> 
    </w:r> 
    <w:bookmarkEnd w:id="2" /> 
</w:p> 

그것은 당신의 예에서 일어나는 정확히 추측하기 어렵지만, 내 생각 엔 당신이 기대처럼 bookmarkStartbookmarkEnd (가) 구성되지 않는다는 것입니다.

이와 같은 디버깅을 할 때 OpenXML Productivity Tool을 사용하면 유용합니다.

(또한 BookmarkStart에는 자식이 없으므로 bookmark.RemoveAllChildren에 대한 호출이 필요하지 않습니다.)