当前位置: 首页 > 知识库问答 >
问题:

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

严瀚昂
2025-02-18

如题:创建到第二页的时候出现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轴问题,问题是只要是中文就会出现黑块,不知道什么原因?

共有2个答案

奚翰海
2025-02-18

问题解决!
分析原因,可能原因是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

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

叶炜
2025-02-18

回答

问题出现在翻页逻辑处理部分。在你的代码中,翻页的条件 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)

 类似资料:
  • 这段代码第一次可以运行得很好,但是当我第二次运行app时,它不会立即生成PDF文件。

  • 问题内容: 我想使用python创建一个带有路径的文件。我一直在使用where 。我一直在寻找的非目录版本,但是却找不到任何东西。是否有类似这样的工具可以创建文件而无需打开文件,也无需使用系统或popen /subprocess? 问题答案: 有没有方法来创建,而无需打开文件时,它 有( 但它需要在OSX root权限 )。创建文件的系统调用实际上带有该标志。因此,无论如何,您将始终打开文件。 因

  • 问题内容: 我想要一个多页的pdf文件,并每页创建单独的pdf文件。 我已经下载了reportlab并浏览了文档,但它似乎是针对pdf生成的。我还没有看到有关处理PDF文件本身的任何信息。 有没有一种简单的方法可以在python中做到这一点? 问题答案: 等等

  • 问题内容: 为什么不行: 该代码可以正常工作,但无法打开.pdf文件。普通文本文件和pdf有什么区别?如果我想在python中创建并写入pdf文件怎么办? 问题答案: 您可以安装fpdf库,然后:

  • 问题内容: 此功能无效,并引发错误。我是否需要更改任何参数或参数? 问题答案: 如果文件不存在,将失败。 您可以使用,如果该文件不存在,则会创建该文件,但是它将截断现有文件。 另外,您可以使用; 如果该文件不存在,则会创建该文件,但不会截断现有文件。

  • 问题内容: 在熊猫中为数据框生成PDF的有效方法是什么? 问题答案: 一种方法是使用markdown。您可以使用。这会将数据框转换为html表。从那里,您可以将生成的html放入markdown文件(.md)(请参阅http://daringfireball.net/projects/markdown/basics)。从那里开始,有一些实用程序可以将markdown转换为pdf(https://w

  • 几天前不小心删了chrome浏览器,重装后出现问题,今天运行python代码时出现 init() got an unexpected keyword argument 'executable_path’ 错误,以前没有出现过的,于是我执行 后,出现更严重的问题 这个问题困扰我几天了,昨天重装浏览器后好了一阵,跑我的python代码没问题,今天又出现了前面提到的问题