adbird(広告鳥) 備忘録

pdfデータ編集

随時、更新。基本、Linuxのアプリを使用する方法。


PDF文書に線を引いたり、書き込みをしたりする

Xournal

Xournalというソフトを使う。

Ubuntuでは以下でインストールできる。

$ sudo apt install xournal

線を引いたり、テキストを追加したりした編集データは、拡張子「.xoj」として保存され、元のPDFデータはそのままなので、安心。

もちろん、元のPDFデータと書き込みなどの編集データ(.xoj)を結合させて、新たなPDFデータにエクスポートさせることも可能。

Windows版について

ダウンロードしてきたzipファイルを解凍。 ローカルディスク(C:)直下に解凍した「xournal-0.4.8.2016-win32」をフォルダごとコピー。

フォルダ内にある「xournal.exe」をダブルクリックすると、起動する。xournal.exeのショートカットをデスクトップ上に置いておくか、タスクバーにピン留めしておくといい。

既存のPDFを開くには、xournal を起動してから、左上のメニューから File > Open で。

Windows版のみの問題

  • 日本語入力時の文字化け問題

    • キーボードで日本語入力する際には、フォント(Tools > Text Font)を日本語フォント(MS GothicやYu Gothic)にしておかないと、入力時に文字化けする。
  • ファイル名に日本語を含む「.xoj」ファイルが直接開けない問題

    • 日本語文字化けの影響であろうが、保存した「.xoj」ファイル名に日本語が入っていると、「.xoj」ファイルを直接ダブルクリックで開こうとすると、エラーが出て開けない。

xournal を起動してから、左上のメニューから File > Open で開けば、大丈夫。

Xournal++

Xournal++

Xournalからフォークされたもので、こちらのほうが高機能らしい。Ubuntu18.04では以下でインストール可能。

$ sudo snap install xournalpp

Windows版は2021年4月2日現在、キーボードでの日本語入力ができない。

分割、ページ入れ替え

$ pdftk 入力.pdf cat ページ番号(1 3 2 4 などでページ入れ替え) output 出力.pdf

追記:分割については、pdftkでいちいちやらなくても(時々、エラーもでるし)、Ubuntuのドキュメントビューアー(Evince)で、 印刷>ファイルに出力する でやったほうが簡単だった…。

さらに追記:pdftkでパスワードがらみのエラーが出るときは、下記の「PDFにかかっているパスワードを削除して編集可能にする」を参照のこと。

PDFデータを画像(png)にする

LibreOfficeのWriterで作成して、pngにエクスポートすると、画像がぼやけてしまう。一度、PDFにエクスポートしてから、下記コマンドでpngにしたほうがよい。

$ convert -density 600 入力.pdf 出力.png

Windowsの場合

WindowsCygwin での上記コマンドがうまくいかなかったので、以下で実行。

WingetでGhostscriptをインストール。

$ winget install Ghostscript

pdfをpngに変換。

$ gswin64c -sDEVICE=png16m -r300 -dGraphicsAlphaBits=4 -o 出力.png 入力.pdf

png16m24-bit RGB colorを意味し、r300は解像度、dGraphicsAlphaBitsアンチエイリアス(1,2,4のいずれか数値が大きいほどシャギーが目立ちにくくなる)。

複数のPDFを一気にPNGにするスクリプトWindowsCygwin 使用時)

ディレクトリ内に複数のPDFデータ(1枚もの)が入っており、それらを一気にPNGに変換するスクリプト

以下の内容を、ディレクトリ内に pdftopng.sh として保存

for i in $(ls -1 *.pdf | xargs basename -s .pdf);
do
gswin64c -sDEVICE=png16m -r300 -dGraphicsAlphaBits=4 -o $i.png $i.pdf
done

ディレクトリ内でCygwinで実行

$ sh pdftopng.sh

PDFデータをバラバラの画像にする

$ pdftoppm -rx 350 -ry 350 入力.pdf image 

上記では解像度350dpi。-pngオプションをつければ、pngで出力される。

特定のページだけ画像にするには以下の通り。(以下は、解像度300dpiで、jpeg形式、5ページのみ。)

$ pdftoppm -r 300 -jpeg -f 5 -l 5 入力.pdf image
  • -f ページ番号  開始ページを指定
  • -l ページ番号  終了ページを指定

Windowsでは、TeXLiveをインストールすると付随してインストールされているはず。

参考:【 pdftoppm 】コマンド――PDFファイルを画像に変換する

結合

pdfunite

$ pdfunite 入力.pdf 入力.pdf 出力.pdf

任意のディレクトリ内の全てのPDFを結合する場合

$ pdfunite *.pdf 出力.pdf

pdftk

$ pdftk 入力1.pdf 入力2.pdf cat output 出力.pdf

複数のPDFファイルのそれぞれ一部分のページを寄せ集めて、一つのPDFファイルに結合する

