【问题标题】:VBA - Macro - To Print Multiple digital signed PDF file and save it in subfolder by using "Microsoft Print to PDF" PrinterVBA - 宏 - 使用“Microsoft Print to PDF”打印机打印多个数字签名的 PDF 文件并将其保存在子文件夹中
【发布时间】:2021-07-11 06:13:07
【问题描述】:

我正在通过“Microsoft 打印到 PDF”(编辑文档)将多个数字签名的 PDF 文件打印成 PDF。下面提到的 VBA 代码运行良好。但是每次运行此代码时,它都会询问文件名和目标文件夹以获取打印文件。

我的期望:

它必须从我们包含在 VBA 代码中的现有保存文档文件名和目标文件夹路径中捕获文件名。 请帮助我,如何解决这个问题

Public Sub Print_All_PDF_Files_in_Folder()
    Dim folder As String
    Dim PDFfilename As String
    
    folder = "C:\Users\Desktop\VBA\"    'CHANGE AS REQUIRED
    If Right(folder, 1) <> "\" Then folder = folder & "\"
       
    PDFfilename = Dir(folder & "*.pdf", vbNormal)
    While Len(PDFfilename) <> 0
        Print_PDF folder & PDFfilename
        PDFfilename = Dir()  ' Get next matching file
    Wend
End Sub

Private Sub Print_PDF(sPDFfile As String)
    Shell "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe /p /h " & Chr(34) & sPDFfile & Chr(34), vbNormalFocus
End Sub

【问题讨论】:

  • 你看到这个解决方案了吗? stackoverflow.com/questions/50906669/…
  • Please do modification this code, so it can save all files into sub-folder without manual intervention 抱歉,它不能这样工作。我想你可能误解了 stackoverflow 的运作方式。您可能想查看How do I ask a good question? 请发布您迄今为止尝试过的内容。我没有看到任何用于保存文件的代码。只为打开它。在发布 1. 时请记住这些内容。您期待什么? 2. 什么不工作?如果适用,请包含错误消息,我们将从那里获取它:)
  • 对不起 Siddharth Rout,我已经编辑了我的问题。希望它现在会清除。

标签: vba pdf


【解决方案1】:

带空格的路径必须用引号引起来,因为它有空格。键 /p 和 /h 必须与程序名称分开。我这样检查: 我在 cmd.exe 中创建这个命令,当我看到它正确时 - 我将它重新写入宏。

Private Sub Print_PDF(sPDFfile As String)
    Shell "" & Chr(34) & "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" & Chr(34) & " /p /h " & Chr(34) & sPDFfile & Chr(34)
End Sub

【讨论】:

  • 感谢 Waleron 的回复。它仍然要求文件名打印文件。我希望它必须从现有文件名中自动捕获。
  • @BoovanKannan 我为你重写了我的答案 - 这是正确的吗?
  • 对不起@Waleron,这段代码也可以正常工作。但它询问每个文件的文件名(我手动给出文件名)。它需要从现有文件名中捕获。
【解决方案2】:

您似乎有多个冲突

您的命令包括打开打印机对话框的命令

/P &lt;filename&gt; - 打开并直接进入打印机提示对话框

对于“Microsoft Print to PDF”,您可以对 PDF 进行所需的手动更改,然后手动保存到您选择的文件夹或文件名。

但是您说您希望 Acrobat 在没有该提示的情况下保存为已知文件名。这反过来又让我质疑为什么要使用 Acrobat 打开 PDF 并将其重新保存为文件名而不进行交互?

您只需重命名 PDF 即可,无需在 Acrobat 中打开它。

在 Acrobat 中以编程方式打开“复杂”PDF 并使用“Microsoft Print to PDF”重新打印为“Dumber”PDF 的一个优点是,它可以伪狂地模拟更有效的扁平化方法,使用效率非常低的转载并为此您需要使用:-

/T &lt;filename&gt; &lt;printername&gt; &lt;drivername&gt; &lt;portname&gt; - 在指定的打印机上打印文件。

其中打印机名称和驱动程序名称是“Microsoft Print to PDF”,portname 是您希望打印的位置。

从命令行处理 PDF 的方式要简单得多,但如果您已经安装了重量级的 Adob​​e Reader,那么这是事实上的标准。

[EDIT] 在 cmets 中您暗示您仍然需要使用 acrobat 进行处理,然后才能打印到固定名称。那么在这种情况下,您需要先运行这些操作。在另存为新的 PDF 之前,在打印之前,因此您需要

  1. 获取文件名
  2. 进行更改
  3. 将更改另存为新文件名
  4. 使用以下方式将新文件名发送到打印机:-
"C:\Full path\to\AcroRd32.exe" /T "C:\path to\Input.pdf" "Microsoft Print to PDF" "Microsoft Print to PDF" "C:\path to\Output.pdf"

使用 /T = TSR (Terminate and Stay Resident) 批量打印的问题是窗口保持打开等待批处理中的下一次打印,然后大多数用户添加 /H隐藏它,然后抱怨它无法访问以便在批处理结束时关闭(只需要 sendkeys %FX 或 Alt+F4 来关闭打开的窗口)! 一种方法是,在最后一次打印时调用 /T 而没有 H,然后以 VB 为中心的命令(object.AppActivate 标题)和最简单的 sendkeys %FX 将关闭窗口。

如果使用命令行或 .cmd,将 Wscript 与单行 .VBS 命令一起使用很简单,但是在这种情况下,您已经在使用 VBA。

【讨论】:

  • 嗨 @KJ 我正在打印 PDF,因为所有文件都是数字签名的副本。所以我不能附上其他一些文件。如果在“Microsoft Print to PDF”中打印,我可以附加或编辑。在这里,我有 100 多个 pdf 文件。所以我不能手动给出文件名。您提出了一些解决方案,对不起,我没有太多的知识来理解这一点。感谢您的时间和回复。
  • 如果您不介意,您能否提供完整的代码,我不知道在哪里修改您的解决方案。感谢您的时间和精力。
猜你喜欢
  • 2019-10-10
  • 2021-06-06
  • 2015-01-28
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2017-07-04
相关资源
最近更新 更多