首页 > 解决方案 > 我的脚本单独工作,但不能作为一个函数,为什么?

问题描述

晚上好,

我可能错过了一些非常愚蠢的事情,这使得我的项目比我计划的要慢得多。

name我编写了这个脚本,其功能是在现有 PDF 上编写一小段具有特定内容 ( ) 的格式化文本,然后它应该用新的水印输出覆盖输入文件。

覆盖部分让我有些头疼,所以我只是跳过它并将其设置为创建具有不同名称的双重副本。这是独立脚本:

from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4

## TEST LINE
name = 'PIANO'
page = '0.pdf'

# Create new file (stamp)
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=A4)
can.setFillColorRGB(0, 0, 0)
can.setFont('Helvetica', 8)
pageWidth, pageHeight = A4
can.drawString(pageWidth - 35, pageHeight - 20, f'{name}')
can.save()

# Move to the begin of StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)

# Reading input document
first_page = PdfFileReader(open(page, 'rb'), strict=False)
output = PdfFileWriter()

# Adding watermark and saving it to <NAME>_stamped.pdf
page = first_page.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)

with open(f'{name}_stamped.pdf', 'wb') as outputStream:
    output.write(outputStream)

如您所见,这非常简单。

当我尝试将此草案作为一个函数实现到我的项目中时,我会这样做:

def coverize(page: str, name: str):
    from PyPDF2 import PdfFileWriter, PdfFileReader
    import io
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import A4

    # Create new file (stamp)
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=A4)
    can.setFillColorRGB(0, 0, 0)
    can.setFont('Helvetica', 8)
    pageWidth, pageHeight = A4
    can.drawString(pageWidth - 35, pageHeight - 20, f'{name}')
    can.save()

    # Move to the begin of StringIO buffer
    packet.seek(0)
    new_pdf = PdfFileReader(packet)

    # Reading first page
    first_page = PdfFileReader(open(page, 'rb'), strict=False)
    output = PdfFileWriter()

    # Adding watermark and saving it to <NAME>_stamped.pdf
    page = first_page.getPage(0)
    page.mergePage(new_pdf.getPage(0))
    output.addPage(page)

    with open(page, 'wb') as outputStream:
        output.write(outputStream)

我尝试使用以下参数运行该函数:

DEBUGLINE - page:     c:\Users\francesco\Desktop\PYTHON\Reporter3\files_to_merge\1.pdf #type string
DEBUGLINE - name:     GM #type string

但我得到的只是这个输出:

Traceback (most recent call last):
  File "c:\Users\francesco\Desktop\PYTHON\Reporter3\launcher.py", line 7, in <module>
    askAndRun(isFirstTime)
  File "c:\Users\francesco\Desktop\PYTHON\Reporter3\view_controller.py", line 104, in askAndRun
    run_program(usr_choice)
  File "c:\Users\francesco\Desktop\PYTHON\Reporter3\view_controller.py", line 48, in run_program
    print_report(report, missing)
  File "c:\Users\francesco\Desktop\PYTHON\Reporter3\pdf_manager.py", line 54, in print_report
    coverize(local_strings[0], name)
  File "c:\Users\francesco\Desktop\PYTHON\Reporter3\coverize.py", line 41, in coverize
    with open(page, 'wb') as outputStream:
TypeError: expected str, bytes or os.PathLike object, not PageObject

我试图用打印语句、回溯、我能做的一切来调试它,但我真的不明白为什么它传递一个 PageObject(我猜它来自 PDF 库)而不是带有文件路径的字符串,而在独立脚本可以。

对我来说,整个程序的逻辑似乎是一个错误。

我希望我的问题可以更具体,但我真的无法弄清楚问题是什么,我希望有人可以帮助我。

标签: python

解决方案


您更改f'{name}_stamped.pdf'page. 如果你把它改回来,它应该可以工作。


推荐阅读