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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python 3.x

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

Q&A

解決済

1回答

217閲覧

VSCODE launch.jsonを使用し引数に全角ブランク特定文字が含まれている場合

km0815.lj

総合スコア12

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python 3.x

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

0グッド

1クリップ

投稿2024/02/26 09:44

編集2024/02/28 09:59

実現したいこと

コマンドラインから、引数で渡したPDFファイルを、パスワード付PDFに変換したく
以下のPyhtonプログラムを作成しました。

python

1import pypdf 2import sys 3 4def set_password(src_path, dst_path, user_password, owner_password=None): 5 6 print(src_path) 7 print(ascii(src_path)) 8 print(ascii("C:\\temp\\sample2\\0000000AB・CD 株式会社 御中.PDF")) 9 print("C:\\temp\\sample2\\0000000AB\u30fbCD\u3000株式会社 御中.PDF") 10 11 src_pdf = pypdf.PdfReader(src_path) 12 dst_pdf = pypdf.PdfWriter() 13 dst_pdf.clone_reader_document_root(src_pdf) 14 15 d = {key: src_pdf.metadata[key] for key in src_pdf.metadata.keys()} 16 dst_pdf.add_metadata(d) 17 18 dst_pdf.encrypt(user_password, owner_password) 19 dst_pdf.write(dst_path) 20 21if __name__ == '__main__': 22 args = sys.argv 23 if 5 == len(args): 24 set_password(args[1], args[2],args[3], args[4]) 25 else: 26 print('引数の数が一致しません。')

コードのデバックを行うために、以下launch.jsonファイルを作成し実行したところ
例外エラーが発生しました。

json

