PythonでPDFの上に文字とか乗っけるアプリを作った！-５.障害対応-

# 障害？バグ？今日やったらうまく動かなかった。

年末調整の時期になり、やっと出番が来ました。「PDFEditor2」
会社員の方は、マイナンバー連携で即終わるようで、羨ましい・・・。

ということで、年末調整のデータを作っていたら、よくわからないバグが出たので、報告。
ネットで検索してもなかなかピンポイントの対応方法がなく、結構苦戦したので、修正内容をメモしておきます。

# インポートモジュール
```Python
#### インポート
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の文字コード？マッピング？を指定している文字コードを変えました。

関数：
```Python
def pdfdocEnc(x):
```

変更前：
```Python
def pdfdocEnc(x):
    return x.encode('extpdfdoc') if isinstance(x,str) else x
```

変更後：
```Python
def pdfdocEnc(x):
    return x.encode('utf_8') if isinstance(x,str) else x
```

WinMerge：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/600152e4-f35d-36a8-8d35-d6e56d5fda2f.png)


# 修正後の問題点？
これは、上の修正を行ったからかどうかも分かりません。
PDF出力する際に、出力サイズが全てA4縦になってました。
これは元々そうだったのかもしれません。A4横をテストしていなかったので。

# 最後に
Pythonのプラグインって直していいんですかね？
Cとかみたいにdll形式になっていないだけありがたいです。

とりあえず年末調整のPDFは全部これで作成します。
まだ早いですが良いお年を。