2段組PDFからテキスト抽出するコマンド

Mac標準でPDFからテキストを抜き出す簡単な方法はありません
Mac標準のAutomatorや専用アプリを使う必要があります
さらに二段組みPDFからテキスト抽出となると難しくなります

unixの「pdftotext」コマンドを使う方法なら1行でOK
二段組みのPDFにも対応します
hoge.pdf
から
hoge.txt
を生成するコマンドです

pdftotext -raw hoge.pdf - | sed ':loop; N; $!b loop; ;s/\n//g' >> hoge.txt
pdftotextのインストール

brewでpopplerをインストールすればOK

brew install poppler

次のコマンドがすべてインストールされる

pdftotext: converts PDF to text
pdftops: converts PDF to PostScript
pdftoppm: converts PDF pages to netpbm (PPM/PGM/PBM) image files
pdftopng: converts PDF pages to PNG image files
pdftohtml: converts PDF to HTML
pdfinfo: extracts PDF metadata
pdfimages: extracts raw images from PDF files
pdffonts: lists fonts used in PDF files
pdfdetach: extracts attached files from PDF files
pdfseparate: PDF to PNG/JPEG/TIFF/PDF/PS/EPS/SVG
pdfunite: PDF page merger

https://poppler.freedesktop.org/

pdfgray・pdfmin

pdfgray *.pdf → *.gray.pdf

スクリーンショット 71
MacOSのプレビューにはPDFグレイ変換オプションがある
ファイル→書き出す→グレイトーン
スクリーンショット 65
ところがやってみるとちゃんとグレイ変換されない
なぜか一部だけカラーのまま
これでは使い物にならない

そこでgsによるshellスクリプトの出番
以下のスクリプトを.zprofileに以下を追記するだけ
これでバッチリグレイPDFに変換できる

# pdfgray *.pdf
function pdfgray()
{
    local cnt=0
    for i in @; do
        gs -sDEVICE=pdfwrite \
           -sColorConversionStrategy=Gray \
           -dProcessColorModel=/DeviceGray \
           -dCompatibilityLevel=1.4 \
           -dNOPAUSE -dQUIET -dBATCH \
           -sOutputFile={i%%.*}.gray.pdf ${i} &
        (( (cnt += 1) % 4 == 0 )) && wait
    done
    wait && return 0
}

コンソール上で
pdfgray hoge.pdf
とすれば
hoge.gray.pdf
が出来上がる

$ pdfgray hoge.pdf
[3] 38381
[3]  + done       gs -sDEVICE=pdfwrite -sColorConversionStrategy=Gray  -dCompatibilityLevel=1.4
$ ls
hoge.pdf  hoge.gray.pdf
pdfmin *.pdf → *.min.pdf

おなじくプレビューのファイルサイズを減らすもイマイチ

.zprofile
に以下を追記

# pdfmin *.pdf
function pdfmin()
{
    local cnt=0
    for i in @; do
        gs -sDEVICE=pdfwrite \
           -dCompatibilityLevel=1.4 \
           -dPDFSETTINGS=/ebook \
           -dNOPAUSE -dQUIET -dBATCH \
           -sOutputFile={i%%.*}.min.pdf ${i} &
        (( (cnt += 1) % 4 == 0 )) && wait
    done
    wait && return 0
}

コンソール上で
pdfmin hoge.pdf
とすれば
hoge.min.pdf
が出来上がる

$ pdfmin hoge.pdf
[3] 38523
[3]  + done       gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE 
$ ls
hoge.pdf  hoge.min.pdf