|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

その場でスクリーンショットを撮って挿入するマクロ(OpenOffice.org writer)

howm の ImageCapture を見ていて OpenOffice.org writer でもできるんじゃない? と思いつき、やってみたところなかなか便利そうでした。

直接呼び出すのは scrotScreen や importWindowOrRectangle といったプロシージャで、 これをツールバーに登録したりショートカットキーを割り当てて使うのがおすすめです。

OpenOffice.org Basic です。気が向いたら修正するかもしれません。

Linux では import を使えばできるだろう……と思っていたのですが、 一部のウィンドウが真っ黒になってしまう問題があったので scrot (Ubuntu の場合は apt でインストール可)も使えるようにしてみました。 ただし、scrot の場合は「選択したウィンドウ」ないし 「現在アクティブなウィンドウ」は取り込めないようです。

Windows の場合 WinShot または boxcutter が別途必要です。 ただし、boxcutter の場合は 「選択したウィンドウ」ないし 「現在アクティブなウィンドウ」は取り込めないようです。

個別のウィンドウのスクリーンショットは Alt + Print Screen でクリップボードにコピーして貼ればいいので特に問題ない気もしますが。

rem The MIT License
rem 
rem Copyright (c) 2010 sonota <yosiot8753@gmail.com>
rem 
rem Permission is hereby granted, free of charge, to any person obtaining a copy
rem of this software and associated documentation files (the "Software"), to deal
rem in the Software without restriction, including without limitation the rights
rem to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
rem copies of the Software, and to permit persons to whom the Software is
rem furnished to do so, subject to the following conditions:
rem 
rem The above copyright notice and this permission notice shall be included in
rem all copies or substantial portions of the Software.
rem 
rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rem IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rem FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
rem AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
rem LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rem OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
rem THE SOFTWARE.


rem ----------------------------------------------------------------------
rem for scrot (Linux)

sub scrotScreen
  scrotCommon("")
end sub

sub scrotRectangle
  scrotCommon(" -s ")
end sub


rem ----------------------------------------------------------------------
rem for ImageMagick import (Linux)

rem 取り込みたいウィンドウをクリック、またはドラッグで矩形選択
sub importWindowOrRectangle
  importCommon(" -frame ")
end sub

sub importScreen
  importCommon(" -window root ")
end sub


rem ----------------------------------------------------------------------
rem for WinShot (Windows)

sub winshotRectangle
  winshotCommon(" -Bitmap -Rectangle -Close -File ")
end sub

sub winshotWindow
  winshotCommon(" -Bitmap -ActiveWindow -Close -File ")
end sub

sub winshotScreen
  winshotCommon(" -Bitmap -Desktop -Close -File ")
end sub


rem ----------------------------------------------------------------------
rem for boxcutter (Windows)

sub boxcutterRectangle
  boxcutterCommon("")
end sub

sub boxcutterScreen
  boxcutterCommon(" --fullscreen ")
end sub


rem ----------------------------------------------------------------------
rem コマンドのパスの設定 / set command path

sub scrotCommon(options as String)
  imageCapture("/usr/bin/scrot", options, "SHELL")
end sub

sub importCommon(options as String)
  imageCapture("/usr/bin/import", options, "SHELL")
end sub

sub winshotCommon(options as String)
  imageCapture("C:\xxx\winshot153a\WinShot.exe", options, "UNO_SYSTEM_SHELL_EXECUTE")
end sub

sub boxcutterCommon(options as String)
  imageCapture("C:\xxx\boxcutter.exe", options, "SHELL")
end sub


rem ----------------------------------------------------------------------


sub imageCapture(commandPath as String, options as String, wayOfExec as String)
  dim document   as Object
  dim dispatcher as Object
  dim tempImagePath as String
  dim platform as String
  dim waitMSec as Integer

  rem ----------------------------------------------------------------------
  rem 設定 / settings

  platform = "LINUX"
  rem platform = "WINDOWS"

  waitMSec = 5000

  rem ----------------------------------------------------------------------

  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

  select case platform
  case "LINUX":
    tempImagePath = "/tmp/image-capture-temp.png"
  case "WINDOWS":
    tempImagePath = Environ("TEMP") + "\image-capture-temp.png"
  end select

  rem ----------------------------------------------------------------------

  wait waitMSec

  beep
  wait 100

  select case wayOfExec
  case "SHELL"
    shell( convertToUrl(commandPath), 0, options + " " + tempImagePath, True) 
  case "UNO_SYSTEM_SHELL_EXECUTE"
    Dim oSvc as object
    oSvc = createUnoService("com.sun.star.system.SystemShellExecute")
    oSvc.execute( ConvertToUrl(commandPath), options + " " + tempImagePath, 0 )

    wait 1000
    rem スクリーンショット取得まで待つ代わりに
    msgbox("スクリーンショット取得後に押してください。") rem "Click after shoot"
  case else
    msgbox("コマンド実行方法の指定に誤りがあります。") rem "wayOfExec unknown"
    exit sub
  end select

  insertImage(tempImagePath)

  dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())
  dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, Array())
  dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())

  rem ----------------------------------------------------------------------
  rem modify anchor

  dim oDoc as object
  oDoc = ThisComponent 
  oDrawPage = oDoc.DrawPage
  oDrawPageObj = oDrawPage.getByIndex(oDrawPage.Count - 1)
  oDrawPageObj.AnchorType = 1 rem 1: as char

  kill(tempImagePath)
