PHP-Ausgabe automatisch drucken

Lil-rich

Erfahrenes Mitglied
Vorab: Ich habe es deswegen in den Coders Talk gepostet, weil ich das Problem nicht unbedingt mit PHP lösen will. Grundsätzlich ist alles willkommen, am Besten wären Batch/PHP oder eine fertige Executable, die über entsprechende Parameter meine Map ausdruckt :)

Aber jetzt zum Problem.
Ich habe eine PHP-Datei, die dynamisch Ausgaben erzeugt. Das Wichtigste ist, dass eine "Google Map" mit Route angezeigt wird.
Diese Seite/Map will ich ausdrucken (1-5 Mal).

Ansteuerung des Druckers wäre hier über Javascript (ist aber scheinbar nicht möglich?), PHP oder anderes möglich.
Achja, der Drucker hängt am USB-Port und ist auch (immer) der Standarddrucker.

Ansonsten läuft auch noch ein Programm, das gewisse Events überwacht. Hier könnte ich beispielsweise eine Batch-Datei oder Executable aufrufen - die PHP-Datei müsste dann aber vorher noch eine HTML-Datei erzeugen, die dann gedruckt werden kann. Da wusste ich nicht wirklich, wie ich das einfach bewerkstelligen kann.

Ich frage deswegen hier nach, weil dieser Part eigentlich nur ein kleiner Teil des gesamten Projekts ist, meine Lösungen aber allesamt sehr umständlich und zeitintensiv sind. Vielleicht fällt euch ja was besseres ein?
Danke schon mal für alle Denkanstöße!
 

Lil-rich

Erfahrenes Mitglied
Danke für deinen Vorschlag.

Habs nun soweit angepasst, dass es theoretisch so gehen sollte wie du es beschreibst. Meine (neue) Seite zeigt nun nur noch die Maps an, die dann von PhantomJS in PDF gewandelt werden sollen.

Hab dann auch gleich PhantomJS per CMD angesteuert und ein PDF der entsprechenden Seite erstellt - nur leider ist das PDF leer :p
Hatte die Maps erst per IFrame eingebunden -> Iframes sichtbar, Maps nicht.
Ich dachte, dass ess vllt an den Iframes liegt und hab diese entfernt -> Maps trotzdem nicht sichtbar.

Wenn ich die Seite manuell aufrufe, dann werden die Maps natürlich angezeigt.
Irgendwelche Lösungsvorschläge? Gibts zum Programm ein Log o.Ä.?
Was braucht ihr noch für Infos?

Anbei das Script für Anzeige der Google-Map:
PHP:
<?php
	$ort = isset($_GET["ort"]) ? $_GET["ort"] : "Kronacher Straße, Bamberg, Deutschland";
	$zoom = isset($_GET["zoom"]) ? $_GET["zoom"] : "19";
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>MAP</title>
	<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;v=3.10&amp;key="></script>
    <script type="text/javascript">
		var geocoder;
		var map1;
		var map2;
		var directionDisplay;
		var directionsService = new google.maps.DirectionsService();

		function init() {
			var start = "Kronacher Straße, Bamberg, Deutschland";
			var end = "<?php echo $ort; ?>, Deutschland";
			
			var request = {
				origin:start,
				destination:end,
				travelMode: google.maps.TravelMode.DRIVING
			};
		  
			directionsDisplay = new google.maps.DirectionsRenderer();
			var home = new google.maps.LatLng(30,30);
			var myOptions = {
				zoom:<?php echo $zoom; ?>,
				mapTypeId: google.maps.MapTypeId.HYBRID,
				center: home
			}
			map1 = new google.maps.Map(document.getElementById("map1"), myOptions);
			directionsDisplay.setMap(map1);
			
			map2 = new google.maps.Map(document.getElementById("map2"), myOptions);
			
			geocoder = new google.maps.Geocoder();
			
			calcRoute(request);
			markPoint(end);
		}

		function markPoint(address)
		{
			<?php //var icon = new google.maps.MarkerImage("design_images/my_icon.png"); ?>
			
			geocoder.geocode( { 'address': address},
								function(results, status) {
									if (status == google.maps.GeocoderStatus.OK)
									{
										map2.setCenter(results[0].geometry.location);
										var marker = new google.maps.Marker({
														map: map2,
														position: results[0].geometry.location,
														<?php //icon: icon ?>
													});
									}
									else
									{
										alert("Geocode was not successful for the following reason: " + status);
									}
								});
		}
		
		function calcRoute(request)
		{
			directionsService.route(request,
				function(result, status)
				{
					if (status == google.maps.DirectionsStatus.OK)
					{
						directionsDisplay.setDirections(result);
					}
				}
			);
		}
    </script>
  </head>
  <body onload="init()">
	<div id="map1" style="width: 700px; height: 500px;"></div><br>
	<div id="map2" style="width: 700px; height: 500px;"></div>
</body>
</html>
 
Zuletzt bearbeitet:

CPoly

Mitglied Weizenbier
Schau dir mal rasterize.js an https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js#L26

Die 200ms werden nicht ausreichen, um die Karte zu laden. Also setz es zum Test mal auf mehrere Sekunden. Sofern es dann funktioniert, dann kannst du versuchen anstelle von setTimeout eine globale Funktion zu deklarieren, z.b. window.routingLoaded = function() {} und in diese Funktion den page.render Aufruf zu stecken. Und in dem Callback von geocoder.geocode rufst du die Funktion auf, sobald das Routing erfolgreich war.
 

Lil-rich

Erfahrenes Mitglied
Sorry, mein Fehler. Die rasterize hatte ich mir schon angesehen und ausprobiert (neben meiner eigenen .js), aber da die auch nicht funktioniert hat, hab ich sie mir nicht genauer angesehen.

Klar, an einen Timeout hätte ich denken müssen ;) Danke soweit.

Edit:
Gut, so funktioniert nun alles. Timeout einfach erhöht und der Rest ist ja dann nur Einstellungssache. Danke!
 
Zuletzt bearbeitet: