Knowledge Base Nr: 00252 pdaprint.txt - http://www.swe-kaiser.de
Downloads:
PHP: PDA Drucken im Netzwerk
Da der PDA kein Drucken unterstützt wird folgendes Verfahren im Intranet angewandt:
- ein php script erzeugt eine html-Seite auf dem server
(kopie der web-seite von der der aufruf erfolgt)
- der server pollt das file und druckt es aus falls es existiert
(und löscht es danach wieder)
#######################################################
- Einfügen einer der folgenden Zeilen in der zu druckenden Seite:
<a href="/pda/p_print.php3">Drucken</a>
<a href="/pda/p_print.php3"><img src="/pda/drucker.png"></a>
- Das folgende PHP Script erzeugt eine HTML-Seite auf dem Server
<?
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
clearstatcache();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Drucken</title>
</head>
<body>
<center>
<h1>Drucken</h1>
<?
$printer = "Brother HL-1450 series"; #eintrag unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers
#bzw. name unter start|einstellungen|drucker
$file = "e:\\temp\\~print.html"; #besser wäre tempnam("e:\\temp\\", "t") . ".html";
$referer = $HTTP_ENV_VARS["HTTP_REFERER"];
$httpcmd = "e:\\mystuff\\gethttpsource.exe \"$referer\" > $file";
#nachteil: druckerdialog muss bestätigt werden!
#$printcmd = "rundll32.exe C:\\WINNT\\system32\\mshtml.dll,PrintHTML \"$file\" \"$printer\"";
#eigenes verfahren mit quittieren druckerdialog
#funktioniert nur wenn interaktiv gestartet - nicht wenn von apache ?!
#$printcmd = "e:\\mystuff\\printhtml.bat \"$file\" \"$printer\"";
$printcmd = "erzeugt html-file 'e:\\temp\\~print.html' "
. "- file wird gepollt von remoteweb.exe und falls vorhanden ausgedruckt";
echo("<pre>\n"
." referer: $referer\n"
." file: $file\n"
." httpcmd: $httpcmd\n"
." printcmd: $printcmd\n"
."</pre><hr><pre>");
set_time_limit(10);
passthru($httpcmd);
#passthru($printcmd);
echo("</pre>\n");
#unlink($file);
?>
</center>
</body>
</html>
- der server pollt das file und druckt es aus falls es existiert (und löscht es danach wieder)
void CRemotewebDlg::OnTimer(UINT nIDEvent)
{
...
WIN32_FIND_DATA fd;
const char* lpszPrintername = "Brother HL-1450 series";
HANDLE hFind = ::FindFirstFile(PRINTFILE, &fd);
if (hFind != INVALID_HANDLE_VALUE)
{
TRACE("Drucken startet...\n");
CString strCmd;
strCmd.Format("rundll32.exe C:\\WINNT\\system32\\mshtml.dll,PrintHTML \"%s\" \"%s\""
, PRINTFILE, lpszPrintername);
UINT nRes = WinExec(strCmd, SW_SHOW);
ASSERT(nRes > 32);
CWnd* pWnd = NULL;
while (pWnd == NULL)
{
pWnd = FindWindow(NULL, "Drucken");
Sleep(100);
}
int nErr = CProcessSupport::DoKeysPress("ENTER#", 100);
Sleep(10*1000);
BOOL bSucc = ::DeleteFile(PRINTFILE);
ASSERT(bSucc);
Sleep(1*1000);
TRACE("Drucken fertig\n");
}
::FindClose(hFind);
...
}