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

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

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

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

Q&A

解決済

1回答

679閲覧

複数画像(.jpg)を、pdfに変換するアプリを作成したい。

sawawawa

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2022/11/06 09:14

前提

Pythonにて、フォルダを指定した後、複数画像(.jpg)を、pdfに変換するアプリを作成しています。
出力したpdfのファイル名をうまく設定できず、エラーが発生してしまいます。

実現したいこと

ここに実現したいことを箇条書きで書いてください。
・「参照」ボタンにて取得したフォルダ内の画像を、まとめてpdfにする
・出力するファイル名を、「フォルダ名.pdf」のように名前を変更したい。

発生している問題・エラーメッセージ

エラーメッセージ PS C:\Users\sawad> & C:/Users/sawad/AppData/Local/Programs/Python/Python310/python.exe c:/Users/sawad/AppData/Local/Programs/Python/python_lesson/jikkou1.py Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\sawad\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "c:\Users\sawad\AppData\Local\Programs\Python\python_lesson\jikkou1.py", line 18, in pdfchange pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" ) UnboundLocalError: local variable 'iDirPath1' referenced before assignment

該当のソースコード

Python

1import os 2import tkinter as tk 3from tkinter import * 4from tkinter import ttk 5from tkinter import filedialog 6import img2pdf 7 8# フォルダ指定の関数 9def dirdialog_clicked(): 10 iDir1 = os.path.abspath(os.path.dirname(__file__)) 11 iDirPath1 = filedialog.askdirectory(initialdir = iDir1) 12 entry1.set(iDirPath1) 13 14#変換ボタン押下時の実行関数 15def pdfchange(): 16 #出力するpdfのファイル名 17 pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" ) 18 #pdfにしたい画像のあるフォルダを指定する 19 iDirPath1 = entry1.get() 20 21 #変換したい画像の拡張子 22 ext = ".jpg" 23 24 #「path」のある(カレント)フォルダを指定する 25 os.chdir(iDirPath1) 26 file_list = [i for i in os.listdir(iDirPath1) if i.endswith(ext)] 27 with open(pdfFileName, "wb") as f: 28 f.write(img2pdf.convert(sorted(file_list), title='Test PDF', viewer_page_layout=img2pdf.parse_layout('single'))) 29 30if __name__ == "__main__": 31 32 # rootの作成 33 root = Tk() 34 root.title("PDF変換ツール") 35 36 # Frame1の作成 37 frame1 = ttk.Frame(root, padding=10) 38 frame1.grid(row=0, column=1, sticky=E) 39 40 # 「フォルダ参照」ラベルの作成 41 IDirLabel = ttk.Label(frame1, text="フォルダ参照>>", padding=(5, 2)) 42 IDirLabel.pack(side=LEFT) 43 44 # 「フォルダ参照」エントリーの作成 45 entry1 = StringVar() 46 IDirEntry = ttk.Entry(frame1, textvariable=entry1, width=30) 47 IDirEntry.pack(side=LEFT) 48 49 # 「フォルダ参照1」ボタンの作成 50 IDirButton = ttk.Button(frame1, text="参照", command=dirdialog_clicked) 51 IDirButton.pack(side=LEFT) 52 53 # Frame2の作成 54 frame2 = ttk.Frame(root, padding=10) 55 frame2.grid(row=2, column=1, sticky=E) 56 57 # Frame3の作成 58 frame3 = ttk.Frame(root, padding=10) 59 frame3.grid(row=5,column=1,sticky=W) 60 61 # キャンセルボタンの設置 62 button2 = ttk.Button(frame3, text=("閉じる"), command=quit) 63 button2.pack(fill = "x", padx=30, side = "left") 64 65 # 実行ボタンの設置 66 button3 = ttk.Button(frame3, text="変換", command=pdfchange) 67 button3.pack(fill = "x", padx=30, side = "left") 68 69 root.mainloop()

試したこと

ここに問題に対して試したことを記載してください。
17行目の下記の部分を
pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" )
から、
pdfFileName = "output.pdf"
のような直接ファイル名を指定すると、「output.pdf」として出力は成功するのですが、、
ファイル名をどうにかフォルダ名にして出力したいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2022/11/06 09:39 編集

> UnboundLocalError: local variable 'iDirPath1' referenced before assignment 上記エラーは'iDirPath1'という変数を提示する前に参照しているので発生しています。それとは別に、「出力するファイル名を、「フォルダ名.pdf」のように名前を変更したい。/ファイル名をどうにかフォルダ名にして出力したいです。」とありますが、それだとフォルダに複数画像がある場合には上書きしてしまうかと思うのですが、その仕様で良いのでしょうか?
sawawawa

2022/11/06 10:40

申し訳ございませんが、私では意味が理解できず、、 ベストアンサーの通りに修正して動かしてみたところちゃんと動きまして、もう一度実行すると、フォルダ内のpdfファイルが同じものに書き換えられるということでしょうか。それについては特に問題ありません。
meg_

2022/11/06 11:31

「まとめてpdfにする」の部分を見落としていました。フォルダ内の画像全てを1つのPDFファイルに変換して出力する、ということだったのですね。失礼しました。
guest

回答1

0

ベストアンサー

中身をちゃんと見ていませんが、少なくとも以下の場所で「iDirPath1」に値を入れる前に、basenameで参照しているのが問題です。

python

1 #出力するpdfのファイル名 2 pdfFileName = print(os.path.basename(iDirPath1) + ".pdf" ) 3 #pdfにしたい画像のあるフォルダを指定する 4 iDirPath1 = entry1.get()

また、どうやら、「iDirPath1」はディレクトリ名のようです。 ディレクトリ名のbasenameを取って、それに「.pdf」を付けてそれをファイル名にしようとしているように見えます。それはおかしいですね。
どういうファイル名にしたいのですか?たぶん、「ディレクトリ名」+ 「ファイル名の拡張子以外」+「.pdf」としたいのだと思いますが、 ディレクトリ名は iDirPath1として、ファイル名の拡張子以外のところは何ですか?

投稿2022/11/06 09:33

編集2022/11/06 09:38
TakaiY

総合スコア12761

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

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

sawawawa

2022/11/06 09:49

おおお! うまく動作しました! 本当にありがとうございます!! 私はプログラミング初心者のため、うまく答えられないですが、、 ご認識の通り、「iDirPath1」はディレクトリ名です。 「参照」ボタンで取得したフォルダ名のところに入っている画像をpdf形式に変換し、「ディレクトリ名」+「.pdf」にしたかったので、目的はこれであっております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問