ImageMagickでpdfファイルの1ページ目だけをjpegにする

ImagemMgickのconvertコマンドでpdfをjpegにしようとするとエラーになってしまいました.でもこれは見覚えのあるエラー……どこかにメモした気がするのですが見当たらないのでblogにしてみました.

ImageMagickのセキュリティポリシーを変更してpdfファイルを変換できるようにする

$ convert -geometry 640 /var/tmp/Nextcloud2pdf_cache/HQeSTL5TgcgAPtS.pdf[0] /tmp/HQeSTL5TgcgAPtS.jpg
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert-im6.q16: no images defined `/tmp/HQeSTL5TgcgAPtS.jpg' @ error/convert.c/ConvertImageCommand/3258.

セキュリティの問題でImageMagickの設定で無効にしてあるのでこれを有効にします.

$ sudo git -C /etc diff /etc/ImageMagick-6/policy.xml
diff --git a/ImageMagick-6/policy.xml b/ImageMagick-6/policy.xml
index 82a3d0b..0953557 100644
--- a/ImageMagick-6/policy.xml
+++ b/ImageMagick-6/policy.xml
@@ -91,6 +91,6 @@
   <policy domain="coder" rights="none" pattern="PS2" />
   <policy domain="coder" rights="none" pattern="PS3" />
   <policy domain="coder" rights="none" pattern="EPS" />
-  <policy domain="coder" rights="none" pattern="PDF" />
+  <policy domain="coder" rights="read|write" pattern="PDF" />
   <policy domain="coder" rights="none" pattern="XPS" />
 </policymap>

設定を編集後実行するとうまく動きました :)

$ convert -geometry 640 /var/tmp/Nextcloud2pdf_cache/HQeSTL5TgcgAPtS.pdf[0] /tmp/HQeSTL5TgcgAPtS.jpg

pdfファイルの指定ページだけを変換する

ソースファイル名を普通に指定すると, ファイル名-%d.jpg のようなファイルが連番で作成されます.
今回は1ページめだけが欲しいので不必要なファイルがたくさん出来てしまいます.

1ページだけが欲しい場合, ソースファイル名.pdf[0] というようにページ指定して実現できます.この添字は1ページ目が0,2ページめが1のように指定します.

存在しないページ番号を指定するとエラーになります.

$ convert -geometry 640 /var/tmp/Nextcloud2pdf_cache/HQeSTL5TgcgAPtS.pdf[99] /tmp/HQeSTL5TgcgAPtS-99.jpg

Requested FirstPage is greater than the number of pages in the file: 33
   No pages will be processed (FirstPage > LastPage).
convert-im6.q16: no images defined `./HQeSTL5TgcgAPtS-1.jpg' @ error/convert.c/ConvertImageCommand/3258.
環境
$ dpkg-query -W imagemagick
imagemagick     8:6.9.10.23+dfsg-2.1+deb10u1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

ドイツの格安VPS(Contabo VPS 300) を借りてセットアップ済サーバのOSを入れ替える

追記)Contabo のアフェリエイトリンクを貼っておきます.Contabo のサービスを申し込む場合は以下のバナーから申し込んでくれると嬉しいです.


今利用しているさくらのVPSのdiskがいっぱいになってしまいました.現在100GBですが,鹿児島市の航空写真のH30版を入手したのでもう50GBは欲しい.できればもう100GB.

オブジェクトストレージだとそこそこ安そうだけどさくらは申込み停止中.

新規お申し込み停止のお知らせ
100GiB以下 540円

ConoHaは受付中みたい.

容量は100GB単位で追加でき、月額450円/100GBでご利用いただけます。

Amazon S3 はどうだろうと計算すると今の転送量だと4000円/月以上しそう(◞‸◟)

海外だとどうだろうと VPS 比較サイトの VPS Comp を見ると,ドイツの Contabo VPS 300 というストレージ 300GB のサービスが 3.99€/月と格安です.日本円で500円位でしょうか.

安いのでちょっと不安ですが契約してみました.セットアップ料金として別途 4.99€が必要でした.このフィーは申込期間が1ヶ月の場合で,3ヶ月,6ヶ月と伸びるごとに安くなって12ヶ月で無料になります.

20190509 23 05 06 1787

契約には別途ライセンスの写真を送る必要がありました.日本語の住基ネットカードの表面のみの写真を送りましたが受け付けてもらえました.

