LibreOfficeでPythonを使う

2018年4月19日に更新

2018/4/19

PythonのパッケージにGoogle翻訳のパッケージがありました。

https://pypi.org/project/googletrans/

googletrans 2.2.0

 

Linux版の

第1段のCalcでGoogle翻訳のユーザー関数は一部完成しました。

第2段のWriter用のGoogle翻訳マクロの方は完成しました。

Windows10でGoogle翻訳をLibreOfficeで実行することもできました。

 

日本語・英語・台湾語・韓国語で相互の翻訳をやりましたが、Google側のバグで日本語→韓国語の翻訳が英語になってしまいます。

 

 日本語→韓国語の翻訳がしたい場合は、日本語→英語→韓国語と2回翻訳しなければいけません。

 

2018/2/1

LibreOffice6.0.0が公開されているのでインストールしました。

不足のライブラリをコピーするだけでGoogle翻訳が動作しました。

 

  2018/2/18

  LibreOfficeにバンドルされているPythonは、一般のPythonと違い不足しているパッケージをインストール出来ません。(setuptoolsを入れてパッケージをインストールしている人もいるようです。全てがインストールできるわけでもなさそうですが。Pipはインストールできたが動かないそうです。

そのため、今まではPythonに不足しているパッケージをインストールして、それをLibreOfficeのPythonにコピーしていました。

 

最近Pythonのパッケージのパスを指定することでLibreOfficeのPythonでも利用できる方法がわかりましたので、パッケージをコピーする方法の記事を削除しました。(ただし、この方法でもすべてのパッケージが利用できるわけではありません。)

LibreOffice等をインストールする

Ubuntu Studioに標準でインストールされているLibreOfficeには、LibreOffice Basicしか入っていませんので、インストールし直すことにしました。

・LibreOffice_5.4.3_Linux_x86-64_deb.tar.gz

・LibreOffice_5.4.3_Linux_x86-64_deb_langpack_ja.tar.gz

・LibreOffice_5.4.3_Linux_x86-64_deb_helppack_ja.tar.gz

・LibreOffice_5.4.3_Linux_x86-64_deb_sdk.tar.gz

最新版をダウンロードしインストール。ReadMeを読むとインストールは、「sudo dpkg -i *.deb」を各ファイルのフォルダで実行するだけで、すごく簡単にインストールできました。

 

マクロでPythonをクリックすると、JAVA JREをインストールしなければ動かないとのこと。

 

https://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d

$ sudo add-apt-repository ppa:webupd8team/java

$ sudo apt update

$ sudo apt install oracle-java8-installer

 

$ sudo dpkg --list | grep oracle-java

インストールしたJAVAのバージョンを確認。

ii  oracle-java8-installer           8u151-1~webupd8~0          all          Oracle Java(TM) Development Kit (JDK) 8
ii  oracle-java8-set-default         8u151-1~webupd8~0          all          Set Oracle JDK 8 as default Java

 

環境変数を設定するパッケージのインストール

$ sudo apt-get install oracle-java8-set-default

 

インストールが完了したらターミナルを再起動して、環境変数を確認してみます。とあるがここで問題が発生。

$ env | grep -i java

これで、環境変数が追加されて内容が表示されるはずだが出てこない。

インストールをもう一度やっても駄目。調べてもわからないので、このまま先に進むことにする。

 

これでPythonマクロが使えるようになったが、・・・・・Pythonは新規作成ができない???あれ、作成のボタンが白くならない???ボタンを押せない!!

 

OpenOfficeのサイトで英語を翻訳しながら探していたら、Pythonだけエディタが無いらしい。えっ〜〜

 

Ubuntuではないが、別のLinuxで使っている人がいて、/home/ユーザー名/.config/libreoffice/4/user/Scripts/python/のフォルダにプログラムを入れるらしい。 

とりあえずここにネットで探したA1セルに値を入力するだけの簡単なプログラムを入れると、お〜〜Pythonマクロのダイアログボックスにファイル名がでてきた。

https://qiita.com/zanjibar/items/fa4d4c690cd07828d4f9

 def a1():
   doc = XSCRIPTCONTEXT.getDocument()   #関数の宣言以外は字下げが必要です。
   sheet = doc.getSheets().getByName('Sheet1')
   A1 = sheet.getCellRangeByName('A1')
   A1.Value = 100

 

Pythonの開発環境はPyCharmがよいそうなのでインストールする。

 

File ー> Settings ー> Project InterpreterでLibreOfficeのPythonを追加して設定する。

Google翻訳を動作させるのにPythonのパッケージが不足しているので追加する。

さあ、これから本番のGoogle翻訳のPythonプログラムをLibreOfficeに移植できるか?

 

1.まず、そのままのコードでPyCharmのプロジェクトを作成する。

  ModuleNotFoundError: No module named 'requests'

    UbuntuのPythonでは動いているので、requestsが何処かにあるはず。

 

2.import requests

   ・・・

 res = requests.get(・・・)

 

Ubuntuの場合

https://qiita.com/ty21ky/items/3b944a7abe23e3bcaf8f

「LibreOfficeバンドルのPythonにUbuntu - Pythonのパッケージのパスを追加する」

上記の記事の内容を行うことにより、Google翻訳マクロが動作することを確認しました。

 

Windowsの場合

まだ、確認はしていませんが、上記の方法を参考にして、多分できると思います。

 

パッケージを追加の場合(できるかどうか不明です)

windows の libreoffice python にパッケージを追加してみる
setuptools を入れる。

https://qiita.com/zanjibar/items/d9376cf6d489bb47ae61

と言う記事を見つけました。この記事が2015年11月と古いこともあり、そのまま適用できるかはわかりません。

(libreoffice の python は、32bitなんで、64bit はだめみたい)ということでどちらなのか調べようとしていますが、ネットの情報と環境が違う、情報が古い等で?調べることができませんでした。

 

Pythonには32bit版と64bit版があり、インストールするときには注意することが必要らしい。

 

2017/12/23

とうとう見つけた、Pythonが何bit版か調べる方法を。

https://kiwamiden.com/examine-the-execution-environment-of-python

上記のサイトにbit数を調べる方法が書いてあるが、やってみるとエラーになる。

Pythonのオンラインドキュメントを見ていたらわかりました。上記のサイトに書いてあることをそのままやってはいけない。

まず、Pythonを起動します。

>>> from struct import *
>>> calcsize(str('P')) * 8
64

 

私のPC(Ubuntu)入っている3種類のPythonはすべて64bitでした。

オンラインドキュメントの例題を実行していると、オンラインドキュメントでは8バイトの結果が出ますが、やってみると倍の16バイトの結果がでます。

 

Windows用のLibreOfficeは32bit版か64bit版かは、バージョンによって違うようです。確認してください。

 

Pythonには、Python2系とPython3系があって大幅に変更されているのであまり互換性がないそうです。

そこでPythonのバージョン調査です。

Ubuntuは3.6.3と2.7.14がありました。

Google翻訳のプログラムは一応両方のPythonで動作することを確認しました。

 

LibreOffice ClacでGoogle翻訳マクロを使う

 

本当は、ワープロのWriterのマクロでやりたかったが、Pythonが全然わかっていないのでCalcの方が簡単そうで、ネットの情報を組み合わせただけです。

何の機能もない、特定のセルに入力した英文を特定のセルに翻訳文を表示する、超簡単なマクロです。

 

Calc側Pythonマクロ

Honyaku.py()

 

# coding: utf-8

import sys
import requests

#英語を日本語に翻訳
def TestHonyakuE2J():
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.CurrentController.getActiveSheet()
A3 = sheet.getCellRangeByName('A3')
sentence = A3.String
url = "https://translate.google.com/translate_a/single"

headers = {
"Host": "translate.google.com",
"Accept": "*/*",
"Cookie": "",
"User-Agent": "GoogleTranslate/5.9.59004 (iPhone; iOS 10.2; ja; iPhone9,1)",
"Accept-Language": "ja-jp",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
}


params = {
"client": "it",
"dt": ["t", "rmt", "bd", "rms", "qca", "ss", "md", "ld", "ex"],
"otf": "2",
"dj": "1",
"q": sentence,
"hl": "ja",
"ie": "UTF-8",
"oe": "UTF-8",
"sl": "en",
"tl": "ja",
}


res = requests.get(
url=url,
headers=headers,
params=params,
)

res = res.json()
A4 = sheet.getCellRangeByName('A4')
A4.String = res["sentences"][0]["trans"]

現状は、ツール ー> マクロ ー> マクロを実行

と非常に面倒な操作をしているので、「=HonyakuE2J(a3)」等で実行できるように改良する予定。

 

PythonマクロをCalcから直接実行する方法が見つから無いのですが、Basicマクロは「Function」関数を作成すると、Calcの関数として使用できます。

 

BasicマクロからPythonマクロを実行するという記事を見つけて、できることを確認しました。これで、Calcから直接 翻訳することができそうです。

 

まだ、英語と韓国語しか試してはいませんが、Google翻訳で翻訳できる言語はすべて翻訳できると思います。

しかし、英語以外はまだ翻訳の精度が悪いです。中国語を翻訳したら、感じとして英語の半分以下のできでした。

 

因みに、Python版Google翻訳はWEB版のようにいくつもの文章を一度に翻訳できません。2つの文章を翻訳したら前側の文章のみ翻訳されました。内容はWEB版と同じでした。

 

次に、Calcから直接Pythonマクロを実行できるかどうかやっていきます。

 

参考にするサイト

日本語

https://blue21neo.blogspot.jp/2016/12/libreofficecalcbasicpython.html

英語

https://ask.libreoffice.org/en/question/52125/execute-a-python-macro-function-from-base-and-return-value-to-base/

 

上記の英語のサイトの回答欄だけをGoogle翻訳で翻訳したものです。

https://pocketcomputer.jimdo.com/libreoffice%E3%81%A7python-2/

 

日本語のサイトを参考にBasicマクロからPythonマクロを実行することは確認できました。

下記のコードで一応動きました。

Sub Main
    'Pythonマクロ(Sample.pyのBasic2Python)を実行        成功
    Dim a(0),b(0),c(0) As Variant
    scpr = ThisComponent.getScriptProvider
    scmod = scpr.getScript("vnd.sun.star.script:Sample.py$Basic2Python?language=Python&location=user")
    ret = scmod.invoke(a,b,c)
End Sub

 

Python側の関数の引数に「*args」と入れます
def Basic2Python(*args):

 

後は、Calcのユーザー関数として「=HonyakuE2J(A1)」のようにして使えるか、試します。

 

ちょっと、姑息な手段ですがCalcから関数として直接翻訳することに成功しました。ヒント「=HonyakuE2J(1)」引数に注意!

まっとうな手段で実行したいが。まぁ、できたことはできた。

 

LibreOffice Basicから引数=10をPythonマクロに渡して、Python側でx5して、戻り値をCalcのセルに入れることに成功しました。

これで、Calcから直接翻訳できそうです。

上記の参考にするサイトの英語版のサイトの回答欄の2.を参考にしました。

 

沢山の英文をCalcで翻訳する必要があったので、本格的に使おうと思ったらプログラムに問題があったので変更しました。

翻訳文のセルを"A2"と固定していたので実用的に使うことが出来ませんでした。

 

解決策としてアクティブセルの左隣に翻訳文を表示するようにしました。

これでも少し問題があります。関数のセルをコピーで連続してペーストすると、アクティブセルの左隣りのセルに翻訳文が次々と表示しては消えていきます。

コピペする時は、1つ1つペーストする必要があります。標準の関数のように連続してペーストする方法がわかりません。

 

"sl"の値が翻訳する言語です。"kr"を指定すると韓国語が翻訳されます。他の外国語は試していないのでわかりません。Google翻訳は英語以外は翻訳の精度が悪いです。英語はだいぶ良くなってきました。

"tl"の値が翻訳後の言語です。現状は"ja"日本語です。

 

Basic側コード

 

Function HonyakuE2J(Eng As String) as String
      
    On Error Goto HandleError1001

 

    Dim oActiveCell As Object
    oActiveCell = ThisComponent.CurrentSelection
    j = oActiveCell.CellAddress.Column        'アクティブセルを取得
    i = oActiveCell.CellAddress.Row


    Dim a(0) As String
    Dim b(0),c(0) As Variant

    oSheet = ThisComponent.CurrentController.getActiveSheet()
    oCell =     oSheet.getCellByPosition( j-1 , i )        'アクティブセルの左隣り
    a(0) = Eng
    scpr = ThisComponent.getScriptProvider
    scmod = scpr.getScript("vnd.sun.star.script:Honyaku.py$Test1HonyakuE2J?language=Python&location=user")
    returnFromPython = scmod.invoke(a,b,c)   
    oCell.String =  returnFromPython
        Exit Function
    HandleError1001:
        resume next
End Function

 

Python側コード

Honyaku.py

 

# coding: utf-8

import sys
import requests
import os
   # 英語を日本語に翻訳
def Test1HonyakuE2J(Eng):
#引数のEngStringで英語の文章
#doc = XSCRIPTCONTEXT.getDocument() #削除忘れ
#sheet = doc.CurrentController.getActiveSheet() #削除忘れ

sentence = Eng
url = "https://translate.google.com/translate_a/single"

headers = {
"Host": "translate.google.com",
"Accept": "*/*",
"Cookie": "",
"User-Agent": "GoogleTranslate/5.9.59004 (iPhone; iOS 10.2; ja; iPhone9,1)",
"Accept-Language": "ja-jp",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
}


params = {
"client": "it",
"dt": ["t", "rmt", "bd", "rms", "qca", "ss", "md", "ld", "ex"],
"otf": "2",
"dj": "1",
"q": sentence,
"hl": "ja",
"ie": "UTF-8",
"oe": "UTF-8",
"sl": "en",
"tl": "ja",
}


res = requests.get(
url=url,
headers=headers,
params=params,
)

res = res.json()
return res["sentences"][0]["trans"]

後の課題は、引数を1つ増やして翻訳文を表示するセルを指定すること。

 つい最近まで使っていた古いPCに、このページ通りにインストールしてGoogle翻訳マクロが動くかやってみることにしました。

新しいPCの環境は、自作PCにUbuntu Studio17.10

古いPCは最近Linux Mint 18(Ubuntuの派生OS)をインストール

 

不足しているは上の方の記事を参照する。

Google翻訳のPythonコードをWEBからコピー(URLは上の方を参照)

LibreOfficeのマクロを確認。やっぱりBasicしか入っていません。

今回SDKを探していたら、すべてのVerを見つけたのでSDKだけインストールしたら、依存関係が・・・・・とインストール不可でした。

 

結局、このページ見ながら同じようにインストールすることにしました。

$ sudo spt-get remove libreoffice*           でLibreOfficeのアンインストールからはじめました。

OSが違うからか、インストール中のなんというか結果の表示内容が微妙に違う。

 

Google翻訳プログラムをPythonで実行。

$ python ./trans.py "翻訳する英文"

Python2は、ImportError: No module named 'requests'   今回はエラーだが、Ubuntu Studioでは翻訳できた。

$ python3 ./trans.py "翻訳する英文"

Python3は、翻訳できた。

$ /opt/libreoffice5.4/program/python ./trans.py "翻訳する英文"

LibreOfficeのPythonは、もちろんエラー

 

 

次に、LibreOfficeのマクロ ー> Basic ー> 編集でコードを上記からコピーしてBasicエディタに貼りつける。

 

翻訳プログラムに上記のコードを追加、削除する。できた*.pyファイルを次のフォルダにコピーまたは移動します。

字下げ(インデント)は重要です。間違わないようにしなければいけません。

字下げがなければ、マクロ名の所に表示されませんし、字下げ位置が間違っていたらエラーがでる可能性があります。

 

/home/ユーザー名/.config/libreoffice/4/user/Scripts/python

~/.config/libreoffice/4/user/Scripts/python      でも同じです。"~"はホームディレクトリの意味です。

 

".config"フォルダは"."が付いているので普段は見えません。

端末の場合、"ls -a"と"-a"をつけると表示されます。

ファイルマネージャーは設定で 表示 ー> 隠しファイルを表示するにチェックを入れると表示されます。

 

Scriptsとpythonのフォルダはなかったので作成しました。

 

コピーが終わるとLibreOfficeのマクロ ー> 実行 ー> ライブラリ ー> マイマクロ に表示されます。

 

ClacのC1セルに英文を入力し、A1セルに"=HONYAKUE2J(C1)"を入力。

あれ、エラーが出ないのに翻訳結果が出ない・・・

よく見たらBasicのコードが"Sheet2"になっていました。"Sheet1"に変更したら翻訳されました。

後でどのシート名でも翻訳できるように、アクティブシートに変更します。現在はコードを覚えていないので探してから。

 

全部終わって、LibreOfficeのインストールからおこなっても、順調に行けば40~50分で終わりそうです。

LibreOffice WriterでGoogle翻訳マクロを使う

 

1.左図のように、英語の文章を選択状態にする。

2.Ctrl + T を押す。(好みのキーに設定出来ます。)

3.クリップボードにコピーされているので、好きな場所に貼り付ける。

 

 

 

 

 

 

 

http://zze128.blog9.fc2.com/blog-entry-175.html

 

ショートカットキーの割当方法

1.Writerを起動する。

2.ツール ー> カスタマイズ ー> キーボードタブを選択する

3.ショートカットキーの項目から好みのキーを選択します。私は「Ctrl + T」を選択しました。

4.機能ー分類の項目でマクロを選択します。(一番下)

5.機能で関数を選択します。

6.変更ボタンを押す。

 

 

Python側のコードはCalc用 Honyaku.py をそのまま使用する。

 

Basic側のコード

 

Global sTxtCString As String

Sub Main
    Dim oSels As Object
    Dim oSel As Object
    Dim oString
    Dim Honyaku As String

    oDoc = ThisComponent
    '選択した文字列を取得       
    oSels = oDoc.getCurrentSelection()
    oSel = oSels.getByIndex(i)
    oString = oSel.getString()        '選択した文字列

   'Pythonマクロ(Honyaku.pyのTest1HonyakuE2J)を実行      
    Dim a(0) As String
    Dim b(0),c(0) As Variant
    a(0) = oString
    scpr = ThisComponent.getScriptProvider
    scmod = scpr.getScript("vnd.sun.star.script:Honyaku.py$Test1HonyakuE2J?language=Python&location=user")
    returnFromPython = scmod.invoke(a,b,c)  

    Honyaku =  returnFromPython        '戻り値(翻訳された文章)

    CopyToClipBoard(Honyaku)
End Sub

'クリップボードにコピーする
Sub CopyToClipBoard( sText )
  ' create SystemClipboard instance
  oClip = CreateUnoService( _
      "com.sun.star.datatransfer.clipboard.SystemClipboard")
  oTR = createUnoListener("Tr_", _
      "com.sun.star.datatransfer.XTransferable")
  ' set data
  oClip.setContents(oTR,Null)
  sTxtCString = sText
  'oClip.flushClipboard() ' does not work
End Sub

Function Tr_getTransferData( _
    aFlavor as com.sun.star.datatransfer.DataFlavor)
  If (aFlavor.MimeType = "text/plain;charset=utf-16") Then
    Tr_getTransferData() = sTxtCString
  End If
End Function
 
Function Tr_getTransferDataFlavors()
  Dim aFlavor As new com.sun.star.datatransfer.DataFlavor
  aFlavor.MimeType = "text/plain;charset=utf-16"
  aFlavor.HumanPresentableName = "Unicode-Text"
  Tr_getTransferDataFlavors() = array(aFlavor)
End Function
 
Function Tr_isDataFlavorSupported( _
    aFlavor as com.sun.star.datatransfer.DataFlavor) as Boolean
  If aFlavor.MimeType = "text/plain;charset=utf-16" Then
    Tr_isDataFlavorSupported = true
  Else
    Tr_isDataFlavorSupported = false
  End If
End Function

Windows10のLibreOfficeでGoogle翻訳を動かす。

Windows用のLibreOffice64bit版の最新版のLibreOfficeSDKに付属しているPythonは64bit版です。

 

 

Pythonをインストールする

 

LibreOfficeのPythonは32bit版か64bit版かバージョンによって異なるみたいです。確認してください。

 

インストール時にパスを追加するにチェックを入れました。

上図のように、'requests'をpipでインストールしたら、Google翻訳のプログラムは動きました。

 

次に、LibreOfficeのPythonもパッケージが不足しているので上の方の記事を参考にしてLibreOfficeのPythonにパッケージのパスを追加します。(出来るかどうかは、まだやっていないのでわかりませんが、上の方の記事で参考にしているブログの人はWindowsでやっているので、出来るはずです。)

 

(この記事を書いた時は、不足しているパッケージをコピーしました。)

 

LibreOfficeのPythonでGoogle翻訳プログラムを実行するとWindows10の場合、python35.dllが見つからないというエラーが出ました。

 

ここのサイトで32bit版のpython35.dllをダウンロードして(64bit版はエラー)

https://jp.dll-files.com/python35.dll.html

 

C:\Program Files (x86)\LibreOffice 5\program\python-core-3.5.0\binにコ                                                ピーまたは移動します。

 

LibreOffice(Windows10の場合)のPythonプログラムの保管場所(これは、私のPCの場合ですので、ひょっとすると違うかも知れません。)

C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\python