2016-12-05 4 views
0

Ich bin in einer Windows10-Umgebung ausgeführt. Mein PHP-Skript schreibt eine PDF-Datei und ich möchte einfach, dass die Datei in dem von mir angegebenen PDF-Viewer geöffnet wird. Ich verwende die "runAsynchronously" -Funktion, die im PHP-Handbuch angegeben ist, und habe viele Variationen ausprobiert. Ich habe kein Problem damit, den Prozess im Hintergrund laufen zu lassen - er erscheint jedes Mal in meiner TaskManager Prozessliste, aber es erscheint kein Fenster - was mache ich falsch? Wenn ich auf die Link-Datei doppelklicke, die geschrieben wurde, funktioniert es gut. Es hat nichts mit dem Pfad zu der ausführbaren Datei oder dem Dateinamen zu tun - ich kann den PDF-Viewer durch "notepad.exe" und die $ -Datei mit einer geeigneten Textdatei ersetzen - das gleiche passiert, Notizblock erscheint als ein Prozess, aber nicht als ein Fenster, und die Verbindung funktioniert gut.Starten eines externen Programms von PHP

Hier sind einige Code-Schnipsel

$cmd = "C:\\Program Files (x86)\\SumatraPDF\\SumatraPDF.exe"; 
runAsynchronously($cmd, $file, 7, null, true); 

function runAsynchronously($path, $arguments, $windowstyle=1, $lnkfile=null, $exec=true) { 
    $tmp = (is_null($lnkfile)) ? 'C:\temp\temp.lnk' : $lnkfile; 
    try { 
     if(file_exists($tmp)) { unlink($tmp); } 
     $WshShell = new COM("WScript.Shell"); 
     $oShellLink = $WshShell->CreateShortcut($tmp); 
     $oShellLink->TargetPath = $path; 
     $oShellLink->Arguments = $arguments; 
     $oShellLink->WorkingDirectory = dirname($path); 
     $oShellLink->WindowStyle = 1; 
     $oShellLink->Save(); 
     $waitforcompletion = false; 
     if($exec) { 
       // Run kicks off the process in the background, but no window gets opened 
       $oExec = $WshShell->Run($tmp, $windowstyle, $waitforcompletion); 
       unlink($tmp); 
      } // if not executed link is left available for manual running 
      unset($WshShell,$oShellLink,$oExec); 
     } catch(Exception $ex) { 
      print $ex->getMessage(); 
     } 
    } 
+0

wissen Sie das PHP ist für serverseitige Skripts gedacht? IMHO das ist Programm für andere Sprache –

+2

@JozefDochan ["PHP ist eine populäre Allzweck-Skriptsprache, die besonders für Web-Entwicklung geeignet ist."] (Http://www.php.net). "Allzweck" ist dort der Schlüsselsatz. – bishop

+0

Mögliches Duplikat von [php Wie starte ich ein externes Programm - Probleme mit System und Exec] (http://stackoverflow.com/questions/1403203/php-how-do-i-start-an-external-program -Running-Probleme-mit-System-und) – HPierce

Antwort

0

Wenn Öffnen im Browser ein pdf oder das Herunterladen es Ihr Problem löst, versuchen Sie eine Klasse namens PDFMerger:

https://github.com/clegginabox/pdf-merger

Es verwendet ein API namens setasign FPDI und FPDF (https://packagist.org/packages/setasign/fpdi-fpdf#p-456) Ich habe es hier getestet, weil es mich auch interessiert und ok gearbeitet hat. (Wamp in Windows 8.1)

Ich legte alles zusammen (Klassen und Ordner von fpdi und fpdf) in einem Ordner namens pdfmerger, weil ich einige Schwierigkeiten mit Namespaces hatte und mein Code funktionierte ok, aber ich weiß, das ist nicht das beste Weg, um die Klassen schließen - das Beispiel in GitHub-Seite muss helfen, wenn Sie Probleme mit Klassen haben keine Klassen zu finden):

<?php 
include "pdfmerger/fpdf.php"; 
include "pdfmerger/fpdi.php"; 
include 'pdfmerger/PDFMerger.php'; 

$pdf = new PDFMerger(); 

//generate a pdf with the pages 1,2 and 3 and send to browser 
$pdf->addPDF('originalpdfsavedintheserver.pdf', '1,2,3') 
    ->merge('browser', 'nameinbrowser.pdf'); 

// REPLACE 'browser' WITH 'file', 'download', 'string', or 'browser' for output options 

wenn Sie die Option ‚Download‘ verwenden, können Sie das Programm wählen, das die pDF-Datei geöffnet in Ihren Windows-Einstellungen (Wählen Sie Standard-Programm zum Öffnen von PDF-Dateien): https://www.cnet.com/how-to/how-to-set-default-programs-in-windows-10/

Verwandte Themen