2023/01/07

【Python】複数枚のPNG画像をJPEGに圧縮してPDFに変換する

過去に何度もimg2pdfを利用した複数画像からPDFへの変換を記事にしていますが、本記事ではPNG画像をJPEG画像に圧縮してからPDFに変換する方法を試します。
PNG画像とJPEG画像の特性については解説しませんが、PDFにした時のファイルサイズの削減が目的です。 変換処理を挟むので、処理時間が増加しますがファイルサイズ低減のメリットが大きければ採用する価値があると思います。
以前の記事に倣って、またいくつかの手法を比較しました。

実行環境は、以下の通りです。
------
MacBook Air (M2, 2022, メモリ:16 GB)
Python 3.10.9
img2pdf 0.4.4
Pillow 9.3.0


Method1 : 画像変換によって圧縮してからPDFにする(PNG画像→JPEG画像→PDF):本記事のタイトルの手法

Method2 : img2pdfをだけ使う(PNG画像→PDF, ロスレス):以前の記事の中で書いたもの

Method3 : Pillowだけを使う(PNG画像→PDF, 圧縮):以前の記事の中で書いたもの

Method4 : Pillowだけを使う(PNG画像→PDF, 圧縮):Method3をconcurrent.futuresで並列化(Method1でもconcurrent.futuresを使用して並列化による高速化を試したため比較)

10個の異なるpng画像ファイル群での出力ファイルサイズと実行時間の比較は、以下の通りです。

Method1とMethod2の比較から分かりますが、JPEGに一度変換することでファイルサイズが小さくなり、処理速度も上がっています。
Method3とMethod4では、ファイル変換処理は同じなので当然出力ファイルサイズは同じですが、Method3とMethod4の比較から並列化の効果が分かります。今回使用した環境では、だいたい半分の時間で処理できています。


img2pdfで扱えないアルファチャンネルのある透過PNG画像も、Method1を使えば取り扱えそうです。

2022/12/16

【Python】画像のみの固定レイアウトのePubをPDFに変換する

だいぶ前から漫画などの固定レイアウトEpubを目次付きPDFに変換するプログラムをPythonで作りたい、ということで色々と検討してきました。 前回前々回の記事で紹介した内容になりますが、PythonのライブラリのEbookLibimg2pdfが使い勝手が良さそうだということがわかりました。

そこで本記事では、流行りの「ChatGPT」に、プログラムを作成してもらいました。
「画像のみの固定レイアウトepubを、PDFに変換するプログラムをPythonのebooklibとimg2pdfを使って作成してください」とチャットに送信した結果、以下の動画のようになりました。実際には、複数回実行して、ある程度欲しい結果になるまで繰り返し実行しています。



ChatGPTに何回か出力させたプログラムを組み合わせて、さらに足りてない部分などを加えて、修正したものが以下になります。


かなり実行速度が速く、体感的には一瞬で変換してくれました。まだ、目次の移植や右綴じへの変換などは出来ていないので、追々検討しようと思います。

ChatGPTが、吐き出したプログラムが実際には動かないプログラムというケースもありますが、今回の事例では良い精度で実行したい内容を動くプログラムにしてくれたので驚いています。 今後は、知りたいことを検索エンジンで似たようなことをやっている記事を探すのではなく、チャットで正解例を教わるような時代になるのでしょうか?
今後の進展が気になります。

追記:2022/12/18
pikepdfで右綴じにする部分を追加しました。

追記:2023/01/09
ePubからの目次を移植する部分を追加しました。
追追記:2023/02/24
Ebooklibを使わずに、BeautifulSoupを使うバージョンを作成しました。
コマンドライン実行を想定していて、綴じ方なども指定できるように変更しました。


今後は、逆に画像のみのPDFから固定レイアウトのePubへの変換プログラム作成に取り組みたいと思います。

2022/11/22

【Python】DEMデータをvtkに変換して、ParaViewで表示する

ParaViewは、2次元・3次元データの可視化のためのオープンソースソフトウェアです。可視化機能が強力でフリーで使えるため人気があります。
Pythonの可視化ライブラリには、matplotlibやplotlyなどがありますが、基本的には2次元までデータの可視化向きで、3次元データの可視化にはParaViewを使った方が動作も軽いです。

本記事では、以前の記事と同様に、国土地理院の基盤地図情報(数値標高モデル)のDEMデータから変換したGeoTIFFを用いました。DEMデータの結合方法やGDALの導入については、本記事でも割愛します。
また今回は、3次元表示に当たり軸の単位が揃っていた方が都合が良いため、GeoTIFFへの変換時にUTM座標に変換したデータを用いました。

実行環境:MacBook Air(M2、2022、メモリ:16GB)

ParaViewでは、GeoTIFF形式のDEMデータも読み込めるようですが、下記の例では、DEMデータの指定範囲での切り出しや解像度変更、vtk(Visualization Toolkit)形式への変換を試しました。

スクリプト例:

出力例:Scaleの設定からZ軸方向を10倍に強調
参考:

また、以下のようにカラーマップを作成すると好きなカラーマップを追加できます。

スクリプト例:前回の記事と同様にwiki-schwarzwald-contを設定

出力例:
関連記事

2022/08/08

【Python】PDF内の表をExcelに変換する

本記事のタイトルの内容で検索して出てくるのは、tabula-pyを使用した例が多いです。tabula-pyは、Javaのライブラリのラッパーであるため、Javaのインストールや設定が必要とのことで、どうにかtabula-pyを使わずにやる方法がないか検討しました。

そこで思いついたのが、以前紹介したwin32comを使用する方法です。win32comを使うことで、Microsoft Officeを操作できるため、Pythonから下記の動作を実行することができます。
  1. PDFファイルをWordで開く
  2. 表を選択してコピー
  3. Excelに貼り付け、名前をつけて保存
これで、PDF内の表をExcelファイルに変換する作業の自動化が可能です。xlsxにした後は、Pandasで読み込むなど自由に操作可能です。


注意 : 使用できる環境等に条件があります。
  • win32comを使用するため、WindowsにMicrosoft Officeがインストールされている環境であること
  • PDFファイルの「セキュリティ設定」でコピーが禁止されていないこと
参考:

2022/06/19

calibreで出力したepubをKindleGenで処理できるように再変換する

以前の記事でKindleGenなどの使い方を紹介しましたが、Kindleもepub対応するとニュースになっていました。メール転送でepubが使えるようになるだけみたいなので、個人的にはもうしばらくはKindleGenも使って行きたいと思っています。

電子書籍管理ソフトウェアの「Calibre」で変換したepubが、KindleGenで変換できないケースがあります。Calibreでmobiなりazw3なりに変換すれば良いのでしょうが、設定が正しくないためか、レイアウトが崩れ表示が壊れるケースに見舞われたので、Pythonで変換スクリプトを書きました。

と言っても、画像中の左のファイル構成になっているものを、右のファイル構成に変換するのが主な処理です。万能なコードではなく、KindleGenが上手く処理できない一部のケースのみに対応しているので、ご留意ください。

日本語の縦書き書籍(漫画などではない)を想定しており、スタイルシートは、「電書協 EPUB 3 制作ガイド ver.1.1.3 2015年1月1日版」から一部のファイルをコピーして使用しています。事前にダウンロードして解凍して同一階層に必要なファイルを置いてください。


バグ等もあるかと思いますので、参考程度にご利用いただけると幸いです。

関連記事