pdf – matoken's blog https://matoken.org/blog Is there no plan B? Fri, 05 Dec 2025 11:27:53 +0000 ja hourly 1 https://wordpress.org/?v=7.0.2 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg pdf – matoken's blog https://matoken.org/blog 32 32 pdfファイルを直接grepできるpdfgrep https://matoken.org/blog/2025/12/05/pdfgrep/ https://matoken.org/blog/2025/12/05/pdfgrep/#respond Fri, 05 Dec 2025 11:27:51 +0000 https://matoken.org/blog/?p=4794

Terminal Trove でpdfgrep というツールを知ったので試してみました.

pdfgrep はpdf ファイルをgrep と同様パターンにマッチする行を表示してくれるものです.オプションは GNU grep をある程度踏襲しています.

Debian sid 環境でsource からbuild する例
$ sudo apt install libgcrypt20-dev libpoppler-cpp-dev
$ git clone https://gitlab.com/pdfgrep/pdfgrep
$ cd pdfgrep
$ ./autogen.sh
$ ./configure --prefix=$HOME/usr/local
$ make
$ make install
help
$ pdfgrep --help
Usage: ./src/pdfgrep [OPTION]... PATTERN FILE...

Search for PATTERN in each FILE.
PATTERN is, by default, an extended regular expression.

Commonly used options:
 -i, --ignore-case              Ignore case distinctions
 -P, --perl-regexp              Use Perl compatible regular expressions (PCRE)
 -H, --with-filename            Print the file name for each match
 -h, --no-filename              Suppress the prefixing of file name on output
 -n, --page-number              Print page number with output lines
 -c, --count                    Print only a count of matches per file
     --color WHEN               Use colors for highlighting;
                                WHEN can be `always', `never' or `auto'
 -p, --page-count               Print only a count of matches per page
 -m, --max-count NUM            Stop reading after NUM matching lines (per file)
 -q, --quiet                    Suppress normal output
 -r, --recursive                Search directories recursively
 -R, --dereference-recursive    Likewise, but follow all symlinks
     --cache                    Use cache for faster operation
     --help                     Print this help
 -V, --version                  Show version information

The above list is only a selection of commonly used options. Please refer
to the man page for a complete list.
適当なpdf ファイルをgrep
$ pdfgrep raspberry ~/Downloads/MagPi128.pdf | head
raspberrypi.com
                       magpi@raspberrypi.com
                       forums.raspberrypi.com
                                                     lucy@raspberrypi.com
                                                     rob@raspberrypi.com
                                                     charlotte.milligan@raspberrypi.com
                                                     brian.jepson@raspberrypi.com
 Learn Sense HAT             magpi@raspberrypi.com             (CC BY-NC-SA 3.0).
GNU grep でよく使うオプションを利用
$ pdfgrep -m5 -n -i raspberry ~/Downloads/MagPi128.pdf
1:Issue 128     April 2023   magpi.cc    The official Raspberry Pi magazine
1:   Discover coding with Raspberry Pi
1:            NEW! RASPBERRY PI GLOBAL SHUTTER CAMERA
2: Industrial Raspberry Pi
3:(page 44) can help you out on this journey. I hope you take it.                 Raspberry Pi office
                                     This Month in Raspberry Pi
日本語もok
$ pdfgrep -r -m1 -n サーバー ~/Nextcloud_matoken\@files.matoken.org/Linux/2025/
/home/matoken/Nextcloud_matoken@files.matoken.org/Linux/2025//sakura-cominuty-2025/snac-kagolug.pdf:2:サーバー設定ファイルの server.json を編集します。 "protocol" を
/home/matoken/Nextcloud_matoken@files.matoken.org/Linux/2025//kagolug2025.08/slide/slide.pdf:1:  ルサーバーの
/home/matoken/Nextcloud_matoken@files.matoken.org/Linux/2025//kagolug2025.09/slide/slide.pdf:19:ActivityPubも少し探したが,自分とサーバーの落ちているものしか
/home/matoken/Nextcloud_matoken@files.matoken.org/Linux/2025//kagolug2025.09/slide/matoken-slide.pdf:19:ActivityPubも少し探したが,自分とサーバーの落ちているものしか
/home/matoken/Nextcloud_matoken@files.matoken.org/Linux/2025//kagolug2025.10/slide/slide.pdf:10:     2     サーバー設定ファイルを編集."protocol" を "http"

