【问题标题】:Creating pdf file with non asii caracters from excel (python)从excel(python)创建具有非ascii字符的pdf文件
【发布时间】:2018-07-30 10:14:42
【问题描述】:
# -*- coding: utf-8 -*-

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.pagesizes import landscape
from reportlab.graphics.barcode import code128
from reportlab.lib.units import mm
from reportlab.platypus import Image
import csv
data_file="variteks.csv"
attendee_data=csv.reader(open(data_file,"rb"))
def pdf_creater(data_file):
    attendee_data=csv.reader(open(data_file,"rb"))

    for row in attendee_data:
        barcode_name = row[0]
        barcode_number=row[1]
        barcode_stf=row[2]
        pdf_file_name= barcode_number+ ".pdf"
generate_certificate(barcode_name,barcode_number,barcode_stf,pdf_file_name)

def generate_certificate (barcode_name,barcode_number,barcode_stf,pdf_file_name):
    c= canvas.Canvas(pdf_file_name)#, pagesize=letter)
    c.setPageSize((400,600))
    c.setViewerPreference("FitWindow", "true")

    # first_image
    variteks = "variteks_first.png"
    c.drawImage(variteks, 40,400, width=None, height=None)

    variteks_ce = "variteks_ce.png"
    c.drawImage(variteks_ce, 40, 260, width=None, height=None)

    barcode = code128.Code128(barcode_number,barHeight=30,barWidth = 2)
    barcode.drawOn(c, 10 * mm, 20 * mm)

    #info
    c.drawCentredString(150,100,barcode_name)

    #info
    c.drawCentredString(150,150, barcode_stf)

    #barkod numarasi
    c.drawCentredString(100,40,barcode_number)
    #down info
    c.drawCentredString(150,15,"1 adet ürün içerir. Contains 1 Piece. LOT:",)

    c.showPage()
    c.save()
    print ("writing")
pdf_creater(data_file)

我有上面的代码来为产品创建贴纸。除非我将土耳其语字符放入 csv 文件,否则它工作正常。如果我输入土耳其字符,我会收到以下错误。你能帮我处理土耳其字符吗? (ş,ı,ç,ğ,ü,ö) 我的代码有 2 张图片、3 个 str、1 个条形码。

C:\Python27\python.exe C:/Users/muhammedcan/PycharmProjects/mp1/variteks.py
Traceback (most recent call last):
  File "C:/Users/muhammedcan/PycharmProjects/mp1/variteks.py", line 57, in <module>
pdf_creater(data_file)
  File "C:/Users/muhammedcan/PycharmProjects/mp1/variteks.py", line 23, in pdf_creater
generate_certificate(barcode_name,barcode_number,barcode_stf,pdf_file_name)
  File "C:/Users/muhammedcan/PycharmProjects/mp1/variteks.py", line 47, in generate_certificate
c.drawCentredString(150,150, barcode_stf)
  File "C:\Users\muhammedcan\AppData\Roaming\Python\Python27\site-packages\reportlab\pdfgen\canvas.py", line 1575, in drawCentredString
width = self.stringWidth(text, self._fontname, self._fontsize)
  File "C:\Users\muhammedcan\AppData\Roaming\Python\Python27\site-packages\reportlab\pdfgen\canvas.py", line 1675, in stringWidth
(fontSize,self._fontsize)[fontSize is None])
  File "C:\Users\muhammedcan\AppData\Roaming\Python\Python27\site-packages\reportlab\pdfbase\pdfmetrics.py", line 747, in stringWidth
return getFont(fontName).stringWidth(text, fontSize, encoding=encoding)
  File "C:\Users\muhammedcan\AppData\Roaming\Python\Python27\site-packages\reportlab\pdfbase\pdfmetrics.py", line 360, in stringWidth
return instanceStringWidthT1(self, text, size, encoding=encoding)
  File "src\rl_addons\rl_accel\_rl_accel.c", line 748, in instanceStringWidthT1
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfe in position 0: invalid start byte

编辑:这是完整的错误。

【问题讨论】:

  • 能否请您显示完整的错误消息,直到您自己的源文件。我想知道错误到底发生在哪里...
  • @SergeBallesta 已编辑。

标签: python csv utf-8 pycharm reportlab


【解决方案1】:

从错误消息中我可以猜到您在 Windows 系统上使用 Python2.7。 Windows 是 unicode 友好的,但不是真正的 utf-8 友好。因此,您的源 csv 文件不太可能是 utf-8 编码的。另外错误信息还是提示:

'utf8' 编解码器无法解码位置 0

中的字节 0xfe

字节 0xfe 永远不能存在于 utf-8 编码文件中,既不能作为起始字节(低于 0xf8)也不能作为连续字节(低于 0xc0)。但它是 'ş' 的 windows-1254 代码页编码。所以我假设您的输入 csv 文件使用 windows-1254 字符集(Python 中的'cp1254'

另一方面,reportlab 只接受 utf8 编码的字符串或真正的 unicode 字符串。 可以做什么:

  • 在输入 reportlab 之前解码所有字符串(并传递 unicode 字符串):

    ...
    coding = 'cp1254'
    ...
        #info
        c.drawCentredString(150,100,barcode_name.decode(coding))
    
        #info
        c.drawCentredString(150,150, barcode_stf.decode(coding))
    
        #barkod numarasi
        c.drawCentredString(100,40,barcode_number.decode(coding))
        #down info (this one should already be utf8 encoded thanks to # -*- coding: utf-8 -*-
        c.drawCentredString(150,15,"1 adet ürün içerir. Contains 1 Piece. LOT:",)
    
  • 使用编解码器模块在读取时重新编码文件(并传递 utf8 编码的字符串)

    ...
    import csv
    import codecs
    
    coding = 'cp1254'                   # or change if current encoding is different
    
    data_file="variteks.csv"
    #attendee_data=csv.reader(open(data_file,"rb"))
    def pdf_creater(data_file):
        attendee_data=csv.reader(codecs.EncodedFile(open(data_file,"rb"), coding, 'utf8'))
        ...
    

【讨论】:

  • 我还有一个错误。 Attendee_data=csv.reader(codecs.EncodedFile(open(data_file,"rb"), coding, 'utf8')) NameError: global name 'coding' is not defined
  • @H.Can :我没有在第二个代码示例中编写它,但编码应该是 'cp1254' 就像在第一个代码中一样。无论如何,我已经用它编辑了我的答案......
  • 很抱歉打扰您,但我又遇到了错误。回溯(最后一次调用):文件“C:/Users/muhammedcan/PycharmProjects/mp1/muhammed_hamza_can.py”,第 65 行,在 pdf_creater() 文件“C:/Users/muhammedcan/PycharmProjects/mp1/muhammed_hamza_can .py”,第 55 行,在 pdf_creater c.drawCentredString(150,150,barcode_info.decode(coding)) 文件“C:\Python27\lib\encodings\cp1254.py”,第 15 行,在解码返回 codecs.charmap_decode(input, errors,decoding_table) UnicodeEncodeError: 'ascii' codec can't encode character u'\u015f' in position 0: ordinal not in range(128)
  • 以 0xFE 开头的文件也可以是大端编码的 UTF16。字节顺序标记(BOM)为 U+FEFF。
  • @MarkTolonen:这是我的第一个想法,但在解码barcode_stf 时出现错误,这不是第一个字段。
猜你喜欢
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多