Print option
Piero Cavalieri
piero.cavalieri at HEIDI.IT
Wed Apr 13 01:43:00 PDT 2005
When I write code I just began with php (now I'm still NOT expert...), so
to be sure to don't have problems with global variables I passed via URL an
array with
extents of the map displayed, and an array with acitve layers. Then I
deactivated ALL layers
and then reactivated only layers passed via url. This probably is not
correct (or the bast way),
so reflect about it, to have improvements.
This is done in the code below:
<tr>
<td colspan=2>
<a href="#" onclick="window.open('printSetup.php?
PHPSESSID=<?=session_id()?>&ext=<?php
$dfMinX = $gpoMap->extent->minx;
$dfMaxX = $gpoMap->extent->maxx;
$dfMinY = $gpoMap->extent->miny;
$dfMaxY = $gpoMap->extent->maxy;
$ext = array($dfMinX, $dfMinY, $dfMaxX,
$dfMaxY);
echo serialize($ext)?>
&layerNums=<?php
$j = -1;
$layerNums = array();
for($i=0; $i < $gpoMap->numlayers; $i++)
{
$iLayer = $gpoMap->getLayer($i);
if($iLayer->status == MS_ON ||
$iLayer->status == MS_DEFAULT) {
$j++;
$layerNums[$j] = $i;
}
}
echo serialize($layerNums);
?>', '', 'width=250,height=100')"
> <img alt="print"
src="images/print.jpg" align="center" border="0">
</a>
</td>
</tr>
With this I open a window where I can specify format an an optional title
(printSetup.php) :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<HEAD>
<title>print</title>
</HEAD>
<body bgcolor="#E2EFF5">
<form method="post" target="_blank" action="print.php?PHPSESSID=<?
=session_id()?>&ext=<?=$_REQUEST['ext']?>&layerNums=<?=$_REQUEST
['layerNums']?>">
<table>
<tr><td>Titolo: </td><td colspan="2"><input type="text"
name="title"></td></tr>
<tr><td>Formato:</td><td><select name="format">
<option value="A4">  A4  
<option value="A3">  A3  
<option value="A0">  A0  
</select>
</td>
<td><input type="image" src="images/pdf_print.jpg"
BORDER="1" ALT="Print PDF !"></td> </tr>
</table>
</form>
</body>
</html>
I pass previous arrays plus format option to print.php:
<?php
/*Parametri*/
$format = $_REQUEST['format'];
$thisFileName = "print.php";
$mapOrientation = "west";
$MapResolution = 480;
$width = 595; /* A4 in pt - DEFAULT */
$height = 842; /* A4 in pt - DEFAULT*/
$MapWidth = 1200;
$MapHeight = 1200;
$xpos = 80;
$ypos = 20;
$ArrowWidth = 50;
$ArrowHeight = 50;
$title = $_REQUEST['title'];
$fontWidth = 22;
/*dimension in pt 1pt = 0.3528 mm*/
if($format == "A4") {
$width =595 ;
$height = 842;
} else if ($format == "A3") {
$width = 842;
$height = 1190;
} else if ($format == "A0") {
$width = 2380;
$height = 3368;
}
$ScaleBarWidth = $width/12;
$ScaleBarHeight = $height/12;
if ($format == "A0") {
$MapWidth = 2400;
$MapHeight = 2400; }
$p = PDF_new();
/* This is where font/image/PDF input files live. Adjust as necessary. */
//$searchpath = "images";
//PDF_set_parameter($p, "SearchPath", $searchpath);
/* open new PDF file; insert a file name to create the PDF on disk */
if (PDF_begin_document($p, "", "") == 0) {
die("Error: " . PDF_get_errmsg($p));
}
/* This line is required to avoid problems on Japanese systems */
PDF_set_parameter($p, "hypertextencoding", "winansi");
PDF_set_info($p, "Author", "Heidi s.p.a.");
PDF_set_info($p, "Title", "Print Sample");
/* User coordinate systems */
PDF_set_parameter($p, "usercoordinates", "true");
/*Generazione mappa*/
//$map = ms_newMapObj($_SESSION["strMapFile"]);
//echo $_SESSION["strMapFile"], "<br>";
$map = ms_newMapObj("gmap75.map");
if(array_key_exists("PATH_TRANSLATED", $_SERVER)) {
$map->set("shapepath", str_replace($thisFileName, "data",
str_replace("\\", "/", $_SERVER["PATH_TRANSLATED"])));}
$map->set("width", $MapWidth);
$map->set("height", $MapHeight);
$map->set("resolution", $MapResolution);
//localizeMapLabels($map);
//adjustScalebar($map);
/*extensions*/
$ext = unserialize($_REQUEST['ext']);
$map->setextent($ext[0],$ext[1],$ext[2],$ext[3]);
/*Attivo i Layers*/
$layerNums = unserialize($_REQUEST['layerNums']);
//setto tutti a false
for($i=0; $i < $map->numlayers; $i++) {
$iLayer = $map->getLayer($i);
$iLayer->set("status", MS_OFF);
}
//ciclo su $layerNums ed attivo.
for($i=0; $i < count($layerNums); $i++) {
$iLayer = $map->getLayer($layerNums[$i]);
$iLayer->set("status", MS_ON);
// printf("%s\n", $iLayer->name); }
// change layer scales to ensure pdf image still shows the same extent as
the web image
$map_width = $map->width;
$pdf_ratio = ($map_width/$MapWidth);
$allLayernames = $map-
>getAllLayerNames();
$numb = count($allLayernames);
for ($i = 0; $i<$numb-1; $i++) { $oLayer = $map->getLayerByName
($allLayernames[$i]);
$old_min_scale = $oLayer->minscale;
$new_min_scale = ($old_min_scale*$pdf_ratio);
$oLayer->set('minscale', $new_min_scale); $old_max_scale =
$oLayer->maxscale;
$new_max_scale = ($old_max_scale*$pdf_ratio);
$oLayer->set('maxscale', $new_max_scale); }
/*Immagine mappa*/
$mapObj=$map->draw();
$image_url=$mapObj->saveWebImage();
//$image_map = PDF_load_image($p, "auto", "D:/11b2.jpg", "");
$image_map = PDF_load_image($p, "auto", "C:/tmp".$image_url, "");
if (!$image_map) {
die("Error: " . PDF_get_errmsg($p));
}
/* Immagine ScaleBar */
$imageScaleBar=$map->drawScaleBar();
$scaleBar_url=$imageScaleBar->saveWebImage();
$image_scaleBar = PDF_load_image($p, "auto", "C:/tmp".$scaleBar_url, "");
if (!$image_scaleBar) {
die("Error: " . PDF_get_errmsg($p));
}
/* Immagine Leggenda*/
$legendObj=$map->drawLegend();
$legend_url=$legendObj->saveWebImage();
$image_legend = PDF_load_image($p, "auto", "C:/tmp".$legend_url, "");
if (!$image_legend) {
die("Error: " . PDF_get_errmsg($p));
}
/* Immagine RegerenceMap */
$referenceObj=$map->drawReferenceMap();
$reference_url=$referenceObj->saveWebImage();
$image_reference = PDF_load_image($p, "auto", "C:/tmp".$reference_url, "");
if (!$image_reference) {
die("Error: " . PDF_get_errmsg($p));
}
/*Legend template*/
$legendWidth = $legendObj->width;
$legendWidth += 50;
$legendHeight = $legendObj->height;
$templateLegend = PDF_begin_template($p, $legendWidth, $legendHeight) ;
PDF_fit_image($p, $image_legend, 0, 0, "boxsize {".($legendWidth)." ".
($legendHeight)."} fitmethod meet");
PDF_rect($p, 0, 0, $legendWidth, $legendHeight);
PDF_stroke($p);
PDF_end_template($p);
/* Map template */
$templateMap = PDF_begin_template($p, $MapWidth, $MapHeight) ;
PDF_fit_image($p, $image_map, 0, 0, "boxsize {".($MapWidth)." ".
($MapHeight)."} fitmethod meet");
PDF_rect($p, 0, 0, $MapWidth , $MapHeight );
PDF_stroke($p);
PDF_end_template($p);
/* Arrow template */
$templateArrow = PDF_begin_template($p, $ArrowWidth, $ArrowHeight) ;
//northarrow
pdf_setcolor($p, "fill", "rgb", 0, 0, 0, 0);
$x_bild = 0;
$y_bild = 0;
$font = PDF_findfont($p, "Helvetica", "host", 0);
pdf_setlinewidth($p,
0.8); pdf_circle($p,
$x_bild+30, $y_bild+27, 11.2); pdf_stroke($p);
pdf_setlinewidth($p, 1); pdf_moveto($p, $x_bild+30, $y_bild+60);
pdf_lineto($p, $x_bild+23, $y_bild+8);
pdf_lineto($p, $x_bild+30, $y_bild+11);
pdf_lineto($p, $x_bild+37, $y_bild+8);
pdf_closepath_fill_stroke($p);
pdf_setfont($p, $font, 20);
// N
pdf_setlinewidth($p, 3.5);
pdf_setcolor($p, "fill", "rgb", 0, 0, 0, 0);
pdf_moveto($p, $x_bild+25, $y_bild+20);
pdf_lineto($p, $x_bild+25, $y_bild+34);
pdf_moveto($p, $x_bild+35, $y_bild+20); pdf_lineto($p,
$x_bild+35, $y_bild+34);
pdf_stroke($p);
pdf_setcolor($p, "stroke","rgb", 0.9, 0.9, 0.9, 0);
pdf_setlinewidth($p, 3.0); pdf_moveto($p, $x_bild+25.5,
$y_bild+20.9);
pdf_lineto($p, $x_bild+25.5, $y_bild+33.1);
pdf_moveto($p, $x_bild+25.5, $y_bild+32.15); pdf_lineto($p,
$x_bild+34.3, $y_bild+21.85);
pdf_moveto($p, $x_bild+34.5, $y_bild+20.9); pdf_lineto
($p, $x_bild+34.5, $y_bild+33.1);
pdf_stroke($p); PDF_end_template($p);
/* Reference template */
$referenceWidth = $referenceObj->width;
$referenceHeight = $referenceObj->height;
$templateReference = PDF_begin_template($p, $referenceWidth,
$referenceHeight) ;
PDF_fit_image($p, $image_reference, 0, 0, "boxsize {".
($referenceWidth)." ".($referenceHeight)."} fitmethod meet");
PDF_rect($p, 0, 0, $referenceWidth , $referenceHeight);
PDF_stroke($p);
PDF_end_template($p);
/* Dispongo i template e le scritte */
PDF_begin_page_ext($p, $width, $height, "");
$delta = $width * 0.007;
PDF_rect($p, $delta, $delta, $width - 2 * $delta, $height - 2 * $delta);
PDF_stroke($p);
/*title*/
$font = PDF_load_font ($p, "Verdana", "host","");
if ($font) {
pdf_setfont($p, $font, $fontWidth);
pdf_fit_textline($p, $title, $width/85, $height/110, "boxsize {".
($width/13)." ". ($height/1.05)."} orientate ".$mapOrientation." fitmethod
meet position {50 50}");
}
PDF_fit_image($p, $templateMap, $width/6.5, $height/110, "boxsize {".
($width/1.2)." ". ($height)."} orientate ".$mapOrientation." fitmethod
meet");
PDF_fit_image($p, $templateArrow, $width - $width/8 , $height -
$height/1.01, "boxsize {".($width/10)." ". ($height/10)."}
orientate ".$mapOrientation." fitmethod meet");
PDF_fit_image($p, $image_scaleBar, $width * 0.95, $height * 0.5, "boxsize
{".($ScaleBarWidth)." ".($ScaleBarHeight)."} orientate ".$mapOrientation."
fitmethod meet");
PDF_fit_image($p, $templateReference, $width/6.5, $height * 0.65, "boxsize
{".($width/5)." ".($height/5)."} orientate ".$mapOrientation." fitmethod
meet");
PDF_fit_image($p, $templateLegend, $width/6.5 + $width/5 + $width/20,
$height * 0.65, "boxsize {".($width/5)." ".($height/5)."}
orientate ".$mapOrientation." fitmethod meet");
//PDF_close_image($p, $image_map);
//PDF_close_image($p, $image_legend);
//PDF_close_image($p, $image_scaleBar);
PDF_end_page_ext($p, "");
PDF_end_document($p, "");
$buf = PDF_get_buffer($p);
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=image.pdf");
print $buf;
PDF_delete($p);
?>
I used templates and then fit them into boxes expresses as percentage of
the page size (both in
positioning and in extensions), so u could use virtually any page size (not
only A4, A4, A0 es I done).
To say the truth when I tested with Apache2 (under Windows) I have problems
(not rememeber very well, but about: errors when image maps was over a
certain file size). With IIS this worked
fine (for me). I think this was bug in library. However test it (or rewrite
it ;-) ).
Some code (NorthArrow) comes from KGIS application code, however this could
be replaced with image inserted, as the others.
Bye
Piero
More information about the MapServer-users
mailing list