it-swarm.com.de

Drucken von PDFs über die Windows-Befehlszeile

Ich versuche, alle PDF-Dateien im aktuellen Verzeichnis auszudrucken. Wenn ich dieses bash-Skript in cmd (singlepdf.sh) aufrufe: '"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"' /t Gemeinde_348_BioID_842_alt.pdf funktioniert alles einwandfrei.

Beim Aufruf von multiplepdfs.sh mit diesem Inhalt:

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

Das Echo zeigt, dass Dateien in der Schleife richtig angesprochen werden - aber dann erhalte ich die Fehlermeldung "C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe": No such file or directory 

Kann jemand bei diesem Problem helfen?

Edit: Übrigens, ich habe msys mingw installiert

11
Kay

Ich weiß, das ist eine alte Frage, aber ich hatte kürzlich das gleiche Problem und keine der Antworten hat für mich funktioniert:

  • Eine alte Foxit Reader-Version konnte nicht gefunden werden
  • Als @pilkch fügt 2Printer eine Berichtsseite hinzu
  • Adobe Reader öffnet eine GUI 

Nachdem ich ein wenig mehr gesucht hatte, fand ich Folgendes: http://www.columbia.edu/~em36/pdftoprinter.html .

Es ist ein einfaches Exe, das Sie mit dem Dateinamen aufrufen und auf dem Standarddrucker (oder einem von Ihnen angegebenen Drucker) ausgeben .. _. Von der Site:

PDFtoPrinter ist ein Programm zum Drucken von PDF -Dateien über die Windows-Befehlszeile. Das Programm ist allgemein für die Windows-Befehlszeile und auch für die Verwendung mit dem vDos-DOS-Emulator konzipiert.

Verwenden Sie den folgenden Befehl, um eine PDF -Datei auf dem Standard-Windows-Drucker zu drucken:

PDFtoPrinter.exe filename.pdf

Um auf einem bestimmten Drucker zu drucken, fügen Sie den Namen des Druckers in Anführungszeichen ein:

PDFtoPrinter.exe filename.pdf "Name of Printer"

Wenn Sie auf einem Netzwerkdrucker drucken möchten, verwenden Sie den Namen, der in Windows-Druckdialogen angezeigt wird (und achten Sie auf die beiden umgekehrten Schrägstriche am Anfang des Namens und den einzelnen umgekehrten Schrägstrich nach dem Servernamen):

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

Ich hatte zwei Probleme mit Acrobat Reader für diese Aufgabe.

  1. Die Befehlszeilen-API wird nicht offiziell unterstützt. Daher kann sie ohne Warnung geändert oder entfernt werden.
  2. Senden Sie einen Druckbefehl an Reader, um die GUI zu laden, scheinbar gibt es keine Möglichkeit, dies zu verhindern. Ich brauchte den Prozess, um für den Benutzer transparent zu sein.

Ich bin über dieses blog gestolpert, das die Verwendung von Foxit Reader vorschlägt. Foxit Reader ist kostenlos, die API ist fast identisch mit Acrobat Reader, wird jedoch entscheidend dokumentiert und lädt die GUI für Druckaufträge nicht.

Ein Wort der Warnung: Klicken Sie nicht einfach durch den Installationsvorgang, ohne darauf zu achten, sondern versucht, nicht zusammenhängende Software zu installieren. Warum machen Softwarehersteller das immer noch ???

7
kim3er

Erste Antwort - wollte endlich einer hilfreichen Community etwas zurückgeben ...

Wollte dies zu den Antworten für Leute hinzufügen, die noch nach einer einfachen Lösung suchen. Ich verwende ein kostenloses Produkt von Foxit Software - FoxItReader.
Hier ist der Link zu der Version, die mit dem unbeaufsichtigten Druck funktioniert. In neueren Versionen funktioniert die Funktion für unbeaufsichtigtes Drucken immer noch nicht. 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) 

Ich habe einfach einen Befehl zum Durchlaufen des Verzeichnisses erstellt und für jede PDF-Datei (FOR %% f IN * .pdf) den Reader im Hintergrund öffnen (/ t), um die nächste zu erhalten PDF (%% f ) und senden Sie es an die Druckerwarteschlange (SPST-SMPICK), und löschen Sie dann jeweils PDF nach dem Senden an die Druckerwarteschlange (del %% f). Shashank zeigte ein Beispiel für das Verschieben der Dateien in ein anderes verzeichnis wenn das was du tun musst

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

