cleary1981 Posted October 21, 2008 Share Posted October 21, 2008 Hi, I have created a script in PHP thats generates an SVG image. Want I want to do is have PHP save this as example.svg. Can this be done? Heres my code <?php require "config.php"; $proj_id = $_GET['proj']; //set the content type header("Content-type: image/svg-xml"); //mark this as XML echo('<?xml version="1.0" encoding="iso-8859-1"?>' . "\n"); //Point to SVG DTD echo('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN" '); echo('"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/' . 'svg-20000303-stylable.dtd">' . "\n"); //start SVG document, set size in "user units" echo("<svg xml:space=\"preserve\" " . "width=\"36cm\" height=\"24cm\" " . "viewBox=\"0 0 0 0\">\n"); //x, y, ??, zoomout $today = date('d/m/Y'); $projectQ1 = mysql_query("SELECT * FROM project WHERE proj_id='$proj_id'") or die(mysql_error()); $rowQ1 = mysql_fetch_assoc($projectQ1); $company = $rowQ1['company_name']; $project = $rowQ1['project_name']; $form = $rowQ1['form']; $access = $rowQ1['access']; $entry = $rowQ1['cable_entry']; $ip = $rowQ1['ip_rating']; $fault = $rowQ1['fault_rating']; echo '<g id="main">'; //draw each object $results = mysql_query("SELECT object_name, module_id, xpos, ypos, height, width FROM object, module WHERE object.module_name = module.module_name AND proj_id='$proj_id'") or die(); while($values = mysql_fetch_array($results)){ $object = $values['object_name']; $module_id = $values['module_id']; $mod = "SELECT module_name FROM module WHERE module_id = $module_id"; $res = mysql_query($mod) or trigger_error(mysql_error()); $row = mysql_fetch_object($res); $module=$row->module_name; $x = $values['xpos']; $y = $values['ypos']; $height = $values['height']/10; $width = $values['width']/10; $xx = $x + 5; $yy = $y + 10; echo("<rect x=\"$x\" y=\"$y\" " . "width=\"$width\" height=\"$height\" " . "style=\"fill:white; stroke:black; " . "stroke-width:2px\" />\n"); echo("<text x=\"$xx\" y=\"$yy\" " . "style=\"file:black; font-size:10\">" . "$object" . "</text>\n"); } // add busbar // calculate length of panel Left(smallest X, smallest Y) Right(largest X, smallest Y)+ length $q1 = "SELECT module_name, object_name, xpos, ypos FROM object WHERE proj_id='$proj_id' ORDER BY xpos DESC ,ypos ASC LIMIT 1"; // Right $result = mysql_query($q1) or trigger_error(mysql_error()); $row = mysql_fetch_array($result); $module = $row['module_name']; $R_object = $row['object_name']; $R_x = $row['xpos']; $R_y = $row['ypos']; $q3 = "SELECT width FROM module WHERE module_name = '$module'"; $result3 = mysql_query($q3) or trigger_error(mysql_error()); $row3 = mysql_fetch_array($result3); $Lwidth = $row3['width']; $q2 = "SELECT object_name, xpos, ypos FROM object WHERE proj_id='$proj_id' ORDER BY xpos ASC ,ypos ASC LIMIT 1"; // Left $result2 = mysql_query($q2) or trigger_error(mysql_error()); $row2 = mysql_fetch_array($result2); $L_object = $row2['object_name']; $L_x = $row2['xpos']; $L_y = $row2['ypos']; $B_x = $L_x; $B_y = $L_y - 20; $iB_x = $B_x + 5; $iB_y = $B_y + 10; $length = ($R_x - $L_x)+ ($Lwidth / 10); echo("<rect x=\"$B_x\" y=\"$B_y\" " . "width=\"$length\" height=\"20\" " . "style=\"fill:white; stroke:black; " . "stroke-width:2px\" />\n"); echo("<text x=\"$iB_x\" y=\"$iB_y\" " . "style=\"file:black; font-size:10\">" . "Busbar" . "</text>\n"); // add busbase // calculate length of panel Left(smallest X, smallest Y) Right(largest X, smallest Y)+ length $q5 = "SELECT module_name, object_name, xpos, ypos FROM object WHERE proj_id='$proj_id' ORDER BY xpos ASC ,ypos DESC LIMIT 1"; // Right $result5 = mysql_query($q5) or trigger_error(mysql_error()); $row5 = mysql_fetch_array($result5); $Bot_module = $row5['module_name']; $Bot_object = $row5['object_name']; $Bot_x = $row5['xpos']; $Bot_y = $row5['ypos']; //get bottom of lowest module in panel $w1 = "SELECT module.module_name, object_name, xpos, ypos FROM object, module WHERE object.module_name = module.module_name AND proj_id='$proj_id' ORDER BY height DESC LIMIT 1"; $resultW = mysql_query($w1) or trigger_error(mysql_error()); $rowW = mysql_fetch_array($resultW); $WWy = $rowW['ypos']; $WWx = $rowW['xpos']; $WWmodule = $rowW['module_name']; $WWobject = $rowW['object_name']; $q6 = "SELECT height FROM module WHERE module_name = '$WWmodule'"; $result6 = mysql_query($q6) or trigger_error(mysql_error()); $row6 = mysql_fetch_array($result6); $Lheight = $row6['height']; $Base_x = $Bot_x; $Base_y = $WWy + ($Lheight / 10); $BaseText_x = $Base_x + 5; $BaseText_y = $Base_y + 10; echo("<rect x=\"$Base_x\" y=\"$Base_y\" " . "width=\"$length\" height=\"10\" " . "style=\"fill:black; stroke:black; " . "stroke-width:2px\" />\n"); echo("<text x=\"$BaseText_x\" y=\"$BaseText_y\" " . "style=\"file:black; font-size:10\">" . "Base" . "</text>\n"); // y axis line $line_height_x1 = $L_x - 20; $line_height_y1 = $L_y - 20; $line_height_x2 = $Base_x - 20; $line_height_y2 = $Base_y + 10; $line_height_y3 = $line_height_y2 + 10; $line_height_x3 = $line_height_x2 - 10; $actual_height = (($Base_y - $L_y)+30) * 10; echo("<line x1=\"$line_height_x1\" y1=\"$line_height_y1\" " . "x2=\"$line_height_x2\" y2=\"$line_height_y2\" " . "style=\"stroke:red;" . "stroke-width:2px\" />\n"); echo("<text x=\"$line_height_x3\" y=\"$line_height_y3\" " . "style=\"file:black; font-size:10\">" . "$actual_height mm" . "</text>\n"); // x axis line $line_width_x1 = $B_x; $line_width_y1 = $B_y - 20; $line_width_x2 = $R_x + ($Lwidth / 10); $line_width_y2 = $R_y - 40; $line_length_x = $line_width_x2 + 10; $actual_length = ($line_width_x2 - $line_width_x1)* 10; echo("<line x1=\"$line_width_x1\" y1=\"$line_width_y1\" " . "x2=\"$line_width_x2\" y2=\"$line_width_y2\" " . "style=\"stroke:red;" . "stroke-width:2px\" />\n"); echo("<text x=\"$line_length_x\" y=\"$line_width_y2\" " . "style=\"file:black; font-size:10\">" . "$actual_length mm" . "</text>\n"); echo '</g>'; //panel side view echo '<g id="side">'; //Get the deepest depth in the whole panel SELECT * FROM table ORDER BY price desc"); $kk1 = mysql_query("SELECT depth FROM object, module WHERE proj_id='$proj_id' AND object.module_name = module.module_name ORDER BY depth DESC") or die(mysql_error()); $kk2 = mysql_fetch_assoc($kk1); $kk3 = $kk2['depth']; $sidewidth = $kk3/10; $side_height = ($actual_height / 10)-10; $side_y = $R_y - 20; $side_x = $R_x + ($Lwidth/10) + 160; $sidebase_x = $side_x; $sidebase_y = $side_y + $side_height; echo("<rect x=\"$side_x\" y=\"$side_y\" " . "width=\"$sidewidth\" height=\"$side_height\" " . "style=\"fill:white; stroke:black; " . "stroke-width:2px\" />\n"); echo("<rect x=\"$sidebase_x\" y=\"$sidebase_y\" " . "width=\"$sidewidth\" height=\"10\" " . "style=\"fill:black; stroke:black; " . "stroke-width:2px\" />\n"); $side_xLine = $side_x - 20; $side_xText = $side_xLine - 10; //side_yLine echo("<line x1=\"$side_xLine\" y1=\"$line_height_y1\" " . "x2=\"$side_xLine\" y2=\"$line_height_y2\" " . "style=\"stroke:red;" . "stroke-width:2px\" />\n"); echo("<text x=\"$side_xText\" y=\"$line_height_y3\" " . "style=\"file:black; font-size:10\">" . "$actual_height mm" . "</text>\n"); //side xLine $side_xLine_y = $side_y - 20; $side_xLine_x_end = $side_x + $sidewidth; $side_xLine_x_end_text = $side_xLine_x_end + 10; echo("<line x1=\"$side_x\" y1=\"$side_xLine_y\" " . "x2=\"$side_xLine_x_end\" y2=\"$side_xLine_y\" " . "style=\"stroke:red;" . "stroke-width:2px\" />\n"); echo("<text x=\"$side_xLine_x_end_text\" y=\"$side_xLine_y\" " . "style=\"file:black; font-size:10\">" . "$kk3 mm" . "</text>\n"); //page titles $titleX = $line_width_x1 + ($length/2); $titleY = $side_xLine_y - 50; echo("<text x=\"$titleX\" y=\"$titleY\" " . "style=\"file:black; font-size:14\">" . "FRONT VIEW" . "</text>\n"); echo("<text x=\"$side_x\" y=\"$titleY\" " . "style=\"file:black; font-size:14\">" . "SIDE VIEW" . "</text>\n"); echo '</g>';//panel side view end //TES details box $boxStartX = $side_xLine_x_end_text - 250; $boxStartY = $titleY + 500; $adX = $boxStartX + 5; $ad1Y = $boxStartY + 65; $ad2Y = $ad1Y + 9; $ad3Y = $ad2Y + 9; $ad4Y = $ad3Y + 9; $ad5Y = $ad4Y + 9; $ad6Y = $ad5Y + 9; $picX = $boxStartX + 2; $picY = $boxStartY + 4; echo("<rect x=\"$boxStartX\" y=\"$boxStartY\" " . "width=\"250px\" height=\"200px\" " . "style=\"fill:white; stroke:black; " . "stroke-width:1px\" />\n"); echo("<rect x=\"$boxStartX\" y=\"$boxStartY\" " . "width=\"250px\" height=\"120px\" " . "style=\"fill:white; stroke:black; " . "stroke-width:1px\" />\n"); echo("<rect x=\"$boxStartX\" y=\"$boxStartY\" " . "width=\"105px\" height=\"120px\" " . "style=\"fill:white; stroke:black; " . "stroke-width:1px\" />\n"); echo("<image x='$picX' y='$picY' width='100px' height='55px' xlink:href='tes_logo_small.gif'/>"); echo("<text x=\"$adX\" y=\"$ad1Y\" " . "style=\"file:black; font-size:8\">" . "18 Derryloaran Ind Estate" . "</text>\n"); echo("<text x=\"$adX\" y=\"$ad2Y\" " . "style=\"file:black; font-size:8\">" . "Sandholes Rd, Cookstown" . "</text>\n"); echo("<text x=\"$adX\" y=\"$ad3Y\" " . "style=\"file:black; font-size:8\">" . "Co. Tyrone" . "</text>\n"); echo("<text x=\"$adX\" y=\"$ad4Y\" " . "style=\"file:black; font-size:8\">" . "Tel: (028) 8676 1141" . "</text>\n"); echo("<text x=\"$adX\" y=\"$ad5Y\" " . "style=\"file:black; font-size:8\">" . "Fax: (028) 8676 9732" . "</text>\n"); echo("<text x=\"$adX\" y=\"$ad6Y\" " . "style=\"file:black; font-size:8\">" . "Email: [email protected]" . "</text>\n"); $boxTextX = $boxStartX + 110; $boxText1Y = $boxStartY + 15; $boxText2Y = $boxText1Y + 15; $boxText3Y = $boxText2Y + 15; $boxText4Y = $boxText3Y + 15; echo("<text x=\"$boxTextX\" y=\"$boxText1Y\" " . "style=\"file:black; font-size:8\">" . "CLIENT: $company" . "</text>\n"); echo("<text x=\"$boxTextX\" y=\"$boxText2Y\" " . "style=\"file:black; font-size:8\">" . "PROJECT:" . "</text>\n"); echo("<text x=\"$boxTextX\" y=\"$boxText3Y\" " . "style=\"file:black; font-size:8\">" . "$project" . "</text>\n"); echo("<text x=\"$boxTextX\" y=\"$boxText4Y\" " . "style=\"file:black; font-size:8\">" . "DATE: $today" . "</text>\n"); //panel details $det1Y = $boxStartY + 130; $det2Y = $det1Y + 15; $det3Y = $det2Y + 15; $det4Y = $det3Y + 15; $det5Y = $det4Y + 15; echo("<text x=\"$adX\" y=\"$det1Y\" " . "style=\"file:black; font-size:8\">" . "FORM: $form" . "</text>\n"); echo("<text x=\"$adX\" y=\"$det2Y\" " . "style=\"file:black; font-size:8\">" . "FAULT RATING: $fault" . "</text>\n"); echo("<text x=\"$adX\" y=\"$det3Y\" " . "style=\"file:black; font-size:8\">" . "IP RATING: $ip" . "</text>\n"); echo("<text x=\"$adX\" y=\"$det4Y\" " . "style=\"file:black; font-size:8\">" . "ACCESS: $access" . "</text>\n"); echo("<text x=\"$adX\" y=\"$det5Y\" " . "style=\"file:black; font-size:8\">" . "CABLE ENTRY: $entry" . "</text>\n"); //table with descriptions $rCount = 0; $keyX1 = $line_height_x1; $keyY = $boxStartY; $table = mysql_query("SELECT module_name, object_name FROM object WHERE proj_id = '$proj_id' ORDER BY object_name") or die(); while($tt = mysql_fetch_array($table)) { $objtt = $tt['object_name']; $modtt = $tt['module_name']; $rCount = $rCount+1; echo("<text x=\"$keyX1\" y=\"$keyY\" " . "style=\"file:black; font-size:10\">" . "$objtt = $modtt" . "</text>\n"); if ($rCount == 20) { $keyY = $boxStartY; $keyX1 = $keyX1 + 240; $rCount = 0; } else { $keyY = $keyY + 10; } } //end SVG document echo('</svg>' . "\n"); ?> Link to comment https://forums.phpfreaks.com/topic/129387-save-result-in-an-svg-file/ Share on other sites More sharing options...
thebadbad Posted October 21, 2008 Share Posted October 21, 2008 Instead of setting a SVG header and echoing the data, you can save the data in a variable, and then save it as a file with file_put_contents() (PHP 5+). But with so many echoes, it's a good deal of work to rewrite it. Maybe there's a way you can 'catch' the output, and save it as a file. I don't know how. If you just add another header() call, a save prompt will appear. Add this right after your header() call: header('Content-Disposition: attachment; filename="example.svg"'); Link to comment https://forums.phpfreaks.com/topic/129387-save-result-in-an-svg-file/#findComment-670786 Share on other sites More sharing options...
cleary1981 Posted October 21, 2008 Author Share Posted October 21, 2008 Yeah I was thinking about the varable option but wasn't sure if it would work. I will give it a try Link to comment https://forums.phpfreaks.com/topic/129387-save-result-in-an-svg-file/#findComment-670787 Share on other sites More sharing options...
cleary1981 Posted October 21, 2008 Author Share Posted October 21, 2008 I tried that but im not sure if I have done ti right can you take a look? it is creating the svg file but it wont display. I think have an error somewhere. <?php require "config.php"; $proj_id = $_GET['proj']; //set the content type header("Content-type: image/svg-xml"); //mark this as XML $svg_output = "<?xml version='1.0' encoding='iso-8859-1'?> \n"; //Point to SVG DTD $svg_output .= "<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 20000303 Stylable//EN' 'http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/' 'svg-20000303-stylable.dtd'> \n"; //start SVG document, set size in "user units" $svg_output .= "<svg xml:space=\'preserve\' ' . 'width=\'36cm\' height=\'24cm\' ' . 'viewBox=\'0 0 0 0\'> \n"; //x, y, ??, zoomout $today = date('d/m/Y'); $projectQ1 = mysql_query("SELECT * FROM project WHERE proj_id='$proj_id'") or die(mysql_error()); $rowQ1 = mysql_fetch_assoc($projectQ1); $company = $rowQ1['company_name']; $project = $rowQ1['project_name']; $form = $rowQ1['form']; $access = $rowQ1['access']; $entry = $rowQ1['cable_entry']; $ip = $rowQ1['ip_rating']; $fault = $rowQ1['fault_rating']; //draw each object $results = mysql_query("SELECT object_name, module_id, xpos, ypos, height, width FROM object, module WHERE object.module_name = module.module_name AND proj_id='$proj_id'") or die(); while($values = mysql_fetch_array($results)){ $object = $values['object_name']; $module_id = $values['module_id']; $mod = "SELECT module_name FROM module WHERE module_id = $module_id"; $res = mysql_query($mod) or trigger_error(mysql_error()); $row = mysql_fetch_object($res); $module=$row->module_name; $x = $values['xpos']; $y = $values['ypos']; $height = $values['height']/10; $width = $values['width']/10; $xx = $x + 5; $yy = $y + 10; $svg_output .= "<rect x=\'$x\' y=\'$y\' ' . 'width=\'$width\' height=\'$height\' ' . 'style=\'fill:white; stroke:black; ' . 'stroke-width:2px\' />\n"; $svg_output .= "<text x=\'$xx\' y=\'$yy\' ' . 'style=\'file:black; font-size:10\'>' . 'object' . '</text>\n"; } //end SVG document $svg_output .= "</svg> \n"; file_put_contents('example1.svg', $svg_output); ?> Link to comment https://forums.phpfreaks.com/topic/129387-save-result-in-an-svg-file/#findComment-670796 Share on other sites More sharing options...
thebadbad Posted October 21, 2008 Share Posted October 21, 2008 You've escaped the single quotes, when they shouldn't be escaped, in most of the code. I always use double quotes for HTML/XML attributes, but I guess single quotes can be used too. Link to comment https://forums.phpfreaks.com/topic/129387-save-result-in-an-svg-file/#findComment-670833 Share on other sites More sharing options...
thebadbad Posted October 21, 2008 Share Posted October 21, 2008 You also got some errors where you start a string with a double quote and end it with a single, resulting in malformed XML (because it's later closed with a double quote). Link to comment https://forums.phpfreaks.com/topic/129387-save-result-in-an-svg-file/#findComment-670838 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.