PyPDF2 编码问题'latin-1' codec can't encode characters in position 8-11: ordinal not in range(256)

使用pypdf2出现编码问题
报错信息

解决方法
1、修改pypdf2包中的generic.py文件
我用的是PyCharm,报错的是那个模块,直接点击即可跳转查看。

generic.py文件第488行原文

  try:
      return NameObject(name.decode('utf-8'))
  except (UnicodeEncodeError, UnicodeDecodeError) as e:
      # Name objects should represent irregular characters
      # with a '#' followed by the symbol's hex number
      if not pdf.strict:
          warnings.warn("Illegal character in Name Object", utils.PdfReadWarning)
          return NameObject(name)
      else:
          raise utils.PdfReadError("Illegal character in Name Object")

修改成

  try:
      return NameObject(name.decode('utf-8'))
  except (UnicodeEncodeError, UnicodeDecodeError) as e:
      try:
          return NameObject(name.decode('gbk'))
      except (UnicodeEncodeError, UnicodeDecodeError) as e:
          # Name objects should represent irregular characters
          # with a '#' followed by the symbol's hex number
          if not pdf.strict:
              warnings.warn("Illegal character in Name Object", utils.PdfReadWarning)
              return NameObject(name)
          else:
              raise utils.PdfReadError("Illegal character in Name Object")

2、修改pypdf2包中的utils.py文件

utils.py238行原文

  r = s.encode('latin-1')
  if len(s) < 2:
      bc[s] = r
  return r

修改成

  try:
      r = s.encode('latin-1')
      if len(s) < 2:
          bc[s] = r
      return r
  except Exception as e:
      print(s)
      r = s.encode('utf-8')
      if len(s) < 2:
          bc[s] = r
      return r

然后运行就成功了

自己写的一个简单pdf多文件合并为一个pdf文件的小程序
使用方法:
为了避免删除源pdf文件,所以另建文件夹,将需要合并的pdf文件复制一份进去,然后对pdf文件重命名,以数字命名排序,1.pdf、2.pdf...。
示例如下

from PyPDF2 import PdfFileReader, PdfFileWriter
import os

def readPdf(path):
    if os.path.splitext(path)[1] == '':  # 判断文件格式是否以.pdf结尾
        path = path + ".pdf"
    pdf = PdfFileReader(path)  # 读取pdf
    return pdf


def writePdf(files):
    pdf_writer = PdfFileWriter()  # pdf写入对象
    for file in files:
        for page in range(file.getNumPages()):
            pdf_writer.addPage(file.getPage(page))
    with open("pdf_all.pdf", 'wb') as f:
        pdf_writer.write(f)


if __name__ == '__main__':
    obj = []
    for i in range(1, 10):  # 这里得根据你的文件数量来自行更改,注意文件命名
        obj.append(readPdf(str(i)))
    writePdf(obj)
posted @ 2022-05-17 16:09  槑孒  阅读(418)  评论(0编辑  收藏  举报