Lorenzo,<br><br>I just went through and tried to add some comments to the print system that I use based on FPDF.&nbsp; I think that we can mesh together what you are doing with some additional things that I have implemented.<br>
<br>I am throwing the php code below used for printing in the mapping application (non-ka-map) that I have running at <a href="http://maps.macnoise.com/interactive/">http://maps.macnoise.com/interactive/</a><br><br>The things that you might want to take a look at are:
<br>- increasing the resolution of the jpeg images used for the map and used in the legend<br>- use vector text for the legend<br>- variable height map image and legend area -- map gets smaller, legend gets bigger as more objects get added to the legend
<br>&nbsp;&nbsp;&nbsp; try adding/removing layers from the application above to see what I mean<br><br>An additional thing that I haven't yet had time to implement would be a vector scalebar using the rectangle draw tools in fpdf. (Currently my in image scalebar is rather pathetic as you can see especially if you make a pdf then throw an extra paramater &amp;resolution=300 on the end).
<br><br>I hope that some of this can help you!<br><br>Ciao,<br>bit<br><br><br>&lt;?php<br>dl(&quot;php_mapscript.so&quot;);<br>$mapfile=$_REQUEST['map'];<br>$map = ms_newMapObj($mapfile);<br>$map-&gt;selectOutputFormat('jpeg'); //fpdf seems to play better with jpeg
<br><br>//get map extent<br>if ($_REQUEST['mapext']) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $mapext = $_REQUEST['mapext'];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $extent = explode(&quot; &quot;, $mapext);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $map-&gt;setExtent($extent[0], $extent[1],$extent[2], $extent[3]);
<br>}<br><br>//get list of layers and cycle through to turn them on<br>if (isset($_REQUEST['layers'])) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $layerlist = rtrim($_REQUEST['layers']);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $layers = explode(&quot; &quot;, $layerlist);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $numLayers = $map-&gt;numlayers;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ($i = 0; $i &lt; $numLayers; $i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $activeLayer = $map-&gt;getlayer($i);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ($activeLayer-&gt;status != 2) $activeLayer-&gt;set(&quot;status&quot;, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach ($layers as $l) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $activeLayer = $map-&gt;getlayerbyname($l);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $activeLayer-&gt;set(&quot;status&quot;, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br><br>// this is used to allow cgi substitutions in data strings<br>for ($i = 0; $i &lt; $map-&gt;numlayers; $i++) {
<br>&nbsp;&nbsp; &nbsp;$activeLayer = $map-&gt;getlayer($i);<br>&nbsp;&nbsp; &nbsp;$datastring=$activeLayer-&gt;data;<br>&nbsp;&nbsp; &nbsp;if (preg_match_all(&quot;/%([\w].+?)%/&quot;,$datastring,$matches,PREG_SET_ORDER)&gt;0){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;foreach ($matches as $match){
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$search=$match[0];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$replace=$match[1];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (isset($_REQUEST[$replace])){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$replaceval=$_REQUEST[$replace];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$datastring=str_replace($search,$replaceval,$datastring);
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$activeLayer-&gt;set(&quot;data&quot;,$datastring);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$activeLayer-&gt;set(&quot;status&quot;, 0);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br>}<br>
$headerstring='';<br><br>//conditionals used to only display certain messages when certain layers are turned on<br>$ft=$map-&gt;getlayerbyname('FlightTracks');<br>$ftstat=$ft-&gt;status;<br>$add=$map-&gt;getlayerbyname('house');
<br>$addstat=$add-&gt;status;<br>if ($ftstat==1) $headerstring=$headerstring.'Time Period: '.$_REQUEST['sDate'].'-'.$_REQUEST['eDate'];<br>if ($addstat==1) $headerstring=$headerstring.' Address Shown: '.$_REQUEST['add'];<br>
<br><br>$resolution=isset($_REQUEST['resolution'])?$_REQUEST['resolution']:150; //allows to set resolution or defaults to 150dpi<br>$mapfile_resolution=$map-&gt;resolution;<br>$scalefactor=$resolution/$mapfile_resolution; //how much everything needs to be multiplied by
<br>$map-&gt;set('resolution',$resolution); // set new resolution for min/max scale renderings<br><br><br>// loop through layers to extract class images and names and to resize styles and truetype symbols<br>$numLayers = $map-&gt;numlayers;
<br>$classimages=array();<br>$classnames=array();<br>for ($i=0; $i &lt; $numLayers; $i++) {<br>&nbsp;&nbsp; &nbsp;$layer = $map-&gt;getlayer($i);<br>&nbsp;&nbsp; &nbsp;if ($layer-&gt;status == 1 ){<br>&nbsp;&nbsp; &nbsp;for ($j=0; $j &lt; $layer-&gt;numclasses; $j++) {
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$class = $layer-&gt;getClass($j);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$label = $class-&gt;label;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ($layer-&gt;type !=4){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$classimageobj=$class-&gt;createLegendIcon(60,60);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$classimages[]=$classimageobj-&gt;saveWebImage();
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$classnames[]=$class-&gt;name;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ($label-&gt;mindistance&gt;1){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$md=$label-&gt;mindistance;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$newmd=$md*$scalefactor;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$label-&gt;set('mindistance',$newmd);
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ($label-&gt;type == 'TRUETYPE') {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$labelsize=$label-&gt;size;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$newlabelsize=$labelsize*$scalefactor;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$label-&gt;set('size',$newlabelsize);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for ($k=0; $k &lt; $class-&gt;numstyles; $k++) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$style = $class-&gt;getStyle($k);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$style-&gt;set(&quot;size&quot;, $style-&gt;size * $scalefactor);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$style-&gt;set(&quot;offsetx&quot;, $style-&gt;offsetx * $scalefactor);
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$style-&gt;set(&quot;offsety&quot;, $style-&gt;offsety * $scalefactor);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>}<br>$nrows=ceil(count($classnames)/4); // make 4 columns to display legend<br>$legheight=$nrows*.25; // determine height of legend
<br>$mapheight=9.3-$legheight; // determine area left to draw map<br>$legstart=$mapheight+1.05; // determine where to start the legend<br><br>$map-&gt;set(&quot;width&quot;, 7.6*$resolution);<br>$map-&gt;set(&quot;height&quot;, $resolution*$mapheight); // make map rectangle fit page
<br>//echo $mapheight*$resolution;<br>//draw map<br>$imgMap = $map-&gt;draw();<br>$urlMap = $imgMap-&gt;saveWebImage();<br><br>require('fpdf.php');<br>class PDF extends FPDF<br>{<br>//Page header<br>function Header()<br>{ 
<br>&nbsp; &nbsp;<br>}<br><br>//Page footer<br>function Footer()<br>{<br>&nbsp;&nbsp;&nbsp; $this-&gt;SetY(-1);<br>&nbsp;&nbsp;&nbsp; $this-&gt;SetFont('Arial','I',7);<br>}<br>function draw_legend($textarray,$imgarray,$startx,$starty,$nr){ // function draws the 4 column table
<br>&nbsp;&nbsp; &nbsp;$this-&gt;SetFont('Times','',12);<br>&nbsp;&nbsp; &nbsp;$y=$starty-.25;<br>&nbsp;&nbsp; &nbsp;$x=$startx;<br>&nbsp;&nbsp; &nbsp;$first=true;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;for ($i=0;$i&lt;count($textarray);$i++){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ($i==$nr or $i==2*$nr or $i==3*$nr) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$y=$starty-.25;
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$x=$x+1.9;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$first=false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$y=$y+.25;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$imgurl=$imgarray[$i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$text=$textarray[$i];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$this-&gt;Image($imgurl,$x,$y,.20,.20);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$this-&gt;Text($x+.25,$y+.15,$text);
<br>&nbsp;&nbsp; &nbsp;}<br>}<br>}<br><br>//Instanciation of inherited class<br>$pdf=new PDF('P','in','letter');<br><br>$pdf-&gt;SetDisplayMode('fullpage');<br>$pdf-&gt;SetMargins(.25,.25);<br><br>$pdf-&gt;AddPage();<br><br><br>$pdf-&gt;SetFont('Arial','B',14);
<br>$pdf-&gt;Cell(0,.50,'MACNOISE Interactive Map',0,1,'C');<br>$pdf-&gt;SetFont('Arial','',10);<br>$pdf-&gt;Cell(0,.02,$headerstring,0,1,'C');<br><br><br>$pdf-&gt;SetLineWidth(.1);<br>$pdf-&gt;SetDrawColor(0,0,150);<br>$pdf-&gt;Rect(.25,.25,8,
10.5);<br><br>$pdf-&gt;Image($urlMap,.45,.9,7.6,$mapheight);<br>$pdf-&gt;Image(&quot;/var/apache/htdocs/graphics/MACnorth.png&quot;,.45,.9,1,1);<br><br>$pdf-&gt;SetLineWidth(.01);<br>$pdf-&gt;SetDrawColor(0,0,200);<br>$pdf-&gt;Rect(.40,.85,
7.7,$mapheight+.1);<br>$pdf-&gt;Rect(.40,$legstart,7.7,$legheight+.1);<br><br>$date=date('M j, Y g:i');<br>$datemessage=&quot;Map created by <a href="http://maps.macnoise.com/interactive/">http://maps.macnoise.com/interactive/
</a> on $date. This information is to be used for reference purposes only.&quot;;<br>$disclaimer=&quot;The Metropolitan Airports Commission does not guarantee accuracy of the material contained herein and is not responsible for misuse or misinterpretation.&quot;;
<br>$pdf-&gt;SetFont('Arial','I',7);<br>$pdf-&gt;Text(.45,10.55,$datemessage);<br>$pdf-&gt;Text(.45,10.65,$disclaimer);<br>$pdf-&gt;SetTitle('MACNoise Interactive Map');<br>$pdf-&gt;draw_legend($classnames,$classimages,.45,$legstart+.05,$nrows);
<br><br>$pdf-&gt;Output();<br>//$pdf-&gt;Output('macnoise.pdf','D');<br>?&gt;