"lp", "lpstat" => "lpstat", "pdfinfo" => "pdfinfo" ]; header("Content-Type: application/json"); function getPrinters(): array { global $CMDS; $printerlist = `$CMDS[lpstat] -a`; $lines = explode("\n", $printerlist); $printers = []; foreach ($lines as $line) { $printer = explode(" ", $line, 2)[0]; if (empty($printer)) { continue; } $printers[] = $printer; } return $printers; } if ($_GET["action"] == "list") { exit(json_encode([ "printers" => getPrinters() ])); } else if ($_GET["action"] == "print") { if (empty($_GET["printer"]) || !in_array($_GET["printer"], getPrinters())) { http_response_code(400); exit(json_encode([ "error" => "No printer specified or printer does not exist." ])); } $printer = $_GET["printer"]; $content = file_get_contents("php://input"); $pdffile = tempnam(sys_get_temp_dir(), "WEB_PDF_PRINT"); file_put_contents($pdffile, $content); $pdfinfo = `$CMDS[pdfinfo] $pdffile`; preg_match('/Page size: *([0-9]*\.?[0-9]?) x ([0-9]*\.?[0-9]?)/', $pdfinfo, $matches); $width = $matches[1]; $height = $matches[2]; $media = "Custom.$width" . "x$height"; `$CMDS[lp] -o media=$media -d $printer $pdffile`; unlink($pdffile); exit(json_encode([ "printed" => true ])); } else { http_response_code(404); exit(json_encode([ "error" => "No action or invalid action specified." ])); }