1{ 2 // IntelliSense を使用して利用可能な属性を学べます。 3 // 既存の属性の説明をホバーして表示します。 4 // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 5 "version": "0.2.0", 6 "configurations": [ 7 8 { 9 "name": "Python: 現在のファイル", 10 "type": "python", 11 "request": "launch", 12 "program": "${file}", 13 "console": "integratedTerminal", 14 "justMyCode": true, 15 "args": [ 16 "C:\\temp\\sample2\\0000000AB・CD 株式会社 御中.PDF", 17 "C:\\temp\\sample2\\0000000AB・CD 株式会社 御中.PDF", 18 "pass", 19 "pass" 20 ] 21 } 22 ] 23}

発生している問題・分からないこと

引数で渡したパス・ファイル名の中点は削除され、ブランクは¥u3000で
プログラムに引き渡されていると思いますが、回避する方法は無いでしょうか。
¥マークはバックスラッシュで読み替えて下さい。

エラーメッセージ

error

1例外が発生しました: FileNotFoundError 2[Errno 2] No such file or directory: 'C:\\temp\\sample2\\0000000ABCD\u3000株式会社 御中.PDF' 3 File "C:\Users\user\pytest\PDF_pwSet.py", line 8, in set_password 4 src_pdf = pypdf.PdfReader(src_path) 5 File "C:\Users\user\pytest\PDF_pwSet.py", line 21, in <module> 6 set_password(args[1], args[2],args[3], args[4]) 7FileNotFoundError: [Errno 2] No such file or directory: 'C:\\temp\\sample2\\0000000ABCD\u3000株式会社 御中.PDF'

該当のソースコード

python

1src_pdf = pypdf.PdfReader(src_path)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

引数のファイル名が半角英数(「ABCD.PDF」等)の場合は、問題なく実行できます。

src_pdf = pypdf.PdfReader(src_path)の部分を
src_pdf = pypdf.PdfReader(r"C:\temp\sample2\0000000AB・CD 株式会社 御中.PDF")に
変更し実行したところ、ファイル名が全角でも問題なくパスワード付のPDFに変換されたためプログラムそのものに問題は無いかと思います。

以下、print文を入れた結果のターミナルに表示
print(src_path)
print(ascii(src_path))
print(ascii("C:\temp\sample2\0000000AB・CD 株式会社 御中.PDF"))
print("C:\temp\sample2\0000000AB\u30fbCD\u3000株式会社 御中.PDF")

結果
C:\temp\sample2\0000000ABCD 株式会社 御中.PDF
'C:\temp\sample2\0000000\uff21\uff22\uff23\uff24\u3000\u682a\u5f0f\u4f1a\u793e \u5fa1\u4e2d.PDF'
'C:\temp\sample2\0000000\uff21\uff22\u30fb\uff23\uff24\u3000\u682a\u5f0f\u4f1a\u793e \u5fa1\u4e2d.PDF'
C:\temp\sample2\0000000AB・CD 株式会社 御中.PDF

補足

windows10
python 3.9.9
pypdf 4.0.1

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

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

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

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

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

ikedas

2024/02/27 10:06

使用しているpypdfライブラリのバージョンを明記してください (ちなみに、このコメント欄に書くのではありません。質問文を編集して書いてください)。
km0815.lj

2024/02/28 00:49

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
ikedas

2024/02/28 03:00

Pythonとpypdfのバージョン的には、問題なく動作してもおかしくないと思います (←ちょっと自信ない)。 ところで、JSONファイルの中のパス名の表記で「\」(バックスラッシュ) ではなく「¥」(円記号) が使われています。エラーメッセージでもパス名の同じ箇所で円記号が表示されています (全角空白が置き換わった箇所については「\u3000」と、バックスラッシュが表示されています)。 これらは、実際のテキストをそのままコピペしたものなのでしょうか。
km0815.lj

2024/02/28 05:00

実際のテキストをそのままコピペしたものなのになります。 編集モードでは\(円記号)になっておりコピペした部分がバックスラッシュになっていることに気付いておりませんでした。 修正致しました。 尚、src_pdf = pypdf.PdfReader(src_path)の直前で、print文を入れターミナルに表示したところ その時点で・(中点)は消えており、「0000000ABCD 株式会社 御中.PDF」になっておりました。 また、中点や全角ブランクを抜いた「0000000ABCD株式会社 御中.PDF」を引数に設定した場合(元のPDFファイル名も修正)、問題なくパスワード付PDFに変換されました。 pypdfの問題ではなく、lunch.jsonで渡す側あるいは受取の問題かも知れないです。 そのあたりもご教示頂ければ幸いです。
ikedas

2024/02/28 09:32

「中点」とおっしゃっている記号が何なのか確認したいです。次のようなコードを実行して、表示される結果を見せてください。 print(ascii("ここにJSONファイルからファイルパス名をコピペしてくる")) また、次のコードを実行するとどうなるでしょうか。こちらも結果を見せてください。 print("C:\\temp\\sample2\\0000000AB\u30fbCD\u3000株式会社 御中.PDF") なお、結果は目で見て書き写すのではなく、省略や要約をせずに表示されているそのままをコピペしてくるようにしてください。 また、このコメント欄に書くのではなく、質問文を編集して書くようにしていただいたほうがいいです。
km0815.lj

2024/02/28 10:01 編集

コメントありがとうございます。修正致しましたご確認の程よろしくお願いいたします。
ikedas

2024/02/28 11:20 編集

OKです。\u30fbは正しいです (日本の印刷用語では「中黒」〔なかぐろ〕と呼びます)。あと、\u3000は全角空白ですからこれも正しいです。 結果を見る限り、src_pathに代入された時点で中黒が削除されてしまっていますね。 念のため、Pythonにファイル名が渡された直後にどうなっているかも確認してみてはどうでしょう。「args = sys.argv」の行の直前に「print(sys.argv)」を入れれば確認できます。 この時点ですでに中黒がないのなら、PythonやpypdfではなくVisual Studio Codeが何かしている可能性が高いですね。
guest

回答1

0

ベストアンサー

暫定的な回答

どうやらVisual Studio Codeのデバッグ機能のWindows環境でのバグ (または仕様) のようです。同様の報告を見つけました。

  • debugpy#1288: Can't debug if project resides in folder whose name contains special characters

こちらは、launch.jsonでargsに \u2013 (「二分ダーシ」とか「エンダッシュ」と呼ばれる記号) が含まれていると、Python側に引数が渡ってきた時点で削除されているというものです。\u30fb (「中黒」) が削除されるのと似ていますね。

さしあたり、Python extension側の問題とは考えにくく、Visual Studio Codeがコマンドラインをコンソールに書き込む時点で何かが起きているのだろうと考えられています。

というわけで、当面の対策は「argsに書くパス名には記号をあまり入れないようにする」ということくらいでしょうか。記号は全部だめというわけでもなさそうですが、今のところ範囲が不明ですので、実際に試してみて問題が起きたものは使わないということになると思います (\u3000 全角空白は問題なさそうです)。

投稿2024/02/29 03:24

ikedas

総合スコア4345

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

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

km0815.lj

2024/02/29 10:08

回答ありがとうございます。 コマンドラインから試したところ引数に全角中黒や全角ブランクが含まれていても パスワード付PDFが作成されました。 いろいろとご教示ありがとうございました。 ベストアンサーに選ばせていただきました。
ikedas

2024/02/29 14:19

上の回答で触れた報告でもそうみたいですが、コマンドラインから実行すると記号が削除されたりはしないんですよね。謎ですねー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問