Count pages in onenote using Powershell


 

[필요 사항]

쉐어포인트 서버에 있는 원노트에 페이지 수가 몇개인지 알아야 할 경우가 있습니다

 

[해결 방법]

쉐어포인트 서버에 업로드 된 원노트의 내부 구조에 접근할 수 있는 Server side 방법은 존재하지 않습니다.

물론 서버에서 one 파일을 로컬 드라이브로 내려 받아 코드로 접근하여 어찌어찌 하는 방법이 있을 수 있겠지만… 그런 방식은 논외로 하겠습니다.

 

가장 쉽고 빠르게 구현가능한 방법은 원노트 클라이언트가 설치된 PC 에서 원노트 Application interface 를 활용하는 방법이 유일합니다.

https://msdn.microsoft.com/en-us/library/office/jj680120.aspx

위 링크에 제공하고 있는 API를 활용해 C# 어플리케이션을 개발하는 것이 가능합니다.

 

위 인터페이스를 활용하여 간단한 파워쉘 스크립트를 작성하였으니 참고 부탁 드립니다.

아래의 파워쉘 스크립트를 통해 현재 PC 에 사용중인 원노트의 페이지 수를 출력할 수 있습니다.

페이지 수를 알고자 하는 원노트 파일을 PC 에 동기화 하신 후 실행하시면 됩니다.

 

 

[Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq") | Out-Null 
$onenoteApp = New-Object -ComObject OneNote.Application
 
# init empty Variable for as buffer the [Ref] output action
[String]$notebookXml = ''
 
# Get OneNote Pages hierarchy
$onenoteApp.GetHierarchy($null, [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages, [Ref]$notebookXml)
 
# Create the System.Xml.Linq.XDocument from an XML Text
# alternatively you can use the [System.Xml.Linq.XDocument]::Load('C:\temp\myXML.xml') Methode to load from a XML File
$doc = [System.Xml.Linq.XDocument]::Parse($notebookXml)
 
# Get OneNote XML namespace
$ns = $doc.Root.Name.Namespace

$pagecount_notebook = 0
$pagecount_section = 0 

# enumerate all Notebook Nodes from XML XDocument
$doc.Descendants($ns + "Notebook") | ForEach-Object {
    
    # output name of current OneNote Notebook
    "Notebook name: $($_.Attribute("name").Value)"
                
        # enumerate all Section Nodes from Notebook Node
        $_.Descendants($ns + "Section") | ForEach-Object {
           
           # output name of current OneNote Section
           #"    Section: $($_.Attribute("name").Value)"
           
           # enumerate all Page Nodes from Section Node
           $_.Descendants($ns + "Page")  | ForEach-Object {
                
                # output name of current OneNote Page
                #"        Page: $($_.Attribute("name").Value)"
                $pagecount_notebook = $pagecount_notebook + 1 
                $pagecount_section = $pagecount_section + 1
           } 
           "    ## Section: $($_.Attribute("name").Value) ==> " + $pagecount_section + " pages"
            $pagecount_section = 0
        }
    "##Notebook name: $($_.Attribute("name").Value) ==> " + $pagecount_notebook + " pages"
    $pagecount_notebook = 0
    "---------------------------------------------------"
}

위 스크립트의 수행결과는 아래와 같이 출력됩니다

Notebook name: Provisioning – Tenant – Site

    ## Section: Deep Dives ==> 5 pages

    ## Section: Troubleshooting Guide ==> 26 pages

##Notebook name: Provisioning – Tenant – Site ==> 31 pages

—————————————————

Notebook name: Yammerkorea101

    ## Section: Yammer Support 101 ==> 12 pages

    ## Section: New Section 1 ==> 1 pages

##Notebook name: Yammerkorea101 ==> 13 pages

—————————————————

 

만약 SharePoint Online 을 사용하신다면, 아래 링크에서 제공하는 Office 365용 onenote api를 사용하여 원하시는 기능을 구현하는 것이 가능합니다.

https://msdn.microsoft.com/ko-kr/office/office365/howto/onenote-tutorial

 

[주의 사항]

본 블로그에 게시된 정보의 내용 (첨부 문서, 링크 등)은 작성일 현재 기준이며 예고없이 변경 될 수 있습니다.

또한, 참고용으로만 제공됨으로 Microsoft에 책임이 없음을 알려 드립니다. 반드시 적용 전 충분한 테스트를 진행하시기 바랍니다.


Count pages in onenote using Powershell


 

[필요 사항]

쉐어포인트 서버에 있는 원노트에 페이지 수가 몇개인지 알아야 할 경우가 있습니다

 

[해결 방법]

쉐어포인트 서버에 업로드 된 원노트의 내부 구조에 접근할 수 있는 Server side 방법은 존재하지 않습니다.

물론 서버에서 one 파일을 로컬 드라이브로 내려 받아 코드로 접근하여 어찌어찌 하는 방법이 있을 수 있겠지만… 그런 방식은 논외로 하겠습니다.

 

가장 쉽고 빠르게 구현가능한 방법은 원노트 클라이언트가 설치된 PC 에서 원노트 Application interface 를 활용하는 방법이 유일합니다.

https://msdn.microsoft.com/en-us/library/office/jj680120.aspx

위 링크에 제공하고 있는 API를 활용해 C# 어플리케이션을 개발하는 것이 가능합니다.

 

위 인터페이스를 활용하여 간단한 파워쉘 스크립트를 작성하였으니 참고 부탁 드립니다.

아래의 파워쉘 스크립트를 통해 현재 PC 에 사용중인 원노트의 페이지 수를 출력할 수 있습니다.

페이지 수를 알고자 하는 원노트 파일을 PC 에 동기화 하신 후 실행하시면 됩니다.

 

 

[Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq") | Out-Null 
$onenoteApp = New-Object -ComObject OneNote.Application
 
# init empty Variable for as buffer the [Ref] output action
[String]$notebookXml = ''
 
# Get OneNote Pages hierarchy
$onenoteApp.GetHierarchy($null, [Microsoft.Office.Interop.OneNote.HierarchyScope]::hsPages, [Ref]$notebookXml)
 
# Create the System.Xml.Linq.XDocument from an XML Text
# alternatively you can use the [System.Xml.Linq.XDocument]::Load('C:\temp\myXML.xml') Methode to load from a XML File
$doc = [System.Xml.Linq.XDocument]::Parse($notebookXml)
 
# Get OneNote XML namespace
$ns = $doc.Root.Name.Namespace

$pagecount_notebook = 0
$pagecount_section = 0 

# enumerate all Notebook Nodes from XML XDocument
$doc.Descendants($ns + "Notebook") | ForEach-Object {
    
    # output name of current OneNote Notebook
    "Notebook name: $($_.Attribute("name").Value)"
                
        # enumerate all Section Nodes from Notebook Node
        $_.Descendants($ns + "Section") | ForEach-Object {
           
           # output name of current OneNote Section
           #"    Section: $($_.Attribute("name").Value)"
           
           # enumerate all Page Nodes from Section Node
           $_.Descendants($ns + "Page")  | ForEach-Object {
                
                # output name of current OneNote Page
                #"        Page: $($_.Attribute("name").Value)"
                $pagecount_notebook = $pagecount_notebook + 1 
                $pagecount_section = $pagecount_section + 1
           } 
           "    ## Section: $($_.Attribute("name").Value) ==> " + $pagecount_section + " pages"
            $pagecount_section = 0
        }
    "##Notebook name: $($_.Attribute("name").Value) ==> " + $pagecount_notebook + " pages"
    $pagecount_notebook = 0
    "---------------------------------------------------"
}

위 스크립트의 수행결과는 아래와 같이 출력됩니다

Notebook name: Provisioning – Tenant – Site

    ## Section: Deep Dives ==> 5 pages

    ## Section: Troubleshooting Guide ==> 26 pages

##Notebook name: Provisioning – Tenant – Site ==> 31 pages

—————————————————

Notebook name: Yammerkorea101

    ## Section: Yammer Support 101 ==> 12 pages

    ## Section: New Section 1 ==> 1 pages

##Notebook name: Yammerkorea101 ==> 13 pages

—————————————————

 

만약 SharePoint Online 을 사용하신다면, 아래 링크에서 제공하는 Office 365용 onenote api를 사용하여 원하시는 기능을 구현하는 것이 가능합니다.

https://msdn.microsoft.com/ko-kr/office/office365/howto/onenote-tutorial

 

[주의 사항]

본 블로그에 게시된 정보의 내용 (첨부 문서, 링크 등)은 작성일 현재 기준이며 예고없이 변경 될 수 있습니다.

또한, 참고용으로만 제공됨으로 Microsoft에 책임이 없음을 알려 드립니다. 반드시 적용 전 충분한 테스트를 진행하시기 바랍니다.


Comments (0)

Skip to main content