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);
...
}