end sub


sub insertImage(tempImagePath as string)
  dim document   as object
  dim dispatcher as object

  rem ----------------------------------------------------------------------

  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

  rem ----------------------------------------------------------------------

  dim args1(3) as new com.sun.star.beans.PropertyValue
  args1(0).Name = "FileName"
  args1(0).Value = converttourl(tempImagePath)
  args1(1).Name = "FilterName"
  args1(1).Value = "<すべての書式>"
  args1(2).Name = "AsLink"
  args1(2).Value = false
  args1(3).Name = "Style"
  args1(3).Value = "図"

  dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args1())
end sub
スポンサーサイト

OpenOffice.org: バッチ処理で .odt-.doc 相互変換、PDF出力

2014-07-20 追記
最近のバージョンでは --convert-to というオプションが用意されていて もっと簡単に変換できるようです。

参考: 【LibreOffice】headlessでファイルコンバータとして使う【Output Fileter Name】 | 熊本でWEB開発もホームページ制作もしない(2013-11-30)

OpenOffice.org Writer の .odtファイルと Microsoft Word の .docファイルを CUIなバッチ処理で相互変換したり、 PDFに出力する方法。 できれば便利なのにと前々から思ってましたが、マクロを利用して実際できてしまうことが分かりました。

テーマ:フリーソフト - ジャンル:コンピュータ

OpenOffice.org メモ

記事にしようかと思って調べたらすでに詳しい解説が存在していたものとか。

writer: 目次付きの文書を Word 97/2000/XP 形式(.doc)で保存して WORD で開くとブックマークの挿入などフィールド関連の操作が一部不可能になる

2010-02-01

目次が原因だったようで、OOo側で目次を削除してから Word 97/2000/XP 形式で保存したら大丈夫だった。

writer: マウスでスクロールする時にページ数などを表示するヒント(ツールチップ) が出るのが邪魔・鬱陶しい

2009-05-11

メニューから ツール > オプション
OpenOffice.org > 全般 > 「ヒント」のチェックを外す。
ただし、他のヒントも全て出なくなってしまう(?)。

表示時間を変更するだけなら
メニューから ツール > オプション
OpenOffice.org > アクセシビリティ > ヒントの表示時間

選択範囲をマーキング

2009-05-11

ショートカットキーを割り当てて使ってます。

sub marking_selection
  rem ======================================================================
  rem define variables
  dim document   as object
  dim dispatcher as object
  rem ======================================================================
  rem get access to the document
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  
  rem ======================================================================
  dim args1(0) as new com.sun.star.beans.PropertyValue
  args1(0).Name = "CharBackgroundExt"
  args1(0).Value = false
  
  dispatcher.executeDispatch(document, ".uno:CharBackgroundExt", "", 0, args1())
end sub
20100128 追記: スタイルにショートカットキーを割り当てれば良いと分かりました。

OOo Basic, Writer: 選択範囲の文字列を取得

2008-11-02, v2.4.1
dim oDoc 
oDoc= ThisComponent
dim oSelection
oSelection = oDoc.getCurrentSelection()
dim SelectedText as String
SelectedText = oSelection.getByIndex(0).getString()

MsgBox( SelectedText )
参考: 
Nabble - openoffice - api dev - Get Selected Text in the actual TextDocument
http://www.nabble.com/Get-Selected-Text-in-the-actual-TextDocument-td19743731.html
Current selection - OpenOffice.org Wiki
http://wiki.services.openoffice.org/wiki/Current_selection

ルビを振ると行間(行高)が不均一になる場合

OpenOffice.org ユーザーのための Microsoft Office 互換性研究室 - ■ 互換性の研究-Writerを使って「行数」や「文字数」を指定したドキュメントを作成する手順
ページ書式の「行数と文字数を指定する」の方法では解決できないかと思っていましたが、「ルビ文字の最大サイズ」などを調節するとうまく収まる場合があります。

↓ こんな感じ

FAQも参考になるかと。
faq/3/89 - OpenOffice.org Q&A | ルビをつけたときの行間の乱れについて



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。