Die Verwendung von Acrobat Reader ist keine gute Lösung, insbesondere werden Befehlszeilenattribute nicht dokumentiert. Außerdem bleibt das Acrobat Reader-Fenster nach dem Druckvorgang geöffnet. PDF -Dateien sind den Druckertreibern bekannt, daher finden Sie möglicherweise bessere Tools wie 2Printer.exe oder RawFilePrinter.exe. Meiner Meinung nach bietet RawFilePrinter einen besseren Support und einen klaren Lizenzierungsprozess (Sie zahlen einmalig und können RawFilePrinter in vielen Projekten, die Sie mögen, weiterverteilen - sogar neue Versionen funktionieren mit zuvor erworbener Lizenz.)

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

Letzte Version zum Download: http://bigdotsoftware.pl/index.php/rawfileprinter

3
zuko

Sieht so aus, als würden Sie den Druckernamen, den Treiber und den Port in dieser Reihenfolge vermissen. Ihr letzter Befehl sollte folgendermaßen aussehen:

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

Zum Beispiel:

"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"

Hinweis: Um die Druckerinformationen zu finden, klicken Sie mit der rechten Maustaste auf Ihren Drucker und wählen Sie Eigenschaften. In meinem oben gezeigten Fall stimmen der Druckername und der Treibername überein - Ihre Informationen können jedoch abweichen.

3
rhp997

Die Fehlermeldung informiert Sie.

Versuchen Sie es einfach 

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

Wenn Sie die Zeichenfolge in einfache Anführungszeichen setzen, wird alles innerhalb einer gültigen Zeichenfolge erstellt, einschließlich der Zeichen ". Durch das Entfernen der einfachen Anführungszeichen verarbeitet die Shell die dbl-Anführungszeichen als "Wrapper". 

Ich würde die Dateinamenvariable auch in dbl-quotes einschließen, damit Sie Dateien mit Leerzeichen in ihren Namen problemlos verarbeiten können, d.

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

IHTH

3
shellter

Ich hatte ein ähnliches Problem beim Drucken mehrerer PDF -Dateien in einer Reihe und fand nur eine Problemumgehung mithilfe der 2Printer-Software. Befehlszeilenbeispiel zum Drucken von PDF -Dateien:

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

Es ist kostenlos für nicht-kommerzielle Zwecke unter 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/)

Versuchen Sie dies .. Vielleicht haben Sie eine andere Version von Reader, so dass das Problem ist ..

1
Shashank Bhat

Heute habe ich nach genau dieser Lösung gesucht und PDFtoPrinter ausprobiert, mit dem ich ein Problem hatte (die PDFs, die ich beim Drucken versuchte, legten nahe, dass sie ein falsches Papierformat verwendeten, das den Druckauftrag aufhob und nichts anderes gedruckt wurde, bis das Problem gelöst war). In meinem Bemühen, eine Alternative zu finden, erinnerte ich mich an GhostScript und die damit verbundenen Dienstprogramme. Ich fand GSView und das dazugehörige Programm GSPrint (Referenz https://www.ghostscript.com/ ). Für beide ist GhostScript erforderlich ( https://www.ghostscript.com/ ). Wenn jedoch alle Komponenten installiert sind, funktionierte GSPrint einwandfrei und ich konnte eine geplante Aufgabe erstellen, mit der PDFs über Nacht automatisch gedruckt wurden.

1
Multiverse IT

Hier ist eine andere Lösung:

1) Laden Sie SumatraPDF (portable version) - https://www.sumatrapdfreader.org/download-free-pdf-viewer.html herunter

2) Erstellen Sie ein Klassenbibliotheksprojekt und entpacken Sie die Datei "SumatraPDF.exe" in das Projektverzeichnis "root" und entsperren Sie sie.

3) Gehen Sie in den Projekteigenschaften zur Registerkarte Resoruces und fügen Sie die Exe als Datei hinzu.

4) Fügen Sie Ihrer Bibliothek die folgende Klasse hinzu:

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) Viel Spaß beim Drucken von PDF-Dateien aus Ihrem Code.

Verwenden Sie wie folgt:

FileInfo file = new FileInfo(@"c:\Sandbox\dummy file.pdf");
SumatraWrapper pdfToPrinter =
    new SumatraWrapper();
pdfToPrinter.Print(file, "My Printer");
1
Mike Cheel

Eine andere Lösung "out of the box"

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

0
Julien