するとすぐにアクセスのための情報がやってきました.アクセス手段はssh と VNC です.
申込時に指定したディストリビューションでセットアップ済ですが,自分で用意したイメージでセットアップしたり暗号化FSなども利用したいです.

さくらのVPS では自分で用意した ISO イメージでセットアップできました.

しかし,Contabo ではこの方法は使えないようです.
Webのコントロールパネルを見ると,Rescue system から SystemRescueCD, Debian Live, CroneZilla が使えるようです.

20190510 09 05 38 16982

今回は,ディスクに空き領域を作成してそこに起動イメージとセットアップCD イメージを置いてセットアップ済イメージのGRUB からそれを起動してセットアップすることにしました.
(はじめ / の領域に置いて初期化しなければ行けるのではと試しましたがパーティションの設定で d-i に怒られたので別パーティションに)

ということでまずはWebコンソールから Debian Live で起動して,VNC で接続して Install 済のイメージをいじって500MB ほどの空きパーティションを作成しました. / が1GB ほどあったのでこれをおおまかに半分に分割しました.ext4 でフォーマットもして mount します.
(案外VNCももたつかず操作できた)

20190510 15 05 09 16332
20190510 15 05 01 16995

mount した領域に vmlinux, initrd, Debian Install CD を入れます.
今回はこの辺をダウンロードしました.

http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/debian-testing-amd64-netinst.iso
http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/SHA512SUMS
http://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/SHA512SUMS.sign
http://http.us.debian.org/debian/dists/buster/main/installer-amd64/20190410/images/hd-media/vmlinuz
http://http.us.debian.org/debian/dists/buster/main/installer-amd64/20190410/images/hd-media/initrd.gz

再起動してプリインストールイメージの GRUB で c を押して GRUB の command-line に入ります.
そしてこんな感じでさっきダウンロードしたイメージで起動します.

grub>  imsmod part_msdos
grub>  insmod ext2
grub>  set root='hd0,msdos2'
grub>  linux /vmlinux
grub>  initrd /initrd.gz
grub>  boot

うまく起動すれば後はいつもの d-i なのでよしなに…….セットアップが終わったらもったいないのでパーティションを操作してセットアップに使った領域をくっつけておきます.

リモートのサーバで暗号化FS を使うといちいちコンソールのVNC を立ち上げないといけなくて面倒という場合には Debian の場合 dropbear-initramfs を導入するとinitramfs で dropbrar(sshd) を利用できるようになり,ssh 経由でロック解除できます.自動化することも可能.

dropbear-initramfs pkg を導入して,/usr/share/doc/dropbear-initramfs/README.initramfs を見ると良いです.

$ sudo apt install dropbear-initramfs
$ sudo install -m 600 /dev/null /etc/dropbear-initramfs/authorized_keys
$ cat ~/.ssh/id_cdsa_remote.pub | sudo tee -a /etc/dropbear-initramfs/authorized_keys
$ sudo update-initramfs -u -k all

UnixBench 測ってみました.500円にしては案外性能いいような.#自宅サーバ(HP ProLiant MicroServer)は 400前後なのに……

Benchmark Run: Sun May 12 2019 22:42:16 - 23:10:29
2 CPUs in system; running 2 parallel copies of tests

