PDF读写操作

# pdf_demo.py
# coding: utf-8
# 需要提前安装:pip install reportlab


from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
pdfmetrics.registerFont(TTFont('simsun', 'C:\WINDOWS\Fonts\simsun.ttc'))  # 导入字体文件,使用Windows字体或下载好的"simsun.ttf",用来显示中文


class ExportPDF:
    """
    Export a pdf file based on reportlab
    把要处理的文本result_list写成pdf文件
    """
    def __init__(self, result_list, output_path='out1.pdf', is_custom_color=False, color=(0.77, 0.77, 0.77), font_size=8, offset_x=5, offset_y=5):
        self.result_list = result_list
        self.output_path = output_path
        self.is_custom_color = is_custom_color
        self.font_size = font_size
        self.offset_x = offset_x
        self.offset_y = offset_y

    def save_string(self):
        """使用canvas把数据绘制到pdf文件,默认坐标从左下角开始,与屏幕坐标(右上角开始)相反,所以需要单独处理
        """
        c = canvas.Canvas(self.output_path, pagesize=A4)
        width, height = A4  # 使用默认的A4大小

        if self.is_custom_color:
            c.setFillColorRGB(color)  # 需要单独设置颜色时候使用

        new_height = height
        for line in self.result_list:
            c.setFont("simsun", self.font_size)  # 处理中文字体
            # 写入每一行的数据,每一行的y坐标需要单独处理,这里用总高度减去偏移量和字体高度,使得每一行依次写入文件
            new_height = new_height - self.offset_y - self.font_size
            print('write data: ', self.offset_x, new_height, line)
            c.drawString(self.offset_x, new_height, line)

        c.showPage()
        c.save()

    def save_text(self):
        """使用canvas把数据绘制到pdf文件,
        这是另一种写法,通过文本的方式写入,只需要定义原始写入坐标
        """
        c = canvas.Canvas(self.output_path, pagesize=A4)
        width, height = A4  # 使用默认的A4大小

        if self.is_custom_color:
            c.setFillColorRGB(color)  # 需要单独设置颜色时候使用

        c.setFont("simsun", self.font_size)  # 处理中文字体
        obj = c.beginText()  # 生成text对象
        obj.setTextOrigin(10, height-self.offset_y*20)  # 第一次写入位置,坐标自定义,注意高度需要调整
        for line in self.result_list:
            print('write data: ', line)
            obj.textLine(line)  # 写入文件

        c.drawText(obj)
        c.showPage()
        c.save()



def main():
    result_list = ['line1', 'line2', 'line3中文', 'line4继续']
    pdf = ExportPDF(result_list)
    # pdf.save_string()
    pdf.save_text()


if __name__ == "__main__":
    main()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值