python - 我的脚本单独工作,但不能作为一个函数,为什么?
问题描述
晚上好,
我可能错过了一些非常愚蠢的事情,这使得我的项目比我计划的要慢得多。
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 库)而不是带有文件路径的字符串,而在独立脚本可以。
对我来说,整个程序的逻辑似乎是一个错误。
我希望我的问题可以更具体,但我真的无法弄清楚问题是什么,我希望有人可以帮助我。
解决方案
您更改f'{name}_stamped.pdf'
为page
. 如果你把它改回来,它应该可以工作。
推荐阅读
- opencv - 在透明背景上绘制
- oracle-apex - 单击 Apex 5 中的按钮后如何保存复选框字段的选中状态?
- python - 如何计算 Pandas 数据框中新的“标准化”列?
- css - 如何摆脱 React 中的右边距?
- node.js - URL查询字符串中的连续双斜杠被解析为1个斜杠,NodeJs Express
- php - 如何检查是否已通过 WooCommerce 中的管理员修改了已付款订单
- python - `importlib.reload` 不会替换模块的 `__dict__` 中的对象
- c# - c#datatable用空格替换重复值
- python - Matplotlib - 在离散颜色变化的地方准确放置刻度
- android - 如何以角度剪辑ImageView?