web-dev-qa-db-ja.com

WindowsコマンドラインからPDFを印刷する

現在のディレクトリにあるすべてのPDFを印刷しようとしています。このbashスクリプトをcmd(_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をインストールしています

15
Kay

私はこれが古い質問であることを知っていますが、最近同じ問題に直面しましたが、答えはどれもうまくいきませんでした:

  • 古いFoxit Readerバージョンが見つかりませんでした
  • @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の印刷ダイアログに表示される名前を使用します(名前の先頭にある2つの円記号と、サーバー名の後の1つの円記号に注意してください)。

PDFtoPrinter.exe filename.pdf "\\SERVER\PrinterName"
19
scripts

このタスクにAcrobat Readerを使用すると、2つの問題が発生しました。

  1. コマンドラインAPIは公式にはサポートされていないため、警告なしに変更または削除される可能性があります。
  2. Readerに印刷コマンドを送信すると、GUIがロードされますが、それを防ぐ方法はないようです。ユーザーに対して透過的なプロセスが必要でした。

私はこれを偶然見つけました blog 、これは Foxit Reader の使用を示唆しています。 Foxit Readerは無料で、APIはAcrobat Readerとほぼ同じですが、文書化されており、印刷ジョブのGUIをロードしません。

警告の言葉、注意を払わずにインストールプロセスをクリックするだけでなく、無関係なソフトウェアもインストールしようとします。なぜソフトウェアベンダーはまだこれをしているのですか???

7
kim3er

最初の回答-役立つコミュニティに最終的に返品したかった...

単純な解決策をまだ探している人々の回答にこれを追加したかった。 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)に送信し、印刷キュー(del %% f)に送信した後、各PDF)を削除します。Shashankはファイルの移動例を示しました別のディレクトリに移動する必要がある場合

FOR %%X in ("%dir1%*.pdf") DO (move "%%~dpnX.pdf" p/)
4
Michael Gargan

Acrobat Readerを使用することは良い解決策ではありません。特にコマンドラインの属性は文書化されていません。さらに、Acrobatリーダーのウィンドウは、印刷プロセス後に開いたままになります。 PDFファイルはプリンタドライバでよく知られているので、2Printer.exeやRawFilePrinter.exeなどの優れたツールを見つけることができます。好きな多くのプロジェクトでRawFilePrinterを再配布できます-新しいバージョンでも以前に購入したライセンスで動作します)

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

ダウンロードする最新バージョン: http://bigdotsoftware.pl/index.php/rawfileprinter

3
zuko

プリンタ名、ドライバ、ポートがこの順序で欠落しているようです。最終的なコマンドは次のようになります。

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"

注:プリンター情報を見つけるには、プリンターを右クリックしてプロパティを選択します。上記の私の場合、プリンター名とドライバー名は一致していますが、情報は異なる場合があります。

3
rhp997

エラーメッセージが表示されます。

ちょうど試してください

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

文字列を一重引用符で囲むと、"文字を含むすべてが有効な文字列内に含まれます。単一引用符を削除することにより、シェルはdbl引用符を文字列「ラッパー」として処理します。

また、ファイル名変数をdbl引用符で囲むと、名前にスペースが含まれるファイルを簡単に処理できます。

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

IHTH

3
shellter

複数のPDFファイルを連続して印刷すると同様の問題が発生し、2Printerソフトウェアを使用することでのみ回避策が見つかりました。PDFファイル:

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

http://doc2prn.com/ で非営利目的で使用する場合は無料です

3
Lei
@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/)

これを試してみてください。他のバージョンのReaderを使用している可能性があります。

1
Shashank Bhat

今日、私はこのまさに解決策を探していましたが、問題のあるPDFtoPrinterを試しました(印刷しようとしたPDFが間違った用紙サイズを使用していたため、印刷ジョブがハングし、解決するまで他に何も印刷されませんでした)。代替案を見つける努力の中で、GhostScriptとそれに関連するユーティリティを思い出しました。 GSViewを見つけましたが、関連するプログラムGSPrintです(参照 https://www.ghostscript.com/ )。どちらもGhostScript( https://www.ghostscript.com/ )を必要としますが、すべてのコンポーネントをインストールすると、GSPrintは問題なく機能し、PDFを夜間に自動的に印刷するスケジュールタスクを作成できました。

1
Multiverse IT

別のソリューションを次に示します。

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");
1
Mike Cheel

「すぐに使える」別のソリューション

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

0
Julien