質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2076閲覧

pngからpdfへの変換時にbytes-like objectエラーが出る

wggv

総合スコア6

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/21 09:40

編集2020/01/22 10:27

お世話になっております。
Windows Subsystem for Lynuxで作成した仮想環境(Python3.6)からJupyter labを使用しております。
Windownsフォルダ内にあるpngファイルを一括してpdfへと変換するために以下のスクリプトを使用しました。

Python3.6

1import os 2import img2pdf 3 4#特定のフォルダにある png ファイルを output.pdf に追加 5if __name__ == '__main__': 6 pdfFileName = "output.pdf" 7 path = "/mnt/d/Download/web/all" 8 ext = ".png" 9 10 with open(pdfFileName, "wb") as f: 11 f.write(img2pdf.convert([i for i in os.listdir(path)if i.endswith(ext)]))

その際、以下のエラーが表示されます。


TypeError Traceback (most recent call last)
<ipython-input-40-0b34beb4e7df> in <module>
9
10 with open(pdfFileName, "wb") as f:
---> 11 f.write(img2pdf.convert([i for i in os.listdir(path)if i.endswith(ext)]))

~/.local/lib/python3.6/site-packages/img2pdf.py in convert(*images, **kwargs)
1827 depth,
1828 rotation,
-> 1829 ) in read_images(rawdata, kwargs["colorspace"], kwargs["first_frame_only"]):
1830 pagewidth, pageheight, imgwidthpdf, imgheightpdf = kwargs["layout_fun"](
1831 imgwidthpx, imgheightpx, ndpi

~/.local/lib/python3.6/site-packages/img2pdf.py in read_images(rawdata, colorspace, first_frame_only)
1159
1160 def read_images(rawdata, colorspace, first_frame_only=False):
-> 1161 im = BytesIO(rawdata)
1162 im.seek(0)
1163 imgdata = None

TypeError: a bytes-like object is required, not 'str'

どこをどのようにbyte型に変換すればよいのでしょうか?
またこのエラーを回避する方法がほかにもありました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2020/01/21 20:17

WSLは1も2も使ってないので分かりませんが、環境に問題はないですか? 質問文にはpython3.7と書いてあるのに、モジュールは3.6のものがエラーを出してますよね?
wggv

2020/01/22 10:24

失礼しました。使用していたのは仮想環境のPython3.6でした。 WSL上と通常のLynuxでは挙動が異なるのでしょうか??
dameo

2020/01/22 11:20

> WSL上と通常のLynuxでは挙動が異なるのでしょうか?? WSL1は挙動が異なるケースはややあるようです。2はあまりないようです。 エラーメッセージを見た時点で、最新のAPIだけは確認しましたが、画像ファイル名のリストを取るI/Fはあるようでした。なので今回は環境を疑った次第で、今も怪しいと思っています。 今回のケースでWSLが疑わしいとは思っていませんが、少なくとも環境は明確にしないといけません。 anacondaのバージョンであるとか、仮想環境に何を使っているとか、そういう話です。意図したバージョンの意図したモジュールを読み込めているのか?という点がよく分かりません。 最後に、Lynuxではなくて、Linuxです。
dameo

2020/01/22 11:30

あ、あと、jupyterlabのインストール方法も教えて下さい。pipからinstallも出来るようなので…
wggv

2020/01/23 04:49

>can110さん 対象フォルダの.pngファイルを頂いたファイルだけにしても同様のエラーが出ました。 > dameoさん 環境について説明不足で済みませんでした。 Anacondaバージョンはconda 4.7.12、 Jupyter labのインストールは pip install jupyterlab にて行いました。 先ほど環境確認の際、Ubuntu上でAnacondaへのPathが通っておらず、 Jupyter lab上のコマンドに以下の2行を足しました。 !echo "source ~/anaconda3/etc/profile.d/conda.sh" >> ~/.zshrc !source .zshrc 実行後のエラーメッセージが変わり以下のようになりました。 --------------------------------------------------------------------------- ImageOpenError Traceback (most recent call last) <ipython-input-4-e2f27388db38> in <module>() 12 13 with open(pdfFileName, "wb") as f: ---> 14 f.write(img2pdf.convert([i for i in os.listdir(path)if i.endswith(ext)])) /home/takahiro/.local/lib/python2.7/site-packages/img2pdf.pyc in convert(*images, **kwargs) 1827 depth, 1828 rotation, -> 1829 ) in read_images(rawdata, kwargs["colorspace"], kwargs["first_frame_only"]): 1830 pagewidth, pageheight, imgwidthpdf, imgheightpdf = kwargs["layout_fun"]( 1831 imgwidthpx, imgheightpx, ndpi /home/takahiro/.local/lib/python2.7/site-packages/img2pdf.pyc in read_images(rawdata, colorspace, first_frame_only) 1169 raise ImageOpenError( 1170 "cannot read input image (not jpeg2000). " -> 1171 "PIL: error reading image: %s" % e 1172 ) 1173 # image is jpeg2000 ImageOpenError: cannot read input image (not jpeg2000). PIL: error reading image: cannot identify image file <_io.BytesIO object at 0x7f7ff6902050> 不勉強でお手数をおかけしますがよろしくお願いいたします。
dameo

2020/01/23 05:09 編集

anacondaを使っているなら、condaでパッケージ管理をした方がいいと聞きますよ。試したことがないので詳細は知りませんが、競合すると聞いています。 pipを使うのは、anacondaをインストールせずにjupyterの環境を使う方法かと思います。 $ python -m venv jupyter $ ./jupyter/bin/activate (jupyter) $ pip install jupyterlab ... (jupyter) $ jupyter lab ... (jupyter) $ deactivate みたいな使い方だと思います。同じことをcondaでするなら $ conda create -n jupyter ... $ conda activate jupyter $ conda install jupyterlab ... $ jupyter lab ... $ conda deactivate みたいな感じかと思います。ただanacondaなら始めからjupyterlabは入っているのでは? Linuxに入れたことはないのでよく分かりませんが、anacondaがデフォルトのpython環境になっているなら $ jupyter lab で起動すると思うのですが…そうでなければ $ conda activate 環境名 で行けませんか?
dameo

2020/01/23 05:21

あ、もしかして仮想環境を使わずにそのままpipもcondaも使ってるのです?
wggv

2020/01/23 16:49

仮想環境から実行してもSP条件そうでなくても(baseから実行)、上記error(mageOpenError: cannot read input image (not jpeg2000). )が出てしまいます。
dameo

2020/01/23 16:56

少なくとも他の人が正しく使えていて、自分だけおかしな現象が起きるときは、手順を明確にしないといけません。私の質問に対する答えにもなっていませんよ。 他の人が再現できるレベルで正確に教えて下さい。環境も不明確です。
wggv

2020/01/24 06:34

失礼いたしました。 以下に、Ubuntu導入~エラーまでの流れを追記いたしました。 そのほか必要な情報がありましたら指摘していただけますと幸いです。 Windows10でWSLを有効化後、Microsoft storeからUbuntu18.04をインストールし、Ubuntu上で以下の一連のコマンドでAnaconda(conda 4.7.12)をインストール、仮想環境を構築(Python3.6)、Jupyter labの導入を行いました。 wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh bash Anaconda3-2019.10-Linux-x86_64.sh echo "source ~/anaconda3/etc/profile.d/conda.sh" >> ~/.zshrc source .zshrc conda create -n deep python=3.6 conda activate deep #以下は作成した仮想環境上で実行 pip install jupyter lab jupyter lab #投稿したコードを立ち上げたブラウザのJupyter labに入力→エラー
dameo

2020/01/24 16:50

私もnativeのUbuntu 18.04で実験してみました。 wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh bash Anaconda3-2019.10-Linux-x86_64.sh (選択肢はデフォルト) eval "$(/home/user/anaconda3/bin/conda shell.bash hook)" conda create -n deep python=3.6 conda activate deep pip install jupyter lab pip install img2pdf jupyter lab python3選択 import img2pdf img2pdf.convert(['1.png','2.png']) →b'%PDF-1.3\n%\xe2\xe3\xcf\xd3\n1 0 obj\n<<\n... でエラーは出ませんでした。 anacondaの最新バージョンでは、pipも認識しているように見えます。 wggvさんのコメントですが、「→エラー」では何のエラーか分かりません。正確にお願いします。 本来であればエラー内容を確認してからの話ですが、先に聞いてしまいます。 import sys print(sys.executable) print(sys.path) の結果を教えてください。 あと、pngファイルは本当に存在していますか? また、 pip list | grep img2pdf conda list | grep img2pdf の結果もお願いします。
wggv

2020/01/28 03:00

「→エラー」は”TypeError: a bytes-like object is required, not 'str'”です。失礼いたしました。 Jupyter lab 上で以下のコードを実行しました。 import sys print(sys.executable) の実行結果は”/usr/bin/python”、 import sys print(sys.path) の実行結果は ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/takahiro/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/home/takahiro/.local/lib/python2.7/site-packages/IPython/extensions', '/home/takahiro/.ipython'] です >pngファイルは本当に存在していますか? 存在しております。 !pip list | grep img2pdf の実行結果は”DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning. img2pdf (0.3.3)” !conda list | grep img2pdf に対しては実行結果が返ってきませんでした(エラー等もなし)。
dameo

2020/01/28 04:07

完全におかしなことになってますね。 anacondaの環境ではなく、もともとインストールされてるpython2を動かしてしまっているようです。 つまりanacondaはなかったことになっており、元のpython2環境を使用して、pipでインストールしたjupyterが起動されてるということです。 とりあえず、インストール時に言われたとおり、シェルの設定は eval "`~/anaconda3/bin/conda shell.zsh hook`" にしてください(bash想定の$()は、Bシェル系だと``と同じです)。 多分これでzshでもanacondaのpythonが動くと思います。起動した際に conda env list でbaseになってれば成功です。 成功したら、そのままjupyter labして、目的のプログラムを動かしてみてください。
wggv

2020/01/28 06:00

もともとの設定によりAnaconda上で操作ができていなかったということですね。 eval "`~/anaconda3/bin/conda shell.zsh hook`" によりbase環境にしたうえで、Jupyter labを起動し、以下を実行したところ、無事にoutput.pdfが生成されておりました。 ありがとうございました。 ――――――――――――― import os import img2pdf if __name__ == '__main__': pdfFileName = "output.pdf" path = "/mnt/d/Download//all" ext = ".png" with open(pdfFileName, "wb") as f: f.write(img2pdf.convert([i for i in os.listdir(path)if i.endswith(ext)]))
wggv

2020/01/28 06:45

重ねての質問で恐縮ですが、別のpngファイルを格納して上記コードを実行したところ、うまくいく場合とうまくいかない場合(以下のエラーが出る)がありますが、使用してはいけないファイル名やファイル数の制限等あるのでしょうか。 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-7-a13745f039c6> in <module> 9 10 with open(pdfFileName, "wb") as f: ---> 11 f.write(img2pdf.convert([i for i in os.listdir(path)if i.endswith(ext)])) ~/anaconda3/lib/python3.7/site-packages/img2pdf.py in convert(*images, **kwargs) 1827 depth, 1828 rotation, -> 1829 ) in read_images(rawdata, kwargs["colorspace"], kwargs["first_frame_only"]): 1830 pagewidth, pageheight, imgwidthpdf, imgheightpdf = kwargs["layout_fun"]( 1831 imgwidthpx, imgheightpx, ndpi ~/anaconda3/lib/python3.7/site-packages/img2pdf.py in read_images(rawdata, colorspace, first_frame_only) 1159 1160 def read_images(rawdata, colorspace, first_frame_only=False): -> 1161 im = BytesIO(rawdata) 1162 im.seek(0) 1163 imgdata = None TypeError: a bytes-like object is required, not 'str'
dameo

2020/01/28 10:14

zshの設定がうまく行ってなかったんだと思います。こういう場合は、可能であればzshに拘らず、bashだったら…と試してみると正解に早くたどり着くことが出来ると思いますよ。 何はともあれおめでとうございます。 データ依存の問題はまた別件だと思うので、それは別質問です。自己解決にするなり、can110さんの回答も正しいと思うので、そちらで解決するなりして、この質問は解決してください。
wggv

2020/01/28 10:23

ありがとうございました。
guest

回答1

0

ベストアンサー

当方Win10環境にWindows StoreにてUbuntu18.04を新規インストールし以下を実行しましたが、問題なくPDF作成できました。
また、ターミナル上だけではなくJupyter lab上でも動作を確認できました。
なお、Jupyterは以下の実行手順で示しているようにpipではなくcondaにてインストールしています。参考まで。

実行手順

user@user-pc:~$ wget http://optipng.sourceforge.net/pngtech/img/lena.png user@user-pc:~$ wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh user@user-pc:~$ bash Anaconda3-2019.10-Linux-x86_64.sh user@user-pc:~$ echo "source ~/anaconda3/etc/profile.d/conda.sh" >> ~/.zshrc user@user-pc:~$ source .zshrc user@user-pc:~$ conda create -n deep python=3.6 user@user-pc:~$ conda activate deep (deep) user@user-pc:~$ pip install img2pdf (deep) user@user-pc:~$ python hoge.py (deep) user@user-pc:~$ ls Anaconda3-2019.10-Linux-x86_64.sh anaconda3 hoge.py lena.png ret.pdf (deep) user@user-pc:~$ conda install -c conda-forge jupyterlab (deep) user@user-pc:~$ jupyter lab

hoge.py

Python

1import os 2import img2pdf 3 4with open('ret.pdf', 'wb') as f: 5 f.write(img2pdf.convert([i for i in os.listdir('./') if i.endswith('.png')]))

jupyter lab実行結果
イメージ説明

投稿2020/01/24 07:55

編集2020/01/24 08:53
can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問