使用Python创建PDF文件,翻页出现问题?

如题:创建到第二页的时候出现image.png
代码如下:

   directory, filter_str = QFileDialog.getOpenFileName(self, "选取文件", "./", "Text Files (*.doc);;Text Files (*.docx);;All Files (*)")
        doc = Document(directory)
        path=os.getcwd()+"/pdfFile"
        if not os.path.exists(path):
            os.makedirs(path)
        text=''
        self.btn2.setEnabled(False)
        font_path ='WenQuanYiMicroHei.ttf'
        font_name='WenQuanYiMicroHei'
        pdfmetrics.registerFont(TTFont(font_name, font_path))
        pdf=canvas.Canvas(path+'/example.pdf',pagesize=letter)
        font_size=12
        y=750
        pdf.setFont(font_name, size=font_size)
        for paragraph in doc.paragraphs:
            text=paragraph.text
            lines = text.split('\n')
            for line in lines:
                pdf.saveState()
                pdf.drawString(10,y,line)
                pdf.restoreState()
                y-=20
                if y<=0:
                    y=750
                    pdf.showPage()

        pdf.save()
        QMessageBox.information(self, "文件转换完成!", f"写入DOC文件结束,共计{len(text.encode())}个字")
        self.btn2.setEnabled(True)

问题出现在哪里?
补充问题:现在发现不是打印Y轴问题,问题是只要是中文就会出现黑块,不知道什么原因?

阅读 509
avatarAI BotBETA

回答

问题出现在翻页逻辑处理部分。在你的代码中,翻页的条件 if y <= 0: 只在处理完整个段落的所有行之后才检查一次。这意味着,如果某个段落的内容不足以填满一页(即 y 的值没有递减到小于或等于0),那么即使页面空间已经不足以容纳更多内容,程序也不会立即翻页。这可能导致第二页(或后续页)的内容从错误的位置开始,或者内容重叠。

解决方案

你需要调整翻页逻辑,确保在每次尝试写入新行之前检查当前页面是否有足够的空间。这里有一个改进后的代码片段:

# ...(之前的代码保持不变)

for paragraph in doc.paragraphs:
    text = paragraph.text
    lines = text.split('\n')
    for line in lines:
        # 检查是否有足够的空间写入当前行
        if y <= 40:  # 预留一些边距,避免内容太靠近页面底部
            y = 750  # 重置y坐标到页面顶部
            pdf.showPage()  # 翻页
        
        pdf.drawString(10, y, line)
        y -= 20  # 移动y坐标到下一行的位置

# ...(之后的代码保持不变)

在这个修改中,我设置了一个条件 if y <= 40: 来检查是否有足够的空间写入新行。这个值(40)可以根据你的字体大小和所需的底部边距进行调整。如果空间不足,代码会重置 y 到页面顶部并调用 pdf.showPage() 来翻页。这样可以确保内容不会重叠,并且每页的内容都是从页面的顶部开始。

此外,你的消息框中显示的字符数计算方式 len(text.encode()) 可能不是你想要的,因为它计算的是字节数而不是字符数。如果你想要显示字符数,应该使用 len(text)

1 个回答

问题解决!
分析原因,可能原因是for循环下每更换一个页面,同时清除内存,也因此导致里面字体设置没有了,就出现中文黑块
因此修改如下代码:

  pdf.setFont(font_name, size=font_size)
        for paragraph in doc.paragraphs:
            text=paragraph.text
            lines = text.split('\n')
            for line in lines:
                if y<=20:
                    pdf.showPage()
                    pdf.setFont(font_name, size=font_size)
                    y = 750
                pdf.drawString(10, y, line)
                y -= 20

重点是需要更换新页面之后,重新设置字体

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