2017年10月29日日曜日

【OpenXML】すべてのスライドのテキストを取得する(foreach版)

目的

 OpenXMLを学んでいる。Microsoftの公式ではスライド数を調べて、その数でループしていたが、それでは納得いかなかったため、スライド数を調べないでできないか試した結果を記す。

参考サイト

 [方法] プレゼンテーション内のすべてのスライドのテキストを取得する (Open XML SDK)

 [方法] プレゼンテーションのすべてのスライドから特定の作成者のコメントをすべて削除する (Open XML SDK)

ソース

using DocumentFormat.OpenXml.Packaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using D = DocumentFormat.OpenXml.Drawing;

namespace すべてのスライドのテキストを取得する_foreach版_
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "TEST";
            string filePath = @"C:\Users\t\Documents\07_OpenXML\" + fileName + ".pptx";

            ShowTextAllSlide(filePath);
        }

        public static void ShowTextAllSlide( string fileName)
        {
            // エラーチェック
            if(String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentNullException("File Name Not Exist.");
            }

            using(PresentationDocument doc = PresentationDocument.Open(fileName, false))
            {
                // スライド数を取得し、表示する。スライドが0枚だと、何も表示しないため。
                int numberOfSlides = doc.PresentationPart.SlideParts.Count();
                System.Console.WriteLine("Number of slides = {0}", numberOfSlides);

                // スライド内をループする
                // 問題:スライドを1から順番に表示しない。
                foreach( SlidePart slide in doc.PresentationPart.SlideParts)
                {
                    StringBuilder paragraphText = new StringBuilder();

                    IEnumerable texts = slide.Slide.Descendants();
                    foreach(D.Text text in texts)
                    {
                        paragraphText.Append(text.Text);
                    }
                    System.Console.WriteLine("contains: {0}", paragraphText); 
                }
            }
            System.Console.ReadKey();
        }
    }
}

問題

スライドの1枚目から表示できなかった。

2017年10月22日日曜日

ラズパイ上に構築したDjangoアプリに外部からアクセスする方法

目的

 ラズパイ上でDjangoの勉強をするために環境を構築し、初歩から勉強を始めようとしたところ、外部PCからアクセスする方法を調べる必要があり、わかったため、その方法を以下に記す。

環境

  • RaspberryPi2:stretch
  • Python:3.5.3
  • Django:1.11.5

必要な設定

  1. python manage.py runserver 0.0.0.0:8000 で起動する。
  2. プロジェクト名/settings.py 内のALLOWED_HOSTSにアクセスURLを記述する。

具体例

 PCからラズパイ上のDjangoアプリアクセスURL:raspberrypi.local:8000/polls

 settings.py内に以下のような記述をする。

ALLOWED_HOSTS = ['raspberrypi.local']

2017年9月18日月曜日

【Python】【OpenCV】OpenCVがImport できない場合の対処。

目的

 Python×OpenCVを使って画像処理をしようとしたときに、「import cv2」でエラーとなった。そのときの対処を備忘録として残す。

環境

  • Windows10 64bit
  • Python 3.6
  • Numpy 1.13
  • OpenCV 3.3

対処:Visual C++ 再頒布可能パッケージをインストール

参考:https://stackoverflow.com/questions/33200025/cant-import-cv2-dll-load-failed 上記サイトに記載があるが、つまり、Visual C++ 2015 redistribution をインストールすると、エラーがでなくなる。
Visual C++ 2015 redistribution

2017年8月15日火曜日

【Python】2次元配列を独自ソートで並び替え

目的

list型の2次元配列をソートしたかったが、検索しても要素を指定してソートしている記事・ブログしか見当たらなかった。そこで、独自の指定でソートする方法を記す。

環境

  • Windows10
  • Python 3.6.1

ソース

2次元配列の各要素は、[x1,y1,x2,y2]の配列としている。線分のStart座標とEnd座標を表すものとする。これを各要素の長さ順にソートする。

lists = [[1,2,1,1],[1,1,1,1],[1,2,3,4],[1,1,1,1]]
print(lists) # ソート前
print( sorted(lists, key=lambda x: pow(abs(x[0]-x[2]),2) + pow(abs(x[1]-x[3]),2) ) ) # ソート後

2017年8月3日木曜日

【Python】【Pillow】Windowsでの画像読み込みはPillowがよい。

目的

  あるプログラムを作っていて、画像を読み込む必要があった。その際OpenCVもしくはPillowの選択肢があったが、ドラッグ&ドロップでファイルを読み込ませる場合、日本語や機種依存文字(①.pngとか)のファイル名ではOpenCVのときは読み込めなく、Pillowでは可能だったため、それをここに記す。

環境

  • Windows10
  • Python 3.6.1
  • Pillow  バージョンがわからない。。。
  • OpenCV バージョンがわからない。。。

実行ソース

OpenCvでの読み込みに失敗しており、画像を何かしようとすると落ちる。 cv2.imshow()の部分だ。

import sys
import cv2
from PIL import Image

# 引数を取り込む
fileName = sys.argv[1:] # プログラム名は取り込まない

# 画像読み込み
img = Image.open( fileName[0], 'r' ) # OK
imgCv = cv2.imread( fileName[0], cv2.IMREAD_GRAYSCALE) # NG
img.show()
cv2.imshow("OpenCV", imgCv)  # ここで落ちる

下記は上記ソースを実行するときに必要な、ドラッグ&ドロップでファイルを読み込ませるために必要なバッチファイル。

cd /d %~dp0
python Read_shift_jis.py %*
set /P STR_INPUT="Enterキーを押してください:"

実行結果

2017年7月16日日曜日

【python-pptx】PythonでPowerPointに線を引く。

目的

PythonでPowerPointを操る際に、線を引きたかったが、直接的にそれを行っているブログ等が見つけられなかったので、見つけられるように記事に残す。

環境

  • Windows 10
  • Python 3.6.1
  • python-pptx 0.6.6 

環境の構築方法は、他サイトを参考に。

ソースコード

### ファイル名 adding_an_line.py
from pptx import Presentation
from pptx.enum.shapes import MSO_CONNECTOR
from pptx.util import Inches
# PowerPoint
prs = Presentation()
# レイアウトの種類
BLANK = 6
# レイアウト
slide_layout = prs.slide_layouts[BLANK]
# スライド
slide = prs.slides.add_slide(slide_layout)
# 図形
shapes = slide.shapes

# 座標をインチに変換する
begin_x = 0
begin_y = 0
end_x   = Inches(1.0)
end_y   = Inches(1.0)

###
# 引数
#  引数1:MSO_CONNECTOR.STRAIGHT
#  引数2: begin x 座標
#  引数3: begin y 座標
#  引数4: end   x 座標
#  引数5  end   y 座標
###
shape = shapes.add_connector(
    MSO_CONNECTOR.STRAIGHT, begin_x, begin_y, end_x, end_y
  )
# PowerPointをカレントに保存
prs.save('adding_a_line.pptx')

実行方法

python adding_an_line.py

実行結果

ローカルに出力された「adding_a_line.pptx」に以下のように線が引かれる。