先日国立国会図書館デジタルコレクションの蔵書の画像をダウンロードして余白をカットして読みやすくしました.jpeg を zip アーカイブにまとめたのですが,PDF ファイルのほうが都合がいいことも.ということで jpeg ファイル群を PDF ファイルに変換しました.
タグ: pdf
Chromiumのheadless環境でPDFがうまく出力されなくなって困った
最近のスライドは Asciidoc で書いて,Reveal.js のhtml に変換して発表,そのhtml をChrome のheadless モードでPDF に変換していました.
こけれを行っていた端末を変更したせいかこれがうまくいかなくなりました.
MComixでPDFファイルを閲覧する
MComixというコミックビュワーがあります.Comixからのフォークです.画像ファイルやアーカイブファイルの画像を見るのに適していて所謂自炊ファイルを開くのにも便利です.
以下のようにPDFにも対応しているのですが,実際に開こうとするとエラーとなりました.
Nextcloudでurl共有したpdfをwebに埋め込みたい その2
ドキュメント共有サイトの無料枠を使うのが辛くなったのでNextcloudのURL共有でどうにかならないかなと思っています.
まずはpdfファイルをobjectタグで埋め込む方法を試しました.
この方法のデメリットはcgiを用意しないといけない,pdfを読む気がなくてもページを読み込むとpdfファイルがダウンロードされてしまいページ容量が大きくなってしまう.そしてNextcloudに「<pdfファイル名> が公開リンクからダウンロードされました」という通知がたくさん届いてしまいちょっとうるさいといった感じです.
途中のcgiでキャッシュしてプレビュー用の画像を用意してwebにはそのプレビュー画像を表示しておけばいいのではとcgiを書き換えていました.headで引っ張ってもダウンロードされた扱いになるしdbから実ファイルの場所を探してそこからダウンロードするように,サムネイルもdbから引っ張ってこれるかな?とかやってましたがふとそれだと標準の機能で出来るのではと気づいたので試してみました.
pdf共有URLの末尾に /preview
を付けるとプレビュー画像が表示されます.(標準では50MB以下のファイルの場合)
Note
|
共有URLが https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ のときのプレビュー画像URL https://files.matoken.org/index.php/s/r7jEJdjiSRzb4nZ/preview |
これを利用してこんな感じに書くと,
[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%]]
<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">
— <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
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
Nextcloudでurl共有したpdfをwebに埋め込みたい
スライドやドキュメントを共有するのにSpeakerDeckやedockrを使っています.(SlideShareは無料アカウントで再アップロードができなくなってしまってから使わなくなりました.)
SpeakerDeckの無料での制限で100アップロードまででそろそろいっぱい,edockrはしばらくしたら消えてしまうということを最近知りました.
@edocr Uploaded documents are disappearing by themselves. Is this a specification of the Free plan?https://t.co/3X6WwOYcID
— matoken (@matoken1) March 5, 2021
Yes, sorta. There are 3 parts of the edocr service: Sharing, SEO indexing & Storage. Sharing is free. So, inactive documents in free accounts are deleted over time by our algorithms. The cost of Premium is so low we assume if people cared they would sign up. <9 cents/doc/year.
— edocr (@edocr) March 5, 2021
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などはちゃんとしてていいですね.
とりあえずはリンクで共有かな?
オライリージャパンで公開されている「GNU Make 第3版」のpdfをダウンロードして1つのpdfファイルにまとめる
以下のTweetで知ったので
これは注文した後にオライリーのサイトで無料で公開されてるのを見つけて届くまでに読み終わった本👼 pic.twitter.com/Rb86ipy4Kh
— tokkyo (@tokkyo) January 24, 2021
読んでみようと以下のページからダウンロードしようとしたら章ごとにファイルが分割されていました.
ダウンロードして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
- pdfファイルをダウンロード
- 表紙画像をダウンロード
- 表紙画像をpdfに変換
- pdftkで全ファイルを結合
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
Google Chrome / Chromium で PDFを自動的に開く代わりにダウンロードするようにする
Google Chrome / Chromium で PDF ファイルをクリックすると既定値では組み込み PDFビュワーで開かれます.しかし,情報漏えいが起こるようです.
2019/3/1時点で未修正。
修正されるまでAdobe製のPDFリーダーの利用を推奨。
2019年4月下旬ころ修正の予定と発見者は報告。
ということで暫く治らないようです.自分は JavaScript を基本的に無効にしているので PDFドキュメントは開かれていないように見えますが不安なので無効にする設定を探してみました.
chrome://settings/content/pdfDocuments
にアクセスして「PDF ファイルを Chrome で自動的に開く代わりにダウンロードする」のチェックを On にする.
これで次から 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
pdfファイルから画像を抜き出し( pdfimages or LibreOffice )
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
$ 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
$ 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%
$ 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
$ 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
$ 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