将 UDF 应用到 for 循环中 - Python
Applying a UDF into a for loop - Python
PDF 示例: "Smith#00$Consolidated_Performance.pdf"
目标是根据文件名将书签添加到每个 PDF 的第 1 页。
(示例中的书签名称为 "Consolidated Performance")
import os
from openpyxl import load_workbook
from PyPDF2 import PdfFileMerger
cdir = "Directory of PDF" # Current directory
pdfcdir = [filename for filename in os.listdir(cdir) if filename.endswith(".pdf")]
def addbookmark(f):
output = PdfFileMerger()
name = os.path.splitext(os.path.basename(f))[0] # Split filename from .pdf extension
dp = name.index("$") + 1 # Find position of $ sign
bookmarkname = name[dp:].replace("_", " ") # replace underscores with spaces
output.addBookmark(bookmarkname, 0, parent=None) # Add bookmark
output.append(open(f, 'rb'))
output.write(open(f, 'wb'))
for f in pdfcdir:
addbookmark(f)
UDF 在应用于单个 PDF 时工作正常,但在代码底部放入循环时它不会添加书签。关于如何使 UDF 循环遍历 pdfcdir 中的所有 PDF 有什么想法吗?
我很确定您遇到的问题与循环无关。相反,您只传递文件名而不包括目录路径。它试图在脚本的当前工作目录(默认情况下脚本所在的目录)而不是您从中读取文件名的目录中打开这些文件。
因此,在调用您的函数时,将目录名与每个文件名连接起来。
for f in pdfcdir:
addbookmark(os.path.join(cdir, f))
PDF 示例: "Smith#00$Consolidated_Performance.pdf"
目标是根据文件名将书签添加到每个 PDF 的第 1 页。
(示例中的书签名称为 "Consolidated Performance")
import os
from openpyxl import load_workbook
from PyPDF2 import PdfFileMerger
cdir = "Directory of PDF" # Current directory
pdfcdir = [filename for filename in os.listdir(cdir) if filename.endswith(".pdf")]
def addbookmark(f):
output = PdfFileMerger()
name = os.path.splitext(os.path.basename(f))[0] # Split filename from .pdf extension
dp = name.index("$") + 1 # Find position of $ sign
bookmarkname = name[dp:].replace("_", " ") # replace underscores with spaces
output.addBookmark(bookmarkname, 0, parent=None) # Add bookmark
output.append(open(f, 'rb'))
output.write(open(f, 'wb'))
for f in pdfcdir:
addbookmark(f)
UDF 在应用于单个 PDF 时工作正常,但在代码底部放入循环时它不会添加书签。关于如何使 UDF 循环遍历 pdfcdir 中的所有 PDF 有什么想法吗?
我很确定您遇到的问题与循环无关。相反,您只传递文件名而不包括目录路径。它试图在脚本的当前工作目录(默认情况下脚本所在的目录)而不是您从中读取文件名的目录中打开这些文件。
因此,在调用您的函数时,将目录名与每个文件名连接起来。
for f in pdfcdir:
addbookmark(os.path.join(cdir, f))