Skip to content

python-pptx を使って PowerPoint のコアプロパティを表示する・改

先日、python-pptx を使って PowerPoint のコアプロパティを表示する というメモを書きました。 このメモのサンプルに加え、会社マネージャハイパーリンクの基点 という値も取得出来るようにしたものを改めてメモしておきます。

PowerPoint (.pptx) ファイルの構造

テストに利用した PowerPoint ファイルを unzip すると以下の構造になっていました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
├── [Content_Types].xml
├── _rels
├── docProps
│   ├── app.xml
│   ├── core.xml
│   └── thumbnail.jpeg
└── ppt
    ├── _rels
    │   └── presentation.xml.rels
    ├── presProps.xml
    ├── presentation.xml
    ├── slideLayouts
    │   ├── _rels
    │   │   ├── slideLayout1.xml.rels
    │   │   ├── slideLayout10.xml.rels
    │   │   ├── slideLayout11.xml.rels
    │   │   ├── slideLayout2.xml.rels
    │   │   ├── slideLayout3.xml.rels
    │   │   ├── slideLayout4.xml.rels
    │   │   ├── slideLayout5.xml.rels
    │   │   ├── slideLayout6.xml.rels
    │   │   ├── slideLayout7.xml.rels
    │   │   ├── slideLayout8.xml.rels
    │   │   └── slideLayout9.xml.rels
    │   ├── slideLayout1.xml
    │   ├── slideLayout10.xml
    │   ├── slideLayout11.xml
    │   ├── slideLayout2.xml
    │   ├── slideLayout3.xml
    │   ├── slideLayout4.xml
    │   ├── slideLayout5.xml
    │   ├── slideLayout6.xml
    │   ├── slideLayout7.xml
    │   ├── slideLayout8.xml
    │   └── slideLayout9.xml
    ├── slideMasters
    │   ├── _rels
    │   │   └── slideMaster1.xml.rels
    │   └── slideMaster1.xml
    ├── slides
    │   ├── _rels
    │   │   └── slide1.xml.rels
    │   └── slide1.xml
    ├── tableStyles.xml
    ├── theme
    │   └── theme1.xml
    └── viewProps.xml
ファイル 対象
docProps/app.xml 会社マネージャハイパーリンクの基点
docProps/core.xml コアプロパティ情報 (タイトル件名作成者 等)

app.xml の構造

以下は app.xml のサンプルです。 ManagerCompanyHyperlinkBase という値が格納されていることが分かります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
  <TotalTime>1</TotalTime>
  <Words>1</Words>
  <Application>Microsoft Macintosh PowerPoint</Application>
  <PresentationFormat>ワイド画面</PresentationFormat>
  <Paragraphs>1</Paragraphs>
  <Slides>1</Slides>
  <Notes>0</Notes>
  <HiddenSlides>0</HiddenSlides>
  <MMClips>0</MMClips>
  <ScaleCrop>false</ScaleCrop>
  <HeadingPairs>
    <vt:vector size="6" baseType="variant">
      <vt:variant>
        <vt:lpstr>使用されているフォント</vt:lpstr>
      </vt:variant>
      <vt:variant>
        <vt:i4>3</vt:i4>
      </vt:variant>
      <vt:variant>
        <vt:lpstr>テーマ</vt:lpstr>
      </vt:variant>
      <vt:variant>
        <vt:i4>1</vt:i4>
      </vt:variant>
      <vt:variant>
        <vt:lpstr>スライド タイトル</vt:lpstr>
      </vt:variant>
      <vt:variant>
        <vt:i4>1</vt:i4>
      </vt:variant>
    </vt:vector>
  </HeadingPairs>
  <TitlesOfParts>
    <vt:vector size="5" baseType="lpstr">
      <vt:lpstr>游ゴシック</vt:lpstr>
      <vt:lpstr>游ゴシック Light</vt:lpstr>
      <vt:lpstr>Arial</vt:lpstr>
      <vt:lpstr>Office テーマ</vt:lpstr>
      <vt:lpstr>test1</vt:lpstr>
    </vt:vector>
  </TitlesOfParts>
  <Manager>test1</Manager>
  <Company>test2</Company>
  <LinksUpToDate>false</LinksUpToDate>
  <SharedDoc>false</SharedDoc>
  <HyperlinkBase>test3</HyperlinkBase>
  <HyperlinksChanged>false</HyperlinksChanged>
  <AppVersion>16.0000</AppVersion>
</Properties>

サンプルプログラム

現状の python-pptx には app.xml の情報を直接、読み取る手段は用意されていないようです。 その為、プレゼンテーションファイルの内容を prs.part.package.iter_parts() で取得し、その中から app.xml ファイルを探して、それを beautifulsoup4 で XML として解析して必要な値を取り出します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python3

import sys

import pptx
import bs4

prs = pptx.Presentation(sys.argv[1])

print("Title            : %s" % prs.core_properties.title)
print("Last Modified By : %s" % prs.core_properties.last_modified_by)
print("Revision         : %i" % prs.core_properties.revision)
print(
    "Modified         : %s" % prs.core_properties.modified.strftime("%Y/%m/%d %H:%M:%S")
)
print("Subject          : %s" % prs.core_properties.subject)
print("Author           : %s" % prs.core_properties.author)
print("Keywords         : %s" % prs.core_properties.keywords)
print("Comments         : %s" % prs.core_properties.comments)
print(
    "Created          : %s" % prs.core_properties.created.strftime("%Y/%m/%d %H:%M:%S")
)
print("Category         : %s" % prs.core_properties.category)

package_parts = prs.part.package.iter_parts()
for part in package_parts:
    if part.partname.endswith("app.xml"):
        app_xml = part.blob.decode("utf-8")
        soup = bs4.BeautifulSoup(app_xml, "xml")
        print("Compnay          : %s" % soup.find("Company").get_text())
        print("HyperlinkBase    : %s" % soup.find("HyperlinkBase").get_text())
        print("Manager          : %s" % soup.find("Manager").get_text())

実行例

実行例は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# ./sample.py test1.pptx
Title            : test1
Last Modified By : test2
Revision         : 1
Modified         : 2021/12/29 23:16:14
Subject          : test3
Author           : test4
Keywords         : test5
Comments         : test6
Created          : 2021/12/29 23:15:02
Category         : test7
Compnay          : test8
HyperlinkBase    : test9
Manager          : test10