オプションの詳細は以下を.

これまではpdf ファイルをpdftotext などでテキストに変換しつつgrep などしていましたがこれだとどのページ化が分かりづらかったです.pdfgrep だと -n オプションが行数ではなくページ数になるのでこのあたりがわかりやすくなって良さそうです.

$ pdftotext ~/Downloads/RetroBSD_and_LiteBSD.pdf - | grep -m5 -n -i retro
1:RetroBSD and LiteBSD:
15:  Contributing to RetroBSD since 2013
30:  RetroBSD: an OS from the past in 128k RAM
35:
   RetroBSD and LiteBSD: an overview
39:  RetroBSD: PIC32MX
$ pdfgrep -m5 -n -i retro ~/Downloads/RetroBSD_and_LiteBSD.pdf
1:RetroBSD and LiteBSD:
3:  Contributing to RetroBSD since 2013
4:  RetroBSD: an OS from the past in 128k RAM
5:RetroBSD and LiteBSD: an overview
5:     RetroBSD: PIC32MX

と,一通り遊んでから気づいたのですが,debian にはpdfgrep パッケージが結構前から存在していました.

$ apt-cache search pdfgrep
pdfgrep - 正規表現にマッチする文字列を pdf ファイル内で検索
$ rmadison pdfgrep
pdfgrep    | 2.1.2-1       | oldoldstable   | source, amd64, arm64, armhf, i386
pdfgrep    | 2.1.2-1       | oldstable      | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
pdfgrep    | 2.2.0-0.1     | stable         | source
pdfgrep    | 2.2.0-0.1     | testing        | source
pdfgrep    | 2.2.0-0.1     | unstable       | source
pdfgrep    | 2.2.0-0.1     | unstable-debug | source
pdfgrep    | 2.2.0-0.1+b2  | stable         | amd64, arm64, armel, armhf, i386, ppc64el, riscv64, s390x
pdfgrep    | 2.2.0-0.1+b2  | testing        | amd64, arm64, armhf, i386, ppc64el, riscv64, s390x
pdfgrep    | 2.2.0-0.1+b2  | unstable       | amd64, arm64, armhf, i386, ppc64el, riscv64, s390x
$ sudo apt install pdfgrep
$ /usr/bin/pdfgrep -V
This is pdfgrep version 2.2.0.

Using poppler version 25.03.0
Using libpcre2 version 10.46 2025-08-27
環境
$ pdfgrep -V
This is pdfgrep version 2.2.0.

Using poppler version 25.03.0
Using libpcre2 version 10.46 2025-08-27
Built from git-commit v2.2.0-7-gaa71955
$ /usr/bin/pdfgrep -V
This is pdfgrep version 2.2.0.

Using poppler version 25.03.0
Using libpcre2 version 10.46 2025-08-27
$ dpkg-query -W poppler-utils
poppler-utils   25.03.0-11.1+b1
$ pdftotext -v
pdftotext version 25.03.0
Copyright 2005-2025 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011, 2022 Glyph & Cog, LLC
$ lsb_release -dr
Description:    Debian GNU/Linux forky/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2025/12/05/pdfgrep/feed/ 0
jpeg 画像群を PDF ファイルに変換(ImageMagick, imgpdf) https://matoken.org/blog/2024/05/09/images-to-pdf/ https://matoken.org/blog/2024/05/09/images-to-pdf/#respond Thu, 09 May 2024 10:16:12 +0000 https://matoken.org/blog/?p=4023

先日国立国会図書館デジタルコレクションの蔵書の画像をダウンロードして余白をカットして読みやすくしました.jpeg を zip アーカイブにまとめたのですが,PDF ファイルのほうが都合がいいことも.ということで jpeg ファイル群を PDF ファイルに変換しました.

ImageMagick の convert コマンドを使うとメモリ不足で失敗,ポリシーファイルの /etc/ImageMagick-6/policy.xml でメモリリソースを 1GB から 4GB に設定しても失敗して8GB に設定してやっと処理が出来ました.

