2018-09-14

GhostScriptを使用したPDFマニピュレーション

GhostScript (GS) を使用すると、PDFの処理をいろいろとできて面白い。

複数のPDFファイルを連結する。

gs -dNOPAUSE -sDEVICE=pdfwrite -dSAFER -sOUTPUTFILE=combined.pdf -dBATCH 1.pdf 2.pdf

ページを選択する。

gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=22 -dLastPage=36 -sOutputFile=output.pdf input.pdf

フォントを埋め込む。

gs -dPDFSETTINGS=/prepress -dEmbedAllFonts=true -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=output.pdf -c .setpdfwrite -f input.pdf

DOCINFOを上書きする。

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=output.pdf input.pdf -c '[/Creator()/Author()/Subject()/Title()/Keywords() /DOCINFO pdfmark'

どこのサイトからコピーしてきたかによって、引数の並びが微妙に異なる。完全には理解できずに使っている...

2018-08-26

日本語の文字数を数える方法

UTF-8になって、全角文字が2バイトでなくなったこともあり、文字数を数えるのが面倒になった。

やや面倒だが、以下のコマンドで、日本語混じりの文字数をカウントできる。

$ python -c 'import sys; print len(sys.stdin.read().decode("utf-8"))'
標準入力からUTF-8のテキストを流し込む。

なお、この方法の場合は、ひらがな・漢字が1文字とカウントされるが、同時に、数字など半角文字も1文字と数えられる。

2018-07-21

GPG: ファイルを共通鍵で暗号化する方法

暗号化
$ gpg -c file
これにより、file.gpgが生成される。
$ file file.gpg
file.gpg: GPG symmetrically encrypted data (AES cipher)

復号化

gpg -d file.gpg
(標準出力へ出力される)

公開鍵暗号と違って、鍵のセットを用意するなどの必要がないので、個人で使う分には便利。

2018-06-07

PulseAudioのpipe-sourceとpipe-sink

PulseAudioのpipe-sinkやpipe-sourceとffmpegとをプロセス間通信する方法のメモ.
pactl load-module module-pipe-sink file=/tmp/sink.fifo
pactl list | less # どのようなサンプリングスペックになっているか確認.
ffmpeg -f s16le -ac 2 -ar 48000 -i /tmp/sink.fifo save.wav
新しくできたシンクに向かってアプリケーションから再生すると, ffmpegによって取り込むことができる.
pactl load-module module-pipe-source file=/tmp/source.fifo
ffmpeg -i input.wav -f s16le -ac 2 -ar 48000 /tmp/source.fifo
新しくできたソースからアプリケーションで録音ができる.

この方法単体では役に立たないが, 独自のソース・シンクを開発する場合に便利だろう. PulseAudioのモジュールを書かなくても, pipeへ読み書きするだけでソース・シンクのディバイスを作ることができる.
ところで, スピーカーへ再生している何かを録音したい場合, sink-monitorっていうsourceから録音すれば良いので, pipe-sinkは必要ない.

2018-05-12

パスワード無しでsudoできるコマンドをsudoersへ設定

通常はsudoを使うとユーザーのパスワードを要求するが, パスワードなしで実行できるように設定することができる. その方法をメモする.

シャットダウンやサスペンドなどのコマンドをsudoを通して呼び出すことがあるが, そのような場合に便利だ.

以下にユーザー名user1のユーザがpm-suspendをパスワードなしで実行できるようにする方法を例示する.

user1 ALL=NOPASSWD: /usr/sbin/pm-suspend

2018-03-10

確定申告の添付書類台紙へ本人確認書類を電磁的に貼り付ける

確定申告書を印刷して提出する時, 源泉徴収票 (原本) とマイナンバーカード (写) を添付書類台紙へ貼る必要がある. わざわざ別の紙に印刷して貼るのは面倒かつ紙の無駄である. pLaTeXを使用して電磁的に貼る方法を説明する.
  • まず, 貼る予定のカードをスキャンし, 大きさをそろえて周囲を切り取る. 各ページをEPSで保存する. 一例としてGimpを使用するとこのような作業ができる.
  • 貼り付け台紙のページをEPSへ変換する.
    $ pdftops -f 2 -l 2 ../h29syotoku.pdf id-format.eps
    もしAcrobat Reader等からEPSを作成したい場合, このページが役に立つかもしれない.
  • pLaTeXのコードを作成し, PDFを作成する.
    platex id && dvipdfmx id
    以下に, TeXのソースコードを示す.
    \documentclass{jarticle}
    \usepackage{wallpaper}
    \usepackage{graphicx}
    \usepackage{geometry}
    \usepackage{color}
    
    \geometry{left=0mm,right=0mm,top=20mm,bottom=20mm}
    
    \begin{document}
    \thispagestyle{empty}
    \ThisCenterWallPaper{1.0}{id-format.eps}
    
    \center \begin{tabular}{c}
      ~\vspace{77mm}~ \\ % 位置を調整する
      \colorbox{white}{
        \begin{tabular}{cc}
          ~ \\
          \includegraphics[width=90mm]{taxid-1.eps} &  % マイナンバー 表
          \includegraphics[width=90mm]{taxid-2.eps} \\ % マイナンバー 裏
          ~ \\
          % 本人確認書類を貼る場合:
          \includegraphics[width=90mm]{lic-1.eps} &
          \includegraphics[width=90mm]{lic-2.eps} \\
          ~ \\
        \end{tabular}
      }
      \\
    \end{tabular}
    \end{document}
    
    width=90mmの箇所は, 周囲を切り取ったときの大きさに合わせて設定する. あるいは, EPSに大きさを正しく設定していれば, widthは不要になる.
  • 2018-01-19

    Postfix+Procmail: 電子メールの添付ファイルを自動で保存する方法

    Linuxメールサーバ上で, 送られて来た電子メールの添付ファイルを自動で保存する方法をメモする.

    Pythonのスクリプトを以下のように用意する.

    #! /bin/env python
    
    import sys
    import email
    import re
    import os
    
    re_fname = re.compile('[^\./][^/]*\.[a-zA-Z0-9]*$') # この箇所は適宜修正をすること.
    dest_dir = '/home/hoge/email/' # 保存先のディレクトリ
    
    msg = email.message_from_string(sys.stdin.read())
    for part in msg.walk():
            fn = part.get_filename()
            if not part.is_multipart() and fn and re_fname.match(fn):
                    print dir(part)
                    fp = open(os.path.join(dest_dir, fn), 'wb')
                    fp.write(part.get_payload(decode=True))
                    fp.close()
    
    上記のスクリプトを ~/Maildir/attach2file.pyという名前で保存した場合, .procmailrcに以下のように記述する.
    :0c
    *^Content-Type: multipart
    | $HOME/Maildir/attach2file.py
    

    なお, re_fnameの箇所は, ..など他のディレクトリへファイルを書き込まれないようにするなどセキュリティに配慮して記載する.