障害?バグ?今日やったらうまく動かなかった。
年末調整の時期になり、やっと出番が来ました。「PDFEditor2」
会社員の方は、マイナンバー連携で即終わるようで、羨ましい・・・。
ということで、年末調整のデータを作っていたら、よくわからないバグが出たので、報告。
ネットで検索してもなかなかピンポイントの対応方法がなく、結構苦戦したので、修正内容をメモしておきます。
インポートモジュール
#### インポート
import os
import tkinter as tk
import tkinter.ttk as ttk
import subprocess
import TKinterK_v002 as tkk
from tkinter import messagebox
from tkinter import filedialog
from PIL import Image, ImageTk
from pathlib import Path
from pdf2image import convert_from_path
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.pdfgen import canvas
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4, landscape, portrait
from functools import partial
import csv
import glob
import subprocess
エラー内容
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
File "C:\Users\xxxxxxxxxx\source\repos\PDFEditor2\PDFEditor2\PDFEditor2.py", line 773, in write
self.arc.get_list()
File "C:\Users\xxxxxxxxxx\source\repos\PDFEditor2\PDFEditor2\PDFEditor2.py", line 1197, in write
cc.save()
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfgen\canvas.py", line 1272, in save
self._doc.SaveToFile(self._filename, self)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 212, in SaveToFile
data = self.GetPDFData(canvas)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 238, in GetPDFData
return self.format()
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 420, in format
IOf = IO.format(self)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 867, in format
fcontent = format(self.content, document, toplevel=1) # yes this is at top level
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 67, in format
f = element.format(document)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 680, in format
L = [(format(PDFName(k),document)+b" "+format(dict[k],document)) for k in keys]
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 680, in <listcomp>
L = [(format(PDFName(k),document)+b" "+format(dict[k],document)) for k in keys]
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 78, in format
return pdfdocEnc(element)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\pdfdoc.py", line 54, in pdfdocEnc
return x.encode('extpdfdoc') if isinstance(x,str) else x
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\rl_codecs.py", line 1027, in encode
return charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character '\x1d' in position 12: character maps to <undefined>
原因
ここですね。
UnicodeEncodeError: 'charmap' codec can't encode character '\x1d' in position 12: character maps to <undefined>
つまりEncodeが出来ないって言われているのですが、特に文字を入れなくても、これが出てきてしまう。
ファイルから何から全てutf-8にしているはずなんですがね。
どっかで勝手にUnicodeでencodeしているのか・・・。
しょうがないので、調べながら見ながら色々模索するしかありません。
|
中略
|
直したところ
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\reportlab\pdfbase\
pdfdoc.py
encodeの文字コード?マッピング?を指定している文字コードを変えました。
関数:
def pdfdocEnc(x):
変更前:
def pdfdocEnc(x):
return x.encode('extpdfdoc') if isinstance(x,str) else x
変更後:
def pdfdocEnc(x):
return x.encode('utf_8') if isinstance(x,str) else x
修正後の問題点?
これは、上の修正を行ったからかどうかも分かりません。
PDF出力する際に、出力サイズが全てA4縦になってました。
これは元々そうだったのかもしれません。A4横をテストしていなかったので。
最後に
Pythonのプラグインって直していいんですかね?
Cとかみたいにdll形式になっていないだけありがたいです。
とりあえず年末調整のPDFは全部これで作成します。
まだ早いですが良いお年を。