The printer will only appear if it is configured on the server, I do not know printer discovery using php alone (maybe some operating system command).
As you are using windows, I will consider this environment, in linux the solution is similar.
Using the php_printer extension:
The php_printer extension is the default medium for getting printers attached to the server. However, it will not identify network printers that are not configured on the server because it does not allow discovery.
I did the installation once following this tutorial:
link
Go to the php.ini file directory (eg C: /PHP5/php.ini)
Open the file
Search for; extension = php_printer.dll
Remove the ";"
Restart the server.
If the above configuration does not work, you can try PHP-Printer link
But apparently this extension has been discontinued (not even documentation is available: link ).
Getting printers without the extension, using only command line in windows:
When PHP alone can not, we can use some command line interface, be it a java or python script or even a php script running with an older php.
The technique is to use a command line and treat the result string.
<?php
//Função para tratar o retorno
function getPrinterProperty($key){
$str = shell_exec('wmic printer get '.$key.' /value');
$keyname = "$key=";
$validValues = [];
$fragments = explode(PHP_EOL,$str);
foreach($fragments as $fragment){
if($fragment == ""){
continue;
}
if (preg_match('/('.$keyname.')/i', $fragment)) {
array_push($validValues,str_replace($keyname,"",$fragment));
}
}
return $validValues;
}
//Esplanação dos commandos:
// wmic /node:SERVER1 printer list status // Lista status das impressoras de um servidor remoto
// wmic printer list status // Lista status das impressoras do servidor local
// wmic printer get // Obtem todas as propriedades da impressoa
// wmic printer get <propriedade> /value //Lista uma propriedade no formato chave=valor do servidor remoto
// wmic printer get <propriedade> /value //Lista uma propriedade no formato chave=valor do servidor local
//Obtém algumas propriedades, nesse caso vou pegar só algumas
$Name = getPrinterProperty("Name");
$Description = getPrinterProperty("Description");
$Network = getPrinterProperty("Network");
$Local = getPrinterProperty("Local");
$PortName = getPrinterProperty("PortName");
$Default = getPrinterProperty("Default");
$Comment = getPrinterProperty("Comment");
$Printers = [];
foreach($Name as $i => $n){
$Printers[$i] = (object)[
"name" => $n,
"description" => $Description[$i],
"Portname" => $PortName[$i],
"isDefault" =>($Default[$i] == "TRUE")? true : false,
"isNetwork" => ($Network[$i] == "TRUE")? true : false,
"isLocal" =>($Local[$i] == "TRUE")? true : false,
"Comment" => $Comment[$i],
];
}
var_dump($Printers);
The expected return is something like this:
array(7) {
[0]=>
object(stdClass)#1 (7) {
["name"]=>
string(29) "Microsoft XPS Document Writer"
["description"]=>
string(0) ""
["Portname"]=>
string(11) "PORTPROMPT:"
["isDefault"]=>
bool(false)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(0) ""
}
[1]=>
object(stdClass)#2 (7) {
["name"]=>
string(22) "Microsoft Print to PDF"
["description"]=>
string(0) ""
["Portname"]=>
string(11) "PORTPROMPT:"
["isDefault"]=>
bool(false)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(0) ""
}
[2]=>
object(stdClass)#3 (7) {
["name"]=>
string(32) "HPC4C962 (HP Officejet Pro 8600)"
["description"]=>
string(0) ""
["Portname"]=>
string(45) "WSD-5277c4df-fd03-46fb-a957-1d8a0fd65b01.003c"
["isDefault"]=>
bool(true)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(30) "This is a web services printer"
}
[3]=>
object(stdClass)#4 (7) {
["name"]=>
string(29) "HP Officejet Pro L7600 Series"
["description"]=>
string(0) ""
["Portname"]=>
string(12) "192.168.1.22"
["isDefault"]=>
bool(false)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(0) ""
}
[4]=>
object(stdClass)#5 (7) {
["name"]=>
string(24) "Foxit Reader PDF Printer"
["description"]=>
string(0) ""
["Portname"]=>
string(13) "FOXIT_Reader:"
["isDefault"]=>
bool(false)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(0) ""
}
[5]=>
object(stdClass)#6 (7) {
["name"]=>
string(3) "Fax"
["description"]=>
string(0) ""
["Portname"]=>
string(7) "SHRFAX:"
["isDefault"]=>
bool(false)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(0) ""
}
[6]=>
object(stdClass)#7 (7) {
["name"]=>
string(26) "Enviar para o OneNote 2013"
["description"]=>
string(0) ""
["Portname"]=>
string(4) "nul:"
["isDefault"]=>
bool(false)
["isNetwork"]=>
bool(false)
["isLocal"]=>
bool(true)
["Comment"]=>
string(0) ""
}
}
How to request an impression without a plugin (windows)?
You can install any application that lets you run from the command line, such as Foxit Reader , and add it to the PATH environment variable, so you can run the command from anywhere. Then you can use the code above and run it like this:
<?php
shell_exec('FoxitReader /t C:/Temp/file.txt "'.$Printers[0]->name.'"');