$ convert  2530201/* 宇宙船ビーグル号の冒険.pdf (1)
  :
convert-im6.q16: cache resources exhausted `2530201/2530201-107.jpg' @ error/cache.c/OpenPixelCache/4119.
convert-im6.q16: TooManyExceptions (exception processing is suspended) @ warning/exception.c/ThrowException/1054.
convert-im6.q16: cache resources exhausted `2530201/2530201-108.jpg' @ error/cache.c/OpenPixelCache/4119.
$ identify -list resource (2)
Resource limits:
  Width: 32KP
  Height: 32KP
  List length: unlimited
  Area: 256MP
  Memory: 1GiB
  Map: 2GiB
  Disk: 2GiB
  File: 768
  Thread: 4
  Throttle: 0
  Time: unlimited
$ identify -limit memory 4096MiB -list resource | grep ^\ \ Memory: (3)
  Memory: 1GiB
$ identify -limit memory 512MiB -list resource | grep ^\ \ Memory: (4)
  Memory: 512MiB
$ sudo git -C /etc diff /etc/ImageMagick-6/policy.xml (5)
diff --git a/ImageMagick-6/policy.xml b/ImageMagick-6/policy.xml
index 4b878ce..aa54cbe 100644
--- a/ImageMagick-6/policy.xml
+++ b/ImageMagick-6/policy.xml
@@ -95,7 +95,7 @@
   <!-- Set maximum amount of memory in bytes to allocate for the pixel cache
        from the heap. When this limit is exceeded, the image pixels are cached
        to memory-mapped disk. -->
-  <policy domain="resource" name="memory" value="1024MiB"/>
+  <policy domain="resource" name="memory" value="4096MiB"/>
   <!-- Set maximum amount of memory map in bytes to allocate for the pixel
        cache. When this limit is exceeded, the image pixels are cached to
        disk. -->
$ identify -list resource | grep ^\ \ Memory: (6)
  Memory: 4GiB
  1. ImageMagick の convert コマンドで PDF ファイルに変換したが途中で失敗
  2. ImageMagick の リソースを確認
  3. limit memory で大きくは出来ない
  4. limit memory で小さくは出来る
  5. ImageMagick のポリシーファイルを編集してメモリ利用可能量を増やした
  6. メモリ利用可能量が増えたのを確認

いちおうこれで返還でしましたが,このメモリ利用量と変換時間は大きすぎるので他の方法を探しました.

img2pdf というコマンドを見つけました.このコマンドは可能ならロスレスで画像を PDF ファイルに変換してくれるので高速(かつ省リソースなはず)で処理できそうです.

導入はディストリビューションパッケージから.実行速度もとても早かったです.

$ sudo apt install img2pdf (1)
$ img2pdf -o 宇宙船ビーグル号の冒険-img2pdf.pdf 2530201/* (2)
find 2530201 -type f -print0 | sort -Vz | xargs -0 img2pdf -o 宇宙船ビーグル号の冒険.pdf (3)
  1. img2pdf パッケージを導入
  2. PDF に変換
  3. 画像ファイル名で並べ替えて標準入力から画像ファイルリストを渡し,PDF ファイルに

変換時間の比較です.convert が異様に遅いですが,これはスワップを使ってしまっているのも大きいと思われ,メモリの大きいマシンだともっと早くなると思います.

$ time convert 2530201/* 宇宙船ビーグル号の冒険.pdf

real    5m18.636s
user    0m47.748s
sys     0m31.136s
$ time img2pdf -o 宇宙船ビーグル号の冒険-img2pdf.pdf 2530201/*

real    0m1.279s
user    0m0.556s
sys     0m0.180s

実際の画像も特に問題なさそうだし,ファイルサイズもほとんど変わりませんでした.

単純に画像を PDF ファイルに変換する時は img2pdf コマンドを使うのが良さそうです.

環境
$ dpkg-query -W imagemagick img2pdf
imagemagick     8:6.9.12.98+dfsg1-5.2
img2pdf 0.5.1-1
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
Codename:       trixie
$ arch
x86_64
]]>
https://matoken.org/blog/2024/05/09/images-to-pdf/feed/ 0
Chromiumのheadless環境でPDFがうまく出力されなくなって困った https://matoken.org/blog/2022/11/29/pdf-is-no-longer-output-well-in-chromiums-headless-environment/ https://matoken.org/blog/2022/11/29/pdf-is-no-longer-output-well-in-chromiums-headless-environment/#respond Mon, 28 Nov 2022 23:18:14 +0000 http://matoken.org/blog/?p=3782

最近のスライドは Asciidoc で書いて,Reveal.js のhtml に変換して発表,そのhtml をChrome のheadless モードでPDF に変換していました.
こけれを行っていた端末を変更したせいかこれがうまくいかなくなりました.

引数はこんな感じで

               chromium --user-data-dir=$TMPDIR --headless --disable-gpu --print-to-pdf="${PDF}" "$URL?print-pdf"; \

出力されるPDFはCSSが足りないようなものや,真っ白なものになります.

revealjs2pdf01
revealjs2pdf02

make から呼んでいるので手動でコマンドラインから実行しても同じ, --headless オプションを削って手動で Ctrl + p でPDF 出力すれば問題なく出力されます.

Firefox にはPDF 出力オプションはないのですが画像出力ができるので画像書き出しをしてみると求める結果になりました.

$ firefox --screenshot /tmp/page.png --window-size=1280 "file:///`pwd`/slide.html#print-pdf"

各ページをこれで画像に出力して結合してPDFにすることも可能ですが,文字情報が消えてしまいます…….

wkhtmltopdf も試すと以下のようなコマンドで近いものが出来ますがサイズや余白,フォントが違います.もう少し頑張れば良く出来そう?

$ wkhtmltopdf --enable-local-file-access --orientation Landscape --page-size B5 --margin-top 0 --margin-bottom 0 --margin-right 0 --margin-left 0 "file://`pwd`/slide/slide.html?print-pdf" /tmp/slide.pdf

検索して以下のページを見つけました.

こちらを参考にChromium に --run-all-compositor-stages-before-draw--virtual-time-budget を指定するようにして書き出せるようになりました. --virtual-time-budget の値については環境により変える必要があるかもしれません.

$ chromium --headless --run-all-compositor-stages-before-draw --virtual-time-budget=9999999 --print-to-pdf=/tmp/slide.pdf file://`pwd`/slide/slide.html?print-pdf

Makefile は以下のように変更.

-               chromium --user-data-dir=$TMPDIR --headless --disable-gpu --print-to-pdf="${PDF}" "$URL?print-pdf"; \
+               chromium --user-data-dir=$TMPDIR --headless --run-all-compositor-stages-before-draw --virtual-time-budget=999999 --print-to-pdf="${PDF}" "$URL?print-pdf"; \

書き出せるようになりました :)

環境
$ dpkg-query -W chromium firefox-esr wkhtmltopdf
chromium        107.0.5304.110-2
firefox-esr     102.5.0esr-1
wkhtmltopdf     0.12.6-2+b1
$ lsb_release -dc
No LSB modules are available.
Description:    Debian GNU/Linux bookworm/sid
Codename:       bookworm
$ arch
x86_64
]]>
https://matoken.org/blog/2022/11/29/pdf-is-no-longer-output-well-in-chromiums-headless-environment/feed/ 0
MComixでPDFファイルを閲覧する https://matoken.org/blog/2022/08/10/view-pdf-files-with-mcomix/ https://matoken.org/blog/2022/08/10/view-pdf-files-with-mcomix/#respond Tue, 09 Aug 2022 22:42:07 +0000 http://matoken.org/blog/?p=3759

MComixというコミックビュワーがあります.Comixからのフォークです.画像ファイルやアーカイブファイルの画像を見るのに適していて所謂自炊ファイルを開くのにも便利です.

以下のようにPDFにも対応しているのですが,実際に開こうとするとエラーとなりました.

Reads most common image formats, as well as PDF, ZIP, RAR, 7Z and LHA archives directly.

mcomix pdf error

READMEを確認すると,Dependenciesに以下のようなことが書かれていました.

To read PDF files, MComix can use the tools provided by MuPDF, namely
mutool and mudraw.

PDFの閲覧にはMuPDFのmutoolとmudrawが必要なようです.
Debian ではmupdf-toolsパッケージでmutoolが導入できます.mudrawがありませんが,最近はmutool drawになっているようなのmupdf-toolsパッケージの導入だけでよさそうです.

$ sudo apt install mupdf-tools

mcomixとmupdf-toolsの導入された状態でMComixを起動し,PDFファイルを開くとちゃんと開けるようになりました :)
以下よく使うショートカットです.

f
フルスクリーントルグ
b
ベストフィットモード(画面に合わせて画像をフィット)
w
画面横サイズにフィット
h
画面縦サイズにフィット
d
シングルページ,見開きページトルグ
m
右開き,左開きトルグ

見開きで眺めて文字の小さな部分はシングルページにして横幅にフィットさせて読むという感じで使っています.

Note
ちなみに,RARのアーカイブを開きたい場合は unrara or rar を,7Zipのアーカイブを開きたい場合は 7z を,lhzのアーカイブを開きたい場合は lha の導入が必要なようです.必要なものがある場合は入れておきましょう.
環境
$ dpkg-query -W mupdf-tools mcomix
mcomix  1.2.1mcomix3+git20200206-1
mupdf-tools     1.20.0+ds1-1
$ lsb_release -dr
Description:    Debian GNU/Linux bookworm/sid
Release:        unstable
$ arch
x86_64
]]>
https://matoken.org/blog/2022/08/10/view-pdf-files-with-mcomix/feed/ 0
Nextcloudでurl共有したpdfをwebに埋め込みたい その2 https://matoken.org/blog/2021/03/17/i-want-to-embed-nextcloud-pdf-shared-url-on-the-web-part-2/ https://matoken.org/blog/2021/03/17/i-want-to-embed-nextcloud-pdf-shared-url-on-the-web-part-2/#comments Wed, 17 Mar 2021 12:48:59 +0000 http://matoken.org/blog/?p=3111

ドキュメント共有サイトの無料枠を使うのが辛くなったのでNextcloudのURL共有でどうにかならないかなと思っています.
まずはpdfファイルをobjectタグで埋め込む方法を試しました.

この方法のデメリットはcgiを用意しないといけない,pdfを読む気がなくてもページを読み込むとpdfファイルがダウンロードされてしまいページ容量が大きくなってしまう.そしてNextcloudに「<pdfファイル名> が公開リンクからダウンロードされました」という通知がたくさん届いてしまいちょっとうるさいといった感じです.

途中のcgiでキャッシュしてプレビュー用の画像を用意してwebにはそのプレビュー画像を表示しておけばいいのではとcgiを書き換えていました.headで引っ張ってもダウンロードされた扱いになるしdbから実ファイルの場所を探してそこからダウンロードするように,サムネイルもdbから引っ張ってこれるかな?とかやってましたがふとそれだと標準の機能で出来るのではと気づいたので試してみました.

pdf共有URLの末尾に /preview を付けるとプレビュー画像が表示されます.(標準では50MB以下のファイルの場合)

これを利用してこんな感じに書くと,

AsciiDocでの例
[quote,'link:https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ[https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ]']
link:https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ[image:https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ/preview[width=100%]]
htmlへ変換した例
<div class="quoteblock">
<blockquote>
<a href="https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ"><span class="image"><img src="https://files.matoken.org/index.php/s/r7jEJdjiSRzb4
nZ/preview" alt="preview" width="100%"></span></a>
<div class="attribution">
&#8212; <a href="https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ">https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ</a>
</div>
</blockquote>
</div>

こういうふうになりました.クリックするとNextcloudのpdfファイルプレビュー画面が開かれ,最近のモダンウェブブラウザではそのまま閲覧できます.

SpeakerDeckなんかでは埋め込んだページでそのまま読むことも出来ますがとりあえずこれならcgiも必要なくNextcloudの標準機能だけ(恐らくNC13以降で可能)でいけるのでそこそこいい感じではないかなと思います.

環境
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64
]]>
https://matoken.org/blog/2021/03/17/i-want-to-embed-nextcloud-pdf-shared-url-on-the-web-part-2/feed/ 1
ImageMagickでpdfファイルの1ページ目だけをjpegにする https://matoken.org/blog/2021/03/16/make-the-first-page-of-the-pdf-file-jpeg-with-imagemagick/ https://matoken.org/blog/2021/03/16/make-the-first-page-of-the-pdf-file-jpeg-with-imagemagick/#respond Tue, 16 Mar 2021 14:25:28 +0000 http://matoken.org/blog/?p=3104

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
]]>
https://matoken.org/blog/2021/03/16/make-the-first-page-of-the-pdf-file-jpeg-with-imagemagick/feed/ 0
Nextcloudでurl共有したpdfをwebに埋め込みたい https://matoken.org/blog/2021/03/15/i-want-to-embed-url-shared-on-nextcloud-pdf-on-the-web/ https://matoken.org/blog/2021/03/15/i-want-to-embed-url-shared-on-nextcloud-pdf-on-the-web/#comments Sun, 14 Mar 2021 15:46:40 +0000 http://matoken.org/blog/?p=3083

スライドやドキュメントを共有するのにSpeakerDeckやedockrを使っています.(SlideShareは無料アカウントで再アップロードができなくなってしまってから使わなくなりました.)
SpeakerDeckの無料での制限で100アップロードまででそろそろいっぱい,edockrはしばらくしたら消えてしまうということを最近知りました.

pdfファイルを共有するだけならNextcloudでのURL共有を使えばいいのですが,webに埋め込むことが出来ません.Nextcloudの機能やアプリにそういったものがあるといいのですが,セキュリティの問題から実装されていません.

とりあえず雑な方法ですが,こんな感じで実現してみました.

Nextcloud URL共有リンクからpdfファイルを出力する

Nextcloudの公開URLの内容をpdfとして出力します.実行権を付けてcgiとして設定します.

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use IO::Handle;
STDOUT->autoflush(1);

$ARGV[0] = "" unless defined $ARGV[0];
my $url = $ARGV[0];
if( $url !~ /\/download$/ ){
  $url = $url . "/download";
}
print "Content-Type: application/pdf\n\n";
getprint($url);

とりあえずこんな感じでcgiの後ろにNextcloud公開URLを付けてアクセスするとブラウザでpdfを見ることができるようになりました.

embedタグでwebに埋め込む

上で作ったcgiをobjectタグで埋め込んでみるととりあえず埋め込みが出来ました.このとき height% を指定してもサイズが変わらないようでした.(Debian sid amd64 の chromium 88.0.4324.146-1, firefox 86.0.1-1 で確認)

<embed src="http://cgi.example.com/pdf.cgi?http://nextcloud.example.com/index.php/s/XXXXXXXXXXXXXXX" type="application/pdf" width="640px" height="480px">

とりあえずそれっぽいことは出来ましたが,この方法ではpdfを読まなくてもページ読み込み時にpdfを全部読み込んでしまうようなのであまりよろしくない感じです.このあたりはSpeakerdeckなどはちゃんとしてていいですね.

とりあえずはリンクで共有かな?

]]>
https://matoken.org/blog/2021/03/15/i-want-to-embed-url-shared-on-nextcloud-pdf-on-the-web/feed/ 2
オライリージャパンで公開されている「GNU Make 第3版」のpdfをダウンロードして1つのpdfファイルにまとめる https://matoken.org/blog/2021/01/26/download-the-pdf-of-gnu-make-3rd-edition-published-on-oreilly-japan-and-combine-it-into-one-pdf-file/ https://matoken.org/blog/2021/01/26/download-the-pdf-of-gnu-make-3rd-edition-published-on-oreilly-japan-and-combine-it-into-one-pdf-file/#comments Mon, 25 Jan 2021 23:28:37 +0000 http://matoken.org/blog/?p=2951

以下のTweetで知ったので

読んでみようと以下のページからダウンロードしようとしたら章ごとにファイルが分割されていました.

ダウンロードしてpdftkで結合して1つのファイルにまとめてみました.

$ w3m -o display_link_number=1 https://www.oreilly.co.jp/library/4873112699/ | grep \\.pdf$ | grep -v catalog | cut -f2 -d\  | wget --wait=30 --random-wait -i - (1)
$ wget https://www.oreilly.co.jp/books/images/picture_large4-87311-269-9.jpeg (2)
$ convert ./picture_large4-87311-269-9.jpeg ./hyoushi.pdf (3)
$ ls *.pdf
appA.pdf  ato.pdf   ch03.pdf  ch06.pdf  ch09.pdf  ch12.pdf      index.pdf
appB.pdf  ch01.pdf  ch04.pdf  ch07.pdf  ch10.pdf  contents.pdf  mae.pdf
appC.pdf  ch02.pdf  ch05.pdf  ch08.pdf  ch11.pdf  hyoushi.pdf   maegaki.pdf
$ pdftk ./hyoushi.pdf ./mae.pdf ./maegaki.pdf ./contents.pdf ./ch01.pdf ./ch02.pdf ./ch03.pdf ./ch04.pdf ./ch05.pdf ./ch06.pdf ./ch07.pdf ./ch08.pdf ./ch09.pdf ./ch10.pdf ./ch11.pdf ./ch12.pdf ./appA.pdf ./appB.pdf ./appC.pdf ./index.pdf ./ato.pdf cat output "./GNU Make 第3版.pdf" (4)
$ pdfinfo ./GNU\ Make\ 第3版.pdf
Creator:        pdftk-java 3.1.1
Producer:       itext-paulo-155 (itextpdf.sf.net-lowagie.com)
CreationDate:   Tue Jan 26 07:56:56 2021 JST
ModDate:        Tue Jan 26 07:56:56 2021 JST
Tagged:         no
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          298
Encrypted:      no
Page size:      516 x 660 pts
Page rot:       0
File size:      20356655 bytes
Optimized:      no
PDF version:    1.6
$ rm ./hyoushi.pdf ./mae.pdf ./maegaki.pdf ./contents.pdf ./ch01.pdf ./ch02.pdf ./ch03.pdf ./ch04.pdf ./ch05.pdf ./ch06.pdf ./ch07.pdf ./ch08.pdf ./ch09.pdf ./ch10.pdf ./ch11.pdf ./ch12.pdf ./appA.pdf ./appB.pdf ./appC.pdf ./index.pdf ./ato.pdf
  1. pdfファイルをダウンロード
  2. 表紙画像をダウンロード
  3. 表紙画像をpdfに変換
  4. pdftkで全ファイルを結合
Oreilly GNU MAKE V3

pdftkはsnapでも導入できるそうです.

環境
$ dpkg-query -W pdftk imagemagick wget w3m
imagemagick     8:6.9.11.58+dfsg-1
pdftk   2.02-5+b1
w3m     0.5.3+git20210102-2
wget    1.21-1+b1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

]]>
https://matoken.org/blog/2021/01/26/download-the-pdf-of-gnu-make-3rd-edition-published-on-oreilly-japan-and-combine-it-into-one-pdf-file/feed/ 1
Google Chrome / Chromium で PDFを自動的に開く代わりにダウンロードするようにする https://matoken.org/blog/2019/03/05/make-sure-to-download-pdf-instead-of-automatically-opening-in-google-chrome-chromium/ https://matoken.org/blog/2019/03/05/make-sure-to-download-pdf-instead-of-automatically-opening-in-google-chrome-chromium/#respond Tue, 05 Mar 2019 14:26:46 +0000 http://matoken.org/blog/?p=2312 Google Chrome / Chromium で PDF ファイルをクリックすると既定値では組み込み PDFビュワーで開かれます.しかし,情報漏えいが起こるようです.

2019/3/1時点で未修正。
修正されるまでAdobe製のPDFリーダーの利用を推奨。
2019年4月下旬ころ修正の予定と発見者は報告。

ということで暫く治らないようです.自分は JavaScript を基本的に無効にしているので PDFドキュメントは開かれていないように見えますが不安なので無効にする設定を探してみました.

chrome://settings/content/pdfDocuments
にアクセスして「PDF ファイルを Chrome で自動的に開く代わりにダウンロードする」のチェックを On にする.

20190305-22-03-01-12486.jpg

これで次から PDF ファイルへのリンクで自動的にダウンロードされるようになる.

#Okuar の JavaScript 無効化の設定が見当たらない……

環境

$ dpkg-query -W google-chrome-stable chromium
chromium        72.0.3626.121-1
google-chrome-stable    72.0.3626.121-1
$ lsb_release -dr
Description:    Debian GNU/Linux buster/sid
Release:        unstable
$ uname -m
x86_64

]]>
https://matoken.org/blog/2019/03/05/make-sure-to-download-pdf-instead-of-automatically-opening-in-google-chrome-chromium/feed/ 0
pdfファイルから画像を抜き出し( pdfimages or LibreOffice ) https://matoken.org/blog/2018/11/12/extract-images-from-pdf-file-pdfimages-or-libreoffice/ https://matoken.org/blog/2018/11/12/extract-images-from-pdf-file-pdfimages-or-libreoffice/#comments Mon, 12 Nov 2018 13:11:58 +0000 http://matoken.org/blog/?p=2253 ここ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

]]>
https://matoken.org/blog/2018/11/12/extract-images-from-pdf-file-pdfimages-or-libreoffice/feed/ 1