Zacząłem interesować się sposobami konwersji plików xml do innych formatów. Jeżeli chodzi o konwersję docbooka do formatu pdf z poziomu php nie znalazłem nic ciekawego, oprócz adresu http://validate.sf.net// Strona pozwala skonwertować dowolny plik docbooka do pdfu. Postanowiłem stworzyć skrypcik udający przeglądarkę, wysyłający metodą POST adres pliku xml i odbierający plik pdf.
Działanie klasy
- klasa wysyła metodą POST http adres pliku xml, który musi być dostępny przez internet.
- konwerter na zdanym serwerze zwraca stronę z tagiem <META HTTP-EQUIV="Refresh" w którym jest adres pliku pdf
- skrypt wyciąga adres pliku pdf i pobiera go metodą GET http
- skrypt zapisuje pdf do pliku.
użycie:
<?php class Docbook2pdf { function Docbook2pdf( $sDocbookUrl, $sPdfFileName ) { $output = $this->PostVars( 'http://www.xml-dev.com/blog/xml2pdf.php', http://www.php.net/array( 'xmlurl' => $sDocbookUrl ) ); $aFile = http://www.php.net/explode( \"n\", $output ); for( $i=0, $count = http://www.php.net/count( $aFile ); $i<$count; $i++ ) { if( http://www.php.net/empty( $aFile[$i] ) ) { http://www.php.net/unset( $aFile[$i] ); } } $lin = http://www.php.net/end( $aFile ); $line = http://www.php.net/prev( $aFile ); $line2 = http://www.php.net/substr( $line, http://www.php.net/strpos( $line, 'http' ) ); $adres = http://www.php.net/substr( $line2, 0, http://www.php.net/strpos( $line2, '\"' ) ); $pdf = $this->getPDF( $adres ); $fp = http://www.php.net/fopen( $sPdfFileName, 'w' ); $p = http://www.php.net/fwrite( $fp, $pdf ); http://www.php.net/fclose( $fp ); http://www.php.net/echo 'gotowe'; } function getPDF( $adres ) { $url = http://www.php.net/parse_url( $adres ); if ($fp = http://www.php.net/fsockopen( $url['host'], $url['port'] ) ) { http://www.php.net/fputs($fp, \"GET \" . $url['path'] . \" HTTP/1.0rnrn\". \"Host: \". $_SERVER[\"HTTP_HOST\"] .\"rn\". \"Accept: text/xml,application/xml,application/pdf,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5rn\". \"Accept-Encoding: gzip,deflatern\". \"Accept-Language: pl,en-us;q=0.7,en;q=0.3rn\". \"Negotiate: transrn\". \"Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL; rv:1.7.6) Gecko/20050226 Firefox/1.0.1rnrn\" ); $return = ''; while ($buf = http://www.php.net/fgets($fp ) ) { $return .= $buf; } http://www.php.net/fclose($fp); return $return; } return false; } function PostVars($url, $vars) { $result = $post = ''; $url = http://www.php.net/parse_url($url); if (!http://www.php.net/is_array($vars)) { return false; } foreach ($vars as $k => $v) { $post .= http://www.php.net/urlencode($k) . '=' . http://www.php.net/urlencode($v) . '&'; } $post = http://www.php.net/substr($post, 0, -1); if ($fp = @http://www.php.net/fsockopen($url['host'], 80)) { http://www.php.net/fputs($fp, \"POST \" . $url['path'] . \" HTTP/1.0rn\" . //\"Accept: image/gif, image/x-xbitmap, image/jpeg, \" . //\"image/pjpeg, application/msword, \" . //\"application/x-shockwave-flash, */*rn\" . //\"Accept-Language: plrn\" . \"Content-Type: application/x-www-form-urlencodedrn\" . //\"Accept-Encoding: gzip, deflatern\" . //\"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; \" . //\"Windows NT 5.1)rn\" . //\"Host: \" . $url['host'] . \"rn\" . \"Content-Length: \" . strlen($post) . \"rn\" . //\"Connection: Keep-Alivern\" . \"rn\" . $post . \"rn\"); while ($buf = http://www.php.net/fread($fp, 8192)) { $result .= $buf; } http://www.php.net/fclose($fp); return $result; } return false; } } ?>
<?php $oDocBook2Pdf = new Docbook2pdf( 'http://example.net/example_docbook.xml', 'docelowy_plik.pdf' ); ?>
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)