Dhrystone 2 using register variables       56736299.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     9687.1 MWIPS (9.2 s, 7 samples)
Execl Throughput                               5257.7 lps   (29.7 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        859332.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          245855.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2105320.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1607890.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 342078.2 lps   (10.0 s, 7 samples)
Process Creation                              11453.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   9834.5 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1400.3 lpm   (60.1 s, 2 samples)
System Call Overhead                        1160557.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   56736299.4   4861.7
Double-Precision Whetstone                       55.0       9687.1   1761.3
Execl Throughput                                 43.0       5257.7   1222.7
File Copy 1024 bufsize 2000 maxblocks          3960.0     859332.6   2170.0
File Copy 256 bufsize 500 maxblocks            1655.0     245855.2   1485.5
File Copy 4096 bufsize 8000 maxblocks          5800.0    2105320.9   3629.9
Pipe Throughput                               12440.0    1607890.0   1292.5
Pipe-based Context Switching                   4000.0     342078.2    855.2
Process Creation                                126.0      11453.5    909.0
Shell Scripts (1 concurrent)                     42.4       9834.5   2319.5
Shell Scripts (8 concurrent)                      6.0       1400.3   2333.9
System Call Overhead                          15000.0    1160557.8    773.7
                                                                   ========
System Benchmarks Index Score                                        1682.8

回線速度も測ってみましたが流石に遅いですね.

近所
$ speedtest-cli --list|head -6|tail -5|cut -d\) -f1|xargs -I{} -n1 speedtest-cli --server {} |egrep '^Hosted|^Download:|Upload:'
Hosted by noris network AG (Nuremberg) [6.35 km]: 15.333 ms
Download: 98.64 Mbit/s
Upload: 4.02 Mbit/s
Hosted by 10G-Server.com (Nuremberg) [7.56 km]: 9.801 ms
Download: 98.59 Mbit/s
Upload: 4.04 Mbit/s
Hosted by Contabo GmbH (Nuremberg) [7.56 km]: 0.764 ms
Download: 99.14 Mbit/s
Upload: 4.04 Mbit/s
Hosted by Maltechx.de (Nuremberg) [7.56 km]: 8.903 ms
Download: 98.27 Mbit/s
Upload: 4.04 Mbit/s
Hosted by TempleServers (Nuremberg) [7.56 km]: 11.996 ms
Download: 98.20 Mbit/s
Upload: 4.08 Mbit/s
東京
$ speedtest-cli --list|grep -i tokyo|cut -d\) -f1|xargs -I{} -n1 speedtest-cli --server {} |egrep '^Hosted|^Download:|Upload:'
Hosted by OPEN Project (via 20G SINET) (Tokyo) [9281.34 km]: 259.654 ms
Download: 57.46 Mbit/s
Upload: 3.67 Mbit/s
Hosted by GLBB Japan (Tokyo) [9281.34 km]: 314.77 ms
Download: 40.50 Mbit/s
Upload: 3.72 Mbit/s
Hosted by i3D.net (Tokyo) [9281.34 km]: 811.767 ms
Download: 48.99 Mbit/s
Upload: 3.71 Mbit/s
Hosted by GIAM PING VIETPN.COM (Tokyo) [9281.34 km]: 309.393 ms
Download: 45.06 Mbit/s
Upload: 3.62 Mbit/s
Hosted by Rakuten Mobile , Inc (Tokyo) [9281.34 km]: 236.677 ms
Download: 61.32 Mbit/s
Upload: 2.45 Mbit/s
Hosted by Love4Taylor (Tokyo) [9281.34 km]: 263.325 ms
Download: 59.33 Mbit/s
Upload: 3.68 Mbit/s

暫く運用して問題無さそうなら国内のサーバを1つ閉じてこちらと役割分担する感じにしようと思います.

pdfファイルから画像を抜き出し( pdfimages or LibreOffice )

ここ2,3日で数回使ったのでメモしておきます.

poppler-utilsのpdfimagesを使う

概要
$ apt show poppler-utils | grep Description: -A99

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Description: PDF 向けユーティリティ (Poppler ベース)
 Poppler は xpdf PDF ビューアを基に作られた PDF 描画ライブラリです。
 .
 本パッケージには (Poppler ベースの) コマンドラインユーティリティが含まれ、
 PDF 文書の情報の取得、他の形式への変換、編集ができます。
  * pdfdetach -- 埋め込みファイル (添付ファイル) の一覧出力または抽出
  * pdffonts -- フォント分析ツール
  * pdfimages -- 画像抽出ツール
  * pdfinfo -- 文書情報
  * pdfseparate -- ページ抽出ツール
  * pdfsig -- デジタル署名の検証
  * pdftocairo -- PDF から PNG/JPEG/PDF/PS/EPS/SVG への Cairo を使った変換ツール
  * pdftohtml -- PDF から HTML への変換ツール
  * pdftoppm -- PDF から PPM/PNG/JPEG 画像への変換ツール
  * pdftops -- PDF から PostScript (PS) への変換ツール
  * pdftotext -- テキストの抽出
  * pdfunite -- 文書の併合ツール
導入
$ sudo apt install poppler-utils
usage
$ pdfimages
pdfimages version 0.69.0
Copyright 2005-2018 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdfimages [options] <PDF-file> <image-root>
  -f <int>       : first page to convert
  -l <int>       : last page to convert
  -png           : change the default output format to PNG
  -tiff          : change the default output format to TIFF
  -j             : write JPEG images as JPEG files
  -jp2           : write JPEG2000 images as JP2 files
  -jbig2         : write JBIG2 images as JBIG2 files
  -ccitt         : write CCITT images as CCITT files
  -all           : equivalent to -png -tiff -j -jp2 -jbig2 -ccitt
  -list          : print list of images instead of saving
  -opw <string>  : owner password (for encrypted files)
  -upw <string>  : user password (for encrypted files)
  -p             : include page numbers in output file names
  -q             : don't print any messages or errors
  -v             : print copyright and version info
  -h             : print usage information
  -help          : print usage information
  --help         : print usage information
  -?             : print usage information
pdfファイル内の画像リスト確認
$ pdfimages ./bicycle_parking.pdf -list
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     340   120  rgb     3   8  image  no         5  0   221   221 9576B 7.8%
   1     1 image     960   720  rgb     3   8  jpeg   yes       14  0   170   170 64.2K 3.2%
pdfファイルから画像抜き出し既定値では.ppm形式
$ pdfimages ./bicycle_parking.pdf ./bicycle_parking-images
$ ls -l ./bicycle_parking-images*
-rw-r--r-- 1 matoken matoken  122415 11月 12 21:40 ./bicycle_parking-images-000.ppm
-rw-r--r-- 1 matoken matoken 2073615 11月 12 21:40 ./bicycle_parking-images-001.ppm
$ identify ./bicycle_parking-images-000.ppm
./bicycle_parking-images-000.ppm PPM 340x120 340x120+0+0 8-bit sRGB 122415B 0.000u 0:00.000
png形式に変換して保存
$ pdfimages ./bicycle_parking.pdf ./bicycle_parking-images -png
$ ls -l ./bicycle_parking-images*
-rw-r--r-- 1 matoken matoken  10274 11月 12 21:46 ./bicycle_parking-images-000.png
-rw-r--r-- 1 matoken matoken 321115 11月 12 21:46 ./bicycle_parking-images-001.png
$ identify ./bicycle_parking-images-000.png
./bicycle_parking-images-000.png PNG 340x120 340x120+0+0 8-bit sRGB 10274B 0.000u 0:00.000
jpegファイルはjpegとして保存(それ以外はppm)
$ pdfimages ./bicycle_parking.pdf ./bicycle_parking-images -j
$ ls -l ./bicycle_parking-images*
-rw-r--r-- 1 matoken matoken 122415 11月 12 21:48 ./bicycle_parking-images-000.ppm
-rw-r--r-- 1 matoken matoken  65695 11月 12 21:48 ./bicycle_parking-images-001.jpg

LibreOfficeでOpenDocumentFormatに変換して画像だけ抜き出し

OpenDocumentFormatはzip形式で圧縮されてその中に画像ファイルも含まれるのでDraw形式に変換して画像ディレクトリの格納されている Pictures だけ展開すると画像が取り出せる.

導入はディストリビューションのほかFlatpack, snapなども公式で配布されているのでお好みで.今回は Debian sid amd64 でapt installしたもの.

$ libreoffice --headless --nologo --nofirststartwizard --convert-to odg ./bicycle_parking.pdf
convert /home/matoken/Downloads/bicycle_parking.pdf -> /home/matoken/Downloads/bicycle_parking.odg using filter : draw8
$ unzip ./bicycle_parking.odg Pictures/*
Archive:  ./bicycle_parking.odg
 extracting: Pictures/10000000000003C0000002D0136E1A08DF8E2B28.jpg
 extracting: Pictures/100000000000015400000078BA7345C344D8D008.png
$ ls -lA Pictures/
合計 80
-rw-r--r-- 1 matoken matoken 10812 11月 12 12:56 100000000000015400000078BA7345C344D8D008.png
-rw-r--r-- 1 matoken matoken 65695 11月 12 12:56 10000000000003C0000002D0136E1A08DF8E2B28.jpg
$ identify Pictures/*
Pictures/100000000000015400000078BA7345C344D8D008.png PNG 340x120 340x120+0+0 8-bit sRGB 10812B 0.000u 0:00.000
Pictures/10000000000003C0000002D0136E1A08DF8E2B28.jpg JPEG 960x720 960x720+0+0 8-bit sRGB 65695B 0.000u 0:00.000

環境

$ dpkg-query -W poppler-utils unzip libreoffice imagemagick
imagemagick     8:6.9.10.14+dfsg-7
libreoffice     1:6.1.3-1
poppler-utils   0.69.0-2
unzip   6.0-21
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64