例えば「入力001.pdf」の1~2ページと、「入力002.pdf」の5~6ページを結合させる場合は

pdftk A=入力001.pdf B=入力002.pdf cat A1-2 B5-6 output 出力.pdf

さらに「入力001.pdf」の1~2ページ + 「入力002.pdf」の5~6ページ + 再び「入力001.pdf」の3~4ページ の場合

pdftk A=入力001.pdf B=入力002.pdf cat A1-2 B5-6 A3-4 output 出力.pdf

右クリックから簡単に結合させる bat ファイル

Windowsの場合、以下の内容で「PDF結合.bat」ファイルを作成する。あらかじめ pdftk をインストールしておく。

@echo off
echo 開始 %date%  %time%
set HIZUKE=%date: =0%
set JIKOKU=%time: =0%
set yy=%HIZUKE:~0,4%
set mm=%HIZUKE:~5,2%
set dd=%HIZUKE:~8,2%
set hh=%JIKOKU:~0,2%
set mi=%JIKOKU:~3,2%
set ss=%JIKOKU:~6,2%

pdftk %* cat output ALL_%yy%%mm%%dd%_%hh%%mi%%ss%.pdf

エクスプローラーのアドレス欄に「shell:sendto」として、開いた場所に上記の「PDF結合.bat」をコピー。

  • 結合したいPDFファイルの名前の頭を、並べたい順番に「001」などの連番にしておく。
  • 上記の複数PDFファイルを選択。
  • 右クリック→送る→「PDF結合.bat」

PDFに「しおり」(bookmarks)をつける

以下のような内容で「しおり」(bookmarks)設定ファイルの bookmarks.txt をutf-8で作成する。

BookmarkBegin
BookmarkTitle: しおり名1
BookmarkLevel: 1
BookmarkPageNumber: 1

BookmarkBegin
BookmarkTitle: しおり名1-2
BookmarkLevel: 2
BookmarkPageNumber: 3

BookmarkBegin
BookmarkTitle: しおり名2
BookmarkLevel: 1
BookmarkPageNumber: 5

Title でラベルを、 Level によって木構造のネストを、 PageNumber によってリンクする先のページ番号を指定。

$ pdftk 入力.pdf update_info_utf8 bookmarks.txt output 出力.pdf

複数画像を1つのPDFに結合

imagemagickではエラーが出て失敗したが、GraphicsMagickならできた。

フォルダ内に連番のjpgを入れて、

$ gm convert *.jpg 出力.pdf

回転

pdftk

$ pdftk 入力.pdf cat 1-endeast output 出力.pdf

1-end…全ページ。 east…90度回転。 eastのところをsouthに変えたら180度回転。

mogrify(pdftkの回転でエラーが出た場合)

$ mogrify -rotate 90 入力.pdf

mogrifyはデータを上書き保存するので、実行前に必ずバックアップを取る。

PDFデータサイズを縮小する

$ gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=出力.pdf 入力.pdf`

ページサイズを揃える

一つのPDFファイルの中に、たとえばA4のページとB5のページがごちゃまぜになってしまっている場合に、全てのページをB5サイズに揃える手順。

  • Ubuntuのドキュメントビューアー(Evince)で、 印刷 > ファイルに出力する
  • 出力先のファイルを決定する
  • ページの設定 > 用紙サイズ をB5(JIS)
  • ページの取り扱い > ページの拡大縮小:印刷可能な領域に合わせる
  • 自動回転して中央揃え にチェックを入れる
  • 印刷

PDFデータ同士を重ねる(簡単な文字入力)

$ pdftk 前面.pdf background 背景.pdf output 出力.pdf

既存のPDFの端などに簡単な文字入力をしたい場合、LibreOfficeのWriterなどでおおよその場所に文字を書いて、PDFデータ(背景.pdf)として出力後、上記コマンドを使って、元のPDFデータと重ねる。

$ pdftk 元データ.pdf stamp スタンプ.pdf output 出力.pdf

スタンプとして既存のPDFデータの前面にスタンプとして重ねるには上記のコマンド。

これを活用して、PDFのページの上部にちょっとしたテキストを入れるスクリプトを作った。

複数ページのPDFにはmultistampが使える。

余白をとる

pdfcrop で以下のようにする。

$ pdfcrop --margins '5 5 5 5' input.pdf output.pdf

2アップ(用紙1枚に2 ページ分を収める)

pdfjam が必要。

A4横置き用紙に2アップの場合

$ pdfjam 入力.pdf --outfile 出力.pdf --paper a4paper --landscape --nup 2x1

追記:コマンドがpdfnupからpdfjamに変わったらしい。

以下、Windowsの場合。ただし、すでにTeXLiveとCygwinがインストール済みであることが前提。

TeXLiveのFullでインストールしている場合はすでに入っていると思うが、僕の場合、 Texliveを短時間(basic scheme +アルファ)でインストールする でTeXLiveをインストールしていたので、pdfjamがインストールされていなかった。

コマンドプロンプトでインストール。

tlmgr install pdfjam

以下にパスを通す。(環境によってpdfjamの入っている場所が違う〔例えば、「2022」のところはTeXLiveのバージョンで違う〕ので適宜変えること)

C:\texlive\2022\texmf-dist\scripts\pdfjam

パスの通し方は、Windowsでプログラムやスクリプトにパスを通す参照。

Cygwinターミナルで

$ pdfjam --help

でズラズラと説明が出てきたら成功。

詳細な使い方は公式 GitHub - rrthomas/pdfjam: The pdfjam package for manipulating PDF files を参照のこと。

面付け

pdfjamが必要。pdfjamはTeXLiveに入っているので、つまりは、TeXLiveのインストールが必要。

中綴じ用面付表で面付け時のページの順を確認。左綴じ4ページの場合、4,1,2,3 の順番になる。以下、その仮定で。

A3用紙(横向き)に2UPの場合

$ pdfjam 入力.pdf '4,1,2,3' --outfile 出力.pdf --paper a3paper --landscape --nup 2x1

B4用紙(横向き)に2UPの場合

$ pdfjam 入力.pdf '4,1,2,3' --outfile 出力.pdf --papersize '{364mm,257mm}' --nup 2x1

縦書き原稿の場合は、A5縦書き原稿PDFを、A4用紙・小冊子面付けしたPDFに - adbird(広告鳥) 備忘録を参照のこと。

ページ番号を追加

addpageスクリプト

※追記:複数のPDFを結合したPDFにaddpageスクリプトでページ番号つけたPDFの文字が時々飛ぶ(消える)現象が起こった(もしかしたら、PDF結合の過程で飛んでいたのかもしれないけど)ので、下記のpdftkの方がいいかも。

addpageスクリプトをインストール。

$ sudo apt install python3-pip
$ pip3 install addpage

たぶん/home/〜/.local/bin/の部分はユーザー名)に addpage というスクリプトが入っているはずなので、実行。

$ python3 /home/〜/.local/bin/addpage -o output.pdf input.pdf

オプションはaddpage · PyPIを参考に。例えば、フォントサイズを8ptにするときは、-z 8をつける。

pdftk の multistamp を使う

Xubuntu20.04.2(64bit)をインストールしたラズパイ4で上記のスクリプトを使ったら、エラーが出て使えなかったので、下記の方法でページ番号を追加。

ディレクトリ内にLibreOfficeのWriterでページ番号のついている空白ページのデータ「ページ番号.odt」を作成する。(※ページ番号をつけたいPDFデータのページよりも多いページ数にしておく。Ctrl + Enter で改ページ挿入は知っておくと便利)。

「ページ番号.odt」をPDFエクスポートして「ページ番号.pdf」を作成。

pdftk の multistamp で、ページ番号.pdfと入力.pdfを重ねる。

$ pdftk 入力.pdf multistamp ページ番号.pdf output 出力.pdf

ただし、ページ番号をつけようとしているPDFに縦向きと横向きのページが混じっていると、ページの向きによってページ番号のフォントサイズが変わってしまう(「ページ番号.pdf」が縦向きページで、「入力.pdf」に横向きページが混じっていると、横向きページのページ番号のフォントが小さくなる)ので、注意。

pdf を cbz へ変換

任意のフォルダ内にpdfデータと、以下の内容のスクリプト pdftocbz.sh を作成して

for file in *.pdf
do
    name="${file%.pdf}"
    echo "Converting $name to cbz"
    mkdir "./$name"
    pdftoppm -jpeg "$file" "./$name/000" -r 300
    zip -r6 "${name}.cbz" "./$name" 
    rm -rf "./$name"
done

スクリプト実行

$ sh pdftocbz.sh

参照:linux で pdf を cbz形式に変換する - マイブーム=メイプル

PDFにかかっているパスワードを削除して編集可能にする

pdftkでpdfを結合しようとしたら

WARNING: The creator of the input PDF:
   002.pdf
   has set an owner password (which is not required to handle this PDF).
   You did not supply this password. Please respect any copyright.

とエラーがでた。

編集できないようにパスワードがかっているらしい。

ドキュメントビューア(evince )で 印刷 > ファイルに出力する
で別のpdfにすれば、編集可能なpdfとなる。

参考:How Do I Use evince To Remove The Password?

Windowsの場合

コマンドプロンプト等で

$ qpdf --decrypt 入力.pdf 出力.pdf

参考:qpdfでPDFの暗号化による保護を解除 - はしくれエンジニアもどきのメモパスワード による機能制限がかかった PDF を解除する qpdf

エラー対応