- 青空文庫txtのファイル名部に変換したいファイルをDrag&Dropする
- PDF出力のファイル名部に定義から取得した出力ファイル名が出るので
確認し[実行]を押す
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
[#7字下げ]一、午后の授業[#「一、午后の授業」は中見出し]
「ではみなさんは、さういふふうに川だと云はれたり、乳の流れたあとだと
云はれたりしてゐたこのぼんやりと白いものがほんたうは何かご承知ですか。」
先生は、黒板に吊した大きな黒い星座の図の、上から下へ白くけぶった銀河
帯のやうなところを指しながら、みんなに問をかけました。
カムパネルラが手をあげました。それから四五人手をあげました。
⇒
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
- PDF出力フォルダにDropで出力先を設定しておけば、そのフォルダに出力される
- PDF出力領域に入力ファイルをDropすると.txtを.pdfに変換したものが採用される
- フォント指定、文字サイズ指定などが必要な場合はコマンドライン使用
AozoraPDF.exeのダウンロード
次の場所に.exeのフォルダ(zip化してあります)を置きました。
AozoraPDF.zip
AozoraPD.exeをクリックするとGUIが起動します。
-inオプションを付けて起動すると、GUIは動かずコマンドライン・バッチ処理となります。
バッチ処理では細かオプションが指定できます。
バッチ処理の仕様は
◆青空文庫をPDF化するツール (ソースも公開)を参照してください
PyhotnプログラムのGUI化とEXE化
◆青空文庫をPDF化するツール (ソースも公開)
で作成したプログラムAozoraPDFをGUI化し、EXE化します。
AozoraPDFはPythonで書かれています。コマンドライン、あるいはバッチスクリプトから
python AozoraPDF [各種パラメタ]
の様に起動され,バッチ的に動く形式となっています。
ソースコードのダウンロード法に関しては
◆青空文庫をPDF化するツール (ソースも公開)
を参照してください。
PyhotnプログラムのGUI化
GUI化はChatGPTで雛形を作り、手直しし、◆青空文庫をPDF化するツール (ソースも公開)のコードを取り込みました。
CharGPTに出した指示は次のものです。
得られたコードは次のものです。
import sys
import os
import argparse
from typing import Optional
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout, QLabel, QHBoxLayout, QPushButton, QFileDialog, QMessageBox
from PyQt5.QtCore import QFileInfo
class FileDragDropWidget(QWidget):
def __init__(self) -> None:
super().__init__()
self.setWindowTitle("File Drag & Drop")
self.setGeometry(300, 300, 300, 200)
layout: QVBoxLayout = QVBoxLayout()
# ドロップエリア1のラベルとテキストボックス
hbox1: QHBoxLayout = QHBoxLayout()
label1: QLabel = QLabel("ドロップエリア1 (.txtファイルのみ)")
hbox1.addWidget(label1)
self.file_path_edit_1: QLineEdit = QLineEdit()
self.file_path_edit_1.setReadOnly(True)
hbox1.addWidget(self.file_path_edit_1)
layout.addLayout(hbox1)
# 出力ファイル名表示テキストボックス
hbox2: QHBoxLayout = QHBoxLayout()
label2: QLabel = QLabel("出力ファイルパス")
hbox2.addWidget(label2)
self.output_file_edit: QLineEdit = QLineEdit()
self.output_file_edit.setReadOnly(True) # 読み取り専用に設定
hbox2.addWidget(self.output_file_edit)
layout.addLayout(hbox2)
# 選択ボタン
self.select_button: QPushButton = QPushButton("選択")
self.select_button.clicked.connect(self.selectOutputFile)
layout.addWidget(self.select_button)
# 実行ボタン
self.run_button: QPushButton = QPushButton("実行")
self.run_button.clicked.connect(self.runProcess)
layout.addWidget(self.run_button)
self.setLayout(layout)
# ドロップを受け付ける
self.setAcceptDrops(True)
def dragEnterEvent(self, event) -> None:
if event.mimeData().hasUrls():
for url in event.mimeData().urls():
file_path: str = url.toLocalFile()
if os.path.isfile(file_path) and file_path.endswith('.txt'):
event.accept()
return
event.ignore()
def dropEvent(self, event) -> None:
for url in event.mimeData().urls():
file_path: str = url.toLocalFile()
if event.pos().y() < self.height() / 2:
# ドロップエリア1にドロップされた場合
self.file_path_edit_1.setText(file_path)
# ドロップされたファイルのパスから出力ファイル名を設定
output_file_name: str = os.path.splitext(os.path.basename(file_path))[0] + ".pdf"
self.output_file_edit.setText(file_path) # パス名を表示する
def selectOutputFile(self) -> None:
file_dialog: QFileDialog = QFileDialog(self)
file_dialog.setWindowTitle("出力ファイルを選択 (.pdf)")
file_dialog.setFileMode(QFileDialog.AnyFile)
file_dialog.setAcceptMode(QFileDialog.AcceptSave)
file_dialog.setNameFilter("PDF ファイル (*.pdf)")
if self.output_file_edit.text():
file_dialog.selectFile(self.output_file_edit.text())
if file_dialog.exec_():
selected_file: Optional[str] = file_dialog.selectedFiles()
if selected_file:
self.output_file_edit.setText(selected_file[0])
def runProcess(self) -> None:
output_file_path: str = self.output_file_edit.text() # パスを取得
QMessageBox.information(self, "出力ファイルパス確認", f"出力ファイルパス: {output_file_path}")
def parse_arguments() -> argparse.Namespace:
parser: argparse.ArgumentParser = argparse.ArgumentParser(description="File Drag & Drop")
parser.add_argument("-in", dest="input", metavar="input_file", help="Specify input file")
return parser.parse_args()
if __name__ == "__main__":
args: argparse.Namespace = parse_arguments()
if args.input:
print(args.input)
sys.exit()
app: QApplication = QApplication(sys.argv)
window: FileDragDropWidget = FileDragDropWidget()
window.show()
sys.exit(app.exec_())
次のGUIが得られます。
ドロップ位置の判定やダイアログ出力位置などの問題もありますが、最初の雛形として十分役に立ちました。
細かな修正はgoogleで仕様を調べて実施しました。(いろいろあってChatGPTには無理だと判断しました)
最終プログラムは
◆青空文庫をPDF化するツール (ソースも公開)
からダウンロードしたソースキットの
bin/AozoraPDF.py
です。
EXE化
exe化はpyinstallerを用いて次の手順で行いました
本来pythonのパス指定は不要のはずです。
カレントディレクトリ上にbuild/とdist/が作成され、dist/下にAoozoraPDF/が作られます。
AozoraPDF/にはAozoraPDF.exeと_internalが作られています。_interal下にリソース群が置かれています。今回使用する資源[青空文庫.jpg]も_internal下にコピーしました。
AozoraPDF/は一段根本に移動し、その他の不要な二次ファイル群は削除しました。
手順は
◆青空文庫をPDF化するツール (ソースも公開)
からダウンロードしたソースキットの
bin/A01_build.bat
にあります。
雑談
◇2台のiPad/piaScoreで楽譜2ページ表示
で始まったPDFシリーズ(PDF楽譜を自力で行いiPad2台で2ページ見開きをしたいというのが出発点でしたが、文学書表示になってしまいました)
もはや1っか月。
ま、一旦休憩かな