28

我正在尝试打印当前目录中的所有 pdf。当我在 cmd ( ) 中调用这个 bash 脚本时singlepdf.sh'"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"' /t Gemeinde_348_BioID_842_alt.pdf一切正常。

multiplepdfs.sh使用此内容调用时:

declare -a pdfs=(*.pdf)

for pdf in ${pdfs[@]}; do
  echo -e "\nprinting **$pdf** with AcroRd32.exe...\n"
  '"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"' /t $pdf
  sleep 3
done

回声显示文件在循环中被正确寻址 - 但随后我收到错误"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe": No such file or directory

有人可以帮助解决这个问题吗?

编辑: 顺便说一句,我安装了 msys mingw

4

12 回答 12

44

我知道这是一个老问题,但我最近遇到了同样的问题,没有一个答案对我有用:

  • 找不到旧版福昕阅读器
  • 正如@pilkch 所说,2Printer 添加了一个报告页面
  • Adobe Reader 打开一个 gui

在搜索了更多之后,我发现了这个: http: //www.columbia.edu/~em36/pdftoprinter.html

这是一个简单的 exe,您可以使用文件名调用它并打印到默认打印机(或您指定的打印机)。从网站:

PDFtoPrinter 是一个从 Windows 命令行打印 PDF 文件的程序。该程序通常是为 Windows 命令行设计的,也可以与 vDos DOS 模拟器一起使用。

要将 PDF 文件打印到默认的 Windows 打印机,请使用以下命令:

PDFtoPrinter.exe filename.pdf

要打印到特定打印机,请将打印机名称添加到引号中:

PDFtoPrinter.exe filename.pdf "Name of Printer"

如果要打印到网络打印机,请使用出现在 Windows 打印对话框中的名称,如下所示(并注意名称开头的两个反斜杠和服务器名称后的单个反斜杠):

PDFtoPrinter.exe filename.pdf "\\SERVER\PrinterName"
于 2017-12-27T15:30:44.573 回答
11

我在使用 Acrobat Reader 完成这项任务时遇到了两个问题。

  1. 命令行 API 不受官方支持,因此它可能会在没有警告的情况下更改或删除。
  2. 向 Reader 发送打印命令会加载 GUI,但似乎无法阻止它。我需要该过程对用户透明。

我偶然发现了这个博客,它建议使用Foxit Reader。Foxit Reader 是免费的,API 几乎与 Acrobat Reader 相同,但关键是已记录并且不加载用于打印作业的 GUI。

提醒一句,不要不注意就直接点击安装过程,它也会尝试安装不相关的软件。为什么软件供应商还在这样做???

于 2014-03-20T07:38:53.530 回答
6

看起来您缺少打印机名称、驱动程序和端口 - 按此顺序。您的最终命令应类似于:

AcroRd32.exe /t <file.pdf> <printer_name> <printer_driver> <printer_port>

例如:

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /t "C:\Folder\File.pdf" "Brother MFC-7820N USB Printer" "Brother MFC-7820N USB Printer" "IP_192.168.10.110"

注意:要查找打印机信息,请右键单击您的打印机并选择属性。在我上面显示的情况下,打印机名称和驱动程序名称匹配 - 但您的信息可能会有所不同。

于 2013-10-30T23:31:22.207 回答
5

错误信息告诉你。

试一试

"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe" /t "$pdf"

当您将字符串括在单引号中时,这会使所有内容都包含在有效字符串中,包括"字符。通过删除单引号,shell 会将 dbl 引号作为字符串“包装器”处理。

我还将文件名变量包装在 dbl-quotes 中,以便您可以轻松处理名称中带有空格的文件,即

"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe" /t "$pdf"

IHTH

于 2013-10-01T20:38:55.660 回答
3

我在连续打印多个 PDF 文件时遇到了类似的问题,并且发现只有使用 2Printer 软件的解决方法。打印 PDF 文件的命令行示例:

2Printer.exe -s "C:\In\*.PDF" -prn "HP LasetJet 1100"

在http://doc2prn.com/上免费用于非商业用途

于 2014-08-14T20:34:15.380 回答
3

第一反应 - 想最终回馈一个有用的社区......

想要将此添加到仍在寻找简单解决方案的人们的回复中。我正在使用 Foxit Software 的免费产品 - FoxItReader。
这是与静默打印一起使用的版本的链接 - 较新版本的静默打印功能仍然无法正常工作。 FoxitReader623.815_Setup

FOR %%f IN (*.pdf) DO ("C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe" /t %%f "SPST-SMPICK" %%f & del %%f) 

我只是创建了一个命令来遍历目录并为每个 pdf 文件 (FOR %%f IN *.pdf) 静默打开阅读器 (/t) 获取下一个 PDF (%%f) 并将其发送到打印队列 ( SPST-SMPICK),然后在我将每个 PDF 发送到打印队列后删除它(del%%f)。Shashank 展示了一个将文件移动到另一个目录的示例,如果您需要这样做的话

FOR %%X in ("%dir1%*.pdf") DO (move "%%~dpnX.pdf" p/)
于 2017-10-18T12:46:08.303 回答
2

使用 Acrobat reader 不是一个好的解决方案,尤其是命令行属性没有记录。此外,Acrobat 阅读器的窗口在打印过程后保持打开状态。PDF 文件为打印机驱动程序所熟知,因此您可能会找到更好的工具,例如 2Printer.exe 或 RawFilePrinter.exe。在我看来,RawFilePrinter 有更好的支持和明确的许可流程(您只需支付一次捐款,您就可以在您喜欢的许多项目中重新分发 RawFilePrinter - 即使新版本也可以使用以前购买的许可)

RawFilePrinter.exe -p "c:\Users\Me\Desktop\mypdffile.pdf" "Canon Printer" 
IF %ERRORLEVEL% 1(
    echo "Error!"
)

最新版本下载:http ://bigdotsoftware.pl/index.php/rawfileprinter

于 2016-06-15T08:10:13.897 回答
1

这是另一个解决方案:

1)下载SumatraPDF(便携版)- https://www.sumatrapdfreader.org/download-free-pdf-viewer.html

2)创建一个类库工程,将SumatraPDF.exe解压到工程目录根目录下并解封。

3) 在项目属性中,转到资源选项卡并将 exe 添加为文件。

4)将以下类添加到您的库中:

public class SumatraWrapper : IDisposable
{
    private readonly FileInfo _tempFileForExe = null;
    private readonly FileInfo _exe = null;

    public SumatraWrapper()
    {
        _exe = ExtractExe();
    }

    public SumatraWrapper(FileInfo tempFileForExe)
        : this()
    {
        _tempFileForExe = tempFileForExe ?? throw new ArgumentNullException(nameof(tempFileForExe));
    }

    private FileInfo ExtractExe()
    {
        string tempfile = 
            _tempFileForExe != null ? 
            _tempFileForExe.FullName : 
            Path.GetTempFileName() + ".exe";

        FileInfo exe = new FileInfo(tempfile);
        byte[] bytes = Properties.Resources.SumatraPDF;

        using (FileStream fs = exe.OpenWrite())
        {
            fs.Write(bytes, 0, bytes.Length);
        }

        return exe;
    }

    public bool Print(FileInfo file, string printerName)
    {
        string arguments = $"-print-to \"{printerName}\" \"{file.FullName}\"";
        ProcessStartInfo processStartInfo = new ProcessStartInfo(_exe.FullName, arguments)
        {
            CreateNoWindow = true
        };
        using (Process process = Process.Start(processStartInfo))
        {
            process.WaitForExit();
            return process.ExitCode == 0;
        }
    }

    #region IDisposable Support
    private bool disposedValue = false; // To detect redundant calls

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                // TODO: dispose managed state (managed objects).
            }

            // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
            // TODO: set large fields to null.
            try
            {
                File.Delete(_exe.FullName);
            }
            catch
            {

            }

            disposedValue = true;
        }
    }

    // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
    // ~PdfToPrinterWrapper() {
    //   // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
    //   Dispose(false);
    // }

    // This code added to correctly implement the disposable pattern.
    public void Dispose()
    {
        // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
        Dispose(true);
        // TODO: uncomment the following line if the finalizer is overridden above.
        // GC.SuppressFinalize(this);
    }
    #endregion
}

5) 享受从您的代码中打印 pdf 文件的乐趣。

像这样使用:

FileInfo file = new FileInfo(@"c:\Sandbox\dummy file.pdf");
SumatraWrapper pdfToPrinter =
    new SumatraWrapper();
pdfToPrinter.Print(file, "My Printer");
于 2019-03-21T19:29:45.183 回答
1

以下批处理脚本应该可以实现您想要的。虽然它会在完成后让 Acrobat Reader 实例继续运行,但这不会在下次运行此脚本时造成任何问题。

@echo off
for %%f in (*.pdf) do (
  echo Printing %cd%\%%f with Adobe Acrobat Reader...
  start /b "Printing %%f" "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" /p /h "%cd%\%%f"
)

虽然之后您可以单独终止 Acrobat Reader 进程,但这可能会关闭您不想关闭的其他打开的 PDF 文档。

于 2021-03-25T14:04:00.073 回答
0
@ECHO off set "dir1=C:\TicketDownload" 
FOR %%X in ("%dir1%*.pdf") DO ( "C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe" /t "%%~dpnX.pdf" "Microsoft XPS Document Writer" ) 
FOR %%X in ("%dir1%*.pdf") DO (move "%%~dpnX.pdf" p/)

试试这个..可能是你有其他版本的阅读器所以这就是问题..

于 2014-05-23T09:45:23.927 回答
0

今天我一直在寻找这个解决方案,我尝试了我遇到问题的 PDFtoPrinter(我尝试打印的 PDF 表明他们使用了不正确的纸张尺寸,这会挂起打印作业并且在解决之前没有打印任何其他内容)。在我努力寻找替代方案的过程中,我想起了 GhostScript 和与之相关的实用程序。我找到了 GSView 及其相关程序 GSPrint(参考https://www.ghostscript.com/)。这两个都需要 GhostScript ( https://www.ghostscript.com/ ),但是当所有组件都安装好后,GSPrint 可以完美运行,我能够创建一个计划任务,可以在一夜之间自动打印 PDF。

于 2018-08-03T07:35:08.127 回答
-3

另一种“开箱即用”的解决方案

FOR %X in ("*.pdf") DO (C:\Windows\System32\print.exe /d:"\\printername" "%X.pdf")

编辑: 正如“huysentruitw”所提到的,这仅适用于 txt 文件!对不起 !

当我仔细检查时,我意识到我正在使用GhostScript,正如“Multiverse IT”所建议的那样。它看起来像这样:

"C:\Program Files (x86)\gs\gs\bin\gswin32c.exe" -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=mswinpr2 -sOutputFile="%printer%My-Printer-Name" "c:\My-Pdf-File.pdf"
于 2019-08-27T16:10:16.390 回答