2013-09-03 5 views
4

python-docx (https://github.com/mikemaccana/python-docx)를 사용하여 .docx 파일 (WordML)을 자동화하려고합니다. 나의 현재 스크립트는 수동으로 다음 루프 목차를 만듭니다Python : python-docx/lxml을 사용하여 "Table of Contents"만들기

for chapter in myChapters: 
    body.append(paragraph(chapter.text, style='ListNumber')) 

사람이 자동으로 인덱스를 추가 TOC 기능은 "내장 된 단어"를 사용하는 방법을 알고 있나요 또한에 단락 링크를 작성 개별 장?

고맙습니다.

답변

10

핵심 과제는 렌더링 된 ToC가 각 제목에 대해 어떤 페이지 번호를 넣을 것인지를 결정하기 위해 페이지 매김에 의존한다는 것입니다. 페이지 매김은 Word 클라이언트에 내장 된 매우 복잡한 소프트웨어 인 레이아웃 엔진에서 제공하는 기능입니다.

  1. 지정 요소 : 파이썬에서 페이지 레이아웃 엔진을 작성하는 것은 확실히, 아마 내가 곧 착수 : 목차는 두 부분으로 구성되어

    을 계획하고있어 프로젝트 좋은 생각이 아니다 아니다 ToC 게재 위치 및 어떤 제목 수준을 포함할지 등이 포함됩니다.

  2. 실제로 보이는 ToC 콘텐츠, 제목 및 페이지 번호와이를 연결하는 점선이 있습니다.

요소를 만드는 것은 매우 간단하고 상대적으로 노력이 적습니다. 적어도 페이지 번호를 포함 시키려면 실제 보이는 내용을 작성하려면 Word 레이아웃 엔진이 필요합니다.

는 옵션입니다

  1. 그냥 목차를 업데이트해야 말씀을 알리기 위해 태그와 몇 가지 다른 비트를 추가 할 수 있습니다. 문서를 처음 열면 링크를 새로 고쳐야한다는 대화 상자가 나타납니다. 사용자가 예를 클릭하고 Bob이 귀하의 삼촌을 클릭합니다. 사용자가 아니요를 클릭하면 그 아래에 내용이없는 ToC 제목이 나타나고 ToC를 수동으로 업데이트 할 수 있습니다.

  2. 태그를 추가 한 다음 Word 자동화 라이브러리에 대해 C# 또는 Visual Basic을 사용하여 Word 클라이언트에 연결하여 파일을 열고 저장합니다. 모든 필드 (ToC 필드 포함)가 업데이트됩니다.

  3. SharePoint 인스턴스가 있거나 Word Automation Services에서 수행 할 수있는 작업이 있으면 서버 측과 동일한 작업을 수행하십시오.

  4. 문서를 열 때 필드 업데이트를 자동으로 실행하는 문서에서 AutoOpen 매크로를 만듭니다. 아마도 많은 바이러스 검사 프로그램을 통과하지 않을 것이며 기업 환경에서 흔히 볼 수있는 잠긴 Windows 빌드에서는 작동하지 않을 것입니다.

여기에 이전 게시물에 주석을 추가 a very nice set of screencasts by Eric White that explain all the hairy details

+1

안녕 scanny https://github.com/scanny을, 덕분에 다시 매우 상세한 답변을! 건배 –

1

미안하지만 나는 그것이 도움이 될 수있다 생각합니다. 이 내 해결책이 아니다, 그러나 그것은이 발견되었습니다 https://github.com/python-openxml/python-docx/issues/36 https://github.com/mustash에 감사

from docx.oxml.ns import qn 
    from docx.oxml import OxmlElement 

    paragraph = self.document.add_paragraph() 
    run = paragraph.add_run() 
    fldChar = OxmlElement('w:fldChar') # creates a new element 
    fldChar.set(qn('w:fldCharType'), 'begin') # sets attribute on element 
    instrText = OxmlElement('w:instrText') 
    instrText.set(qn('xml:space'), 'preserve') # sets attribute on element 
    instrText.text = 'TOC \o "1-3" \h \z \u' # change 1-3 depending on heading levels you need 

    fldChar2 = OxmlElement('w:fldChar') 
    fldChar2.set(qn('w:fldCharType'), 'separate') 
    fldChar3 = OxmlElement('w:t') 
    fldChar3.text = "Right-click to update field." 
    fldChar2.append(fldChar3) 

    fldChar4 = OxmlElement('w:fldChar') 
    fldChar4.set(qn('w:fldCharType'), 'end') 

    r_element = run._r 
    r_element.append(fldChar) 
    r_element.append(instrText) 
    r_element.append(fldChar2) 
    r_element.append(fldChar4) 
    p_element = paragraph._p