Python:TypeError:应为str、bytes或os.PathLike对象,而不是PdfileReader

Python:TypeError:应为str、bytes或os.PathLike对象,而不是PdfileReader,python,pdf,Python,Pdf,我有以下代码。这只是一个起点。稍后,我想用csv文件中的项目替换静态“Hello Word”文本,我读取并循环csv中的每个项目。 我希望每一页都有水印 #导入所需的模块 导入PyPDF2 输入io 从reportlab.pdfgen导入画布 从reportlab.lib.pagesizes导入信函 def添加_水印(wmFile,pageObj): #打开水印pdf文件 wmFileObj=open(wmFile'rb') #创建水印pdf文件的pdf阅读器对象 pdfReader=PyPDF

我有以下代码。这只是一个起点。稍后,我想用csv文件中的项目替换静态“Hello Word”文本,我读取并循环csv中的每个项目。 我希望每一页都有水印

#导入所需的模块
导入PyPDF2
输入io
从reportlab.pdfgen导入画布
从reportlab.lib.pagesizes导入信函
def添加_水印(wmFile,pageObj):
#打开水印pdf文件
wmFileObj=open(wmFile'rb')
#创建水印pdf文件的pdf阅读器对象
pdfReader=PyPDF2.PdfFileReader(wmFileObj)
#将水印pdf的第一页与传递的页面对象合并。
pageObj.mergePage(pdfReader.getPage(0))
#关闭水印pdf文件对象
wmFileObj.close()
#返回带水印的页面对象
返回页面OBJ
def main():
导入PyPDF2
输入io
从reportlab.pdfgen导入画布
从reportlab.lib.pagesizes导入信函
#水印pdf文件名
packet=io.BytesIO()
#使用Reportlab创建新的PDF
canvas.canvas(数据包,页面大小=字母)
can.setFont('Helvetica-Bold',18)
抽绳(10100,“你好,世界”)
can.showPage()
can.save()
#移动到StringIO缓冲区的开头
包搜索(0)
mywatermark=PyPDF2.PdfFileReader(数据包)
#原始pdf文件名
origFileName='Module1.pdf'
#新的pdf文件名
newFileName='watermarked_example.pdf'
#创建原始pdf的pdf文件对象
pdfFileObj=open(origFileName,'rb')
#创建pdf阅读器对象
pdfReader=PyPDF2.PdfileReader(PdfileObj)
#为新pdf创建pdf writer对象
pdfWriter=PyPDF2.PdfileWriter()
#向每个页面添加水印
对于范围内的页面(pdfReader.numPages):
#创建带水印的页面对象
wmpageObj=添加水印(mywatermark,pdfReader.getPage(第页))
#将带水印的页面对象添加到pdf writer
pdfWriter.addPage(wmpageObj)
#新的pdf文件对象
newFile=open(newFileName,'wb')
#将带水印的页面写入新文件
pdfWriter.write(新文件)
#关闭原始pdf文件对象
pdfFileObj.close()
#关闭新的pdf文件对象
newFile.close()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
我得到的错误是:

Traceback (most recent call last):
  File "watermark.py", line 101, in <module>
    main()
  File "watermark.py", line 83, in main
    wmpageObj = add_watermark(mywatermark, pdfReader.getPage(page))
  File "watermark.py", line 32, in add_watermark
    wmFileObj = open(wmFile, 'rb')
TypeError: expected str, bytes or os.PathLike object, not PdfFileReader
回溯(最近一次呼叫最后一次):
文件“watermark.py”,第101行,在
main()
文件“watermark.py”,第83行,主
wmpageObj=添加水印(mywatermark,pdfReader.getPage(第页))
文件“watermark.py”,第32行,添加水印
wmFileObj=open(wmFile'rb')
TypeError:应为str、bytes或os.PathLike对象,而不是PdfileReader
我相信我明白了这一点,它需要一个字符串、字节或文件,我不写,它只是一个“对象”

我尝试了几件事,但不管我怎么做,都会让事情变得更糟:-(

有人能帮忙吗?我很确定这只是一件小事,因为我擅长监督显而易见的事情

感谢您的帮助


谢谢

我将把指南和缺陷留到最后,下面是如何修复这段代码:

1) 将变量“packet”设置为脚本所在目录中的现有PDF文件名:

packet = 'my_watermark.pdf'
2) 删除移动到“stringIO”缓冲区开头的代码(就像我们需要它一样):

3) 在for循环块中,将“packet”作为参数而不是“mywatermark”:

wmpageObj = add_watermark(packet, pdfReader.getPage(page))
4) 从add_watermark函数delete file opening和closings中,只保留PdfileReader实例的构造,但参数为“wmFile”:

wmFileObj = open(wmFile, 'rb')                # delete this
pdfReader = PyPDF2.PdfFileReader(wmFile)      # let this be, but change wmFileObj to wmFile
pageObj.mergePage(pdfReader.getPage(0))       # let this be
wmFileObj.close()                             # delete this
return pageObj                                # let this be  

另外,在您的代码中,主函数中有导入,请将它们移到文件的开头,并阅读一些文档。”s的文档展示了如何合并页面(这是模块的特色tbh),虽然它有点简洁,但另一方面,它的用户指南非常全面,但简单明了。始终尝试查看代码背后的含义。

错误消息告诉您
add\u watermark
中的
wmFile
应该是文件的路径,而不是
PdfFileReader
对象。您正在此处传递一个
PdfFileReader
对象:
wmpageObj=add\u水印(mywatermark,pdfReader.getPage(page))
。你在这里创建对象:
mywatermark=PyPDF2.PdfFileReader(packet)
。谢谢@J.Owens,我已经知道了,但正在努力创建对象,或者更好:创建文件你已经打开了你试图传递的对象。你为什么再打开它?只需去掉顶部的前两行function@MadPhysicist这不起作用,因为下一行需要我注释掉的“pdfReader”,close语句也是如此。我应该说,我是从我找到的片段中复制代码的,我没有从头开始自己做。将水印设置为现有PDF不是我想要的。如前所述,我希望(稍后)通过一个带有名称的csv解析,并为每个名称创建一个版本,因此没有固定的水印。pdf您只需将文件放在目录中,只需将一个pdf文档放在具有该名称的目录中即可。在main()函数的开头,ypu将使用“hello world”或csv文件中的任何其他值覆盖它。无论如何,如果要在每个页面上添加不同的水印,则每次创建新页面时都必须覆盖该pdf。请阅读相关文件。
wmFileObj = open(wmFile, 'rb')                # delete this
pdfReader = PyPDF2.PdfFileReader(wmFile)      # let this be, but change wmFileObj to wmFile
pageObj.mergePage(pdfReader.getPage(0))       # let this be
wmFileObj.close()                             # delete this
return pageObj                                # let this be