array( array( 'name' => = "Xxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxx Xxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxx"; ), array( 'name' => = "Xxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxx Xxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxx"; ), array( 'name' => = "Xxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxx Xxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxx"; ), ); $pdf = XML_SvgToPDF::construct(dirname(__FILE__).'/test.svg',$data); $pdf->output(); expects an svg file (probably made by sodipodi) a block is the group, a) it has a text component with dynamic=address rows=7 cols=3 b) a non-printable rectangle (which is the bounding box) c) some text {xxxx}{yyyy} which is replaced with address[0....][xxxx] = 'somevalue; address[0....][yyyy] = 'somevalue; */ require_once 'XML/Tree/Morph.php'; require_once 'XML/SvgToPdfAlt/Base.php'; // current options for generated file.. $GLOBALS['_XML_SVGTOPDF']['options'] = array( 'debug' => 0, ); class XML_SvgToPDFAlt { var $language; static function debug($s,$e=0) { if (!$GLOBALS['_XML_SVGTOPDF']['options']['debug']) { return; } echo "
".print_R($s,true). ""; if ($e) { exit; } } static function construct($svg, $data=array()) { $t = new XML_SvgToPDFAlt; $t->language = @$data['language']; if (empty($svg)) { trigger_error(__CLASS__.':construct called without svg', E_USER_ERROR); } $x = new XML_Tree_Morph( $svg, array( 'debug' => 0, 'filter' => array( 'svg' => array($t, 'buildObject'), 'image' => array($t, 'buildObject'), 'text' => array($t, 'buildObject'), 'tspan' => array($t, 'buildObject'), 'rect' => array($t, 'buildObject'), 'g' => array($t, 'buildObject'), 'path' => array($t, 'buildObject'), 'sodipodi:namedview' => array($t, 'buildNull'), 'defs' => array($t, 'buildNull'), 'metadata' => array($t, 'buildNull'), ) ) ); $tree = $x->getTreeFromFile(); ///echo '
'.htmlspecialchars(print_r($tree,true));exit; $tree = $t->buildobject($tree); //echo ''.htmlspecialchars(print_r($tree,true)); //echo "";print_r($tree);exit; $orientation = ($tree->width > $tree->height) ? 'L' : 'P'; $GLOBALS['_XML_SVGTOPDF']['options']['file'] = $svg; if ($data['language'] == 'big5') { require_once 'FpdfAlt/Chinese.php'; $pdf=new FpdfAlt_Chinese($orientation ,'mm','A4'); $pdf->AddGBFont(); $pdf->AddBig5Font(); $pdf->AddUniCNShwFont(); $pdf->open(); } else { require_once 'Fpdf.php'; $pdf=new FPDF($orientation ,'mm','A4'); $pdf->open(); } $pdf->setAutoPageBreak(false); $pdf->AliasNbPages(); // convert data to array. if (is_object($data)) { $data = (array) $data; } // assoc. array of key => no of fields per page. $perPage = $tree->calcPerPage(); // no dynamic blocks: if (!$perPage || empty($data)) { $pdf->addPage(); $tree->writePDF($pdf,$data); $t->debug($tree); return $pdf; } // build blocks of data for each page. $haveData = true; $page = 0; while (true == $haveData ) { $page_data = $data; $haveData = false; foreach($perPage as $k=>$v) { if (!$data[$k]) { $page_data[$k] = array(); continue; } $haveData = true; $page_data[$k] = array_splice ( $data[$k], 0,$v); } $page++; if (!$haveData) { break; } $t->debug("PAGE $page"); $pdf->addPage(); // echo ''.htmlspecialchars(print_r($page_data,true)); $tree->writePDF($pdf,$page_data); } $t->debug($tree, true); return $pdf; } function buildNull($node) { return; } function buildObject($node) { $class = 'XML_SvgToPDFAlt_'.$node->name; if (!empty($node->content) && strlen(trim($node->content)) && (@$this->language)) { $node->language = $this->language; } //echo "look for $class?"; if (!class_exists($class) && !empty($node->name)) { // try loading it.. $file = dirname(__FILE__) . '/SvgToPdfAlt/'.ucfirst(strtolower($node->name)). '.php'; $this->debug("loading $file"); if (file_exists($file)) { require_once 'XML/SvgToPdfAlt/'.ucfirst(strtolower($node->name)) . '.php'; } } // now if it doesnt exist.. if (!class_exists($class)) { $this->debug("can not find $class"); $class = 'XML_SvgToPDFAlt_Base'; } //echo '';print_r($node); $r = new $class; $r->fromNode($node); return $r; } }