static function resolve_url($url, $proto, $host, $base_path)
 {
     $parsed_url = explode_url($url);
     $message = null;
     $remote = $proto && $proto !== "file://" || $parsed_url['protocol'] != "";
     $datauri = strpos($parsed_url['protocol'], "data:") === 0;
     try {
         if (!DOMPDF_ENABLE_REMOTE && $remote && !$datauri) {
             throw new DOMPDF_Image_Exception("DOMPDF_ENABLE_REMOTE is set to FALSE");
         } else {
             if (DOMPDF_ENABLE_REMOTE && $remote || $datauri) {
                 $full_url = dompdf_build_url($proto, $host, $base_path, $url);
                 if (isset(self::$_cache[$full_url])) {
                     $resolved_url = self::$_cache[$full_url];
                 } else {
                     $resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_");
                     if ($datauri) {
                         if ($parsed_data_uri = parse_data_uri($url)) {
                             $image = $parsed_data_uri['data'];
                         }
                     } else {
                         $old_err = set_error_handler("record_warnings");
                         $image = wp_remote_get($full_url);
                         $image = isset($image['body']) ? $image['body'] : '';
                         restore_error_handler();
                     }
                     if (strlen($image) == 0) {
                         $msg = $datauri ? "Data-URI could not be parsed" : "Image not found";
                         throw new DOMPDF_Image_Exception($msg);
                     } else {
                         file_put_contents($resolved_url, $image);
                     }
                 }
             } else {
                 $resolved_url = dompdf_build_url($proto, $host, $base_path, $url);
             }
         }
         if (!is_readable($resolved_url) || !filesize($resolved_url)) {
             throw new DOMPDF_Image_Exception("Image not readable or empty");
         } else {
             list($width, $height, $type) = dompdf_getimagesize($resolved_url);
             if ($width && $height && in_array($type, array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP))) {
                 if (DOMPDF_ENABLE_REMOTE && $remote) {
                     self::$_cache[$full_url] = $resolved_url;
                 }
             } else {
                 throw new DOMPDF_Image_Exception("Image type unknown");
                 unlink($resolved_url);
             }
         }
     } catch (DOMPDF_Image_Exception $e) {
         $resolved_url = self::$broken_image;
         $type = IMAGETYPE_PNG;
         $message = $e->getMessage() . " \n {$url}";
     }
     return array($resolved_url, $type, $message);
 }
 /**
  * Resolve and fetch an image for use.
  *
  * @param string $url        The url of the image
  * @param string $proto      Default protocol if none specified in $url
  * @param string $host       Default host if none specified in $url
  * @param string $base_path  Default path if none specified in $url
  * @return array             An array with two elements: The local path to the image and the image extension
  */
 static function resolve_url($url, $proto, $host, $base_path)
 {
     global $_dompdf_warnings;
     $resolved_url = null;
     // Remove dynamic part of url to determine the file extension
     $tmp = preg_replace('/\\?.*/', '', $url);
     // We need to preserve the file extenstion
     $i = mb_strrpos($tmp, ".");
     if ($i === false) {
         throw new DOMPDF_Exception("Unknown image type: {$url}.");
     }
     $ext = mb_strtolower(mb_substr($tmp, $i + 1));
     $parsed_url = explode_url($url);
     $remote = $proto != "" && $proto != "file://";
     $remote = $remote || $parsed_url['protocol'] != "";
     if (!DOMPDF_ENABLE_REMOTE && $remote) {
         $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
         $ext = "png";
     } else {
         if (DOMPDF_ENABLE_REMOTE && $remote) {
             // Download remote files to a temporary directory
             $url = build_url($proto, $host, $base_path, $url);
             if (isset(self::$_cache[$url])) {
                 list($resolved_url, $ext) = self::$_cache[$url];
                 //echo "Using cached image $url (" . $resolved_url . ")\n";
             } else {
                 //echo "Downloading file $url to temporary location: ";
                 $resolved_url = tempnam(DOMPDF_TEMP_DIR, "dompdf_img_");
                 //echo $resolved_url . "\n";
                 $old_err = set_error_handler("record_warnings");
                 $image = file_get_contents($url);
                 restore_error_handler();
                 if (strlen($image) == 0) {
                     $image = file_get_contents(DOMPDF_LIB_DIR . "/res/broken_image.png");
                     $ext = "png";
                 }
                 file_put_contents($resolved_url, $image);
                 self::$_cache[$url] = array($resolved_url, $ext);
             }
         } else {
             $resolved_url = build_url($proto, $host, $base_path, $url);
             //echo $resolved_url . "\n";
         }
     }
     if (!is_readable($resolved_url) || !filesize($resolved_url)) {
         $_dompdf_warnings[] = "File " . $resolved_url . " is not readable or is an empty file.\n";
         $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
         $ext = "png";
     }
     // Assume for now that all dynamic images are pngs
     if ($ext == "php") {
         $ext = "png";
     }
     return array($resolved_url, $ext);
 }
示例#3
0
文件: style.cls.php 项目: artre/study
 /**
  * Set the background image url
  *
  * @link http://www.w3.org/TR/CSS21/colors.html#background-properties
  * @param string $url
  */
 function set_background_image($val)
 {
     if (mb_strpos($val, "url") !== false) {
         $val = preg_replace("/url\\(['\"]?([^'\")]+)['\"]?\\)/", "\\1", trim($val));
     } else {
         $val = "none";
     }
     // Resolve the url now in the context of the current stylesheet
     $parsed_url = explode_url($val);
     if ($parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "") {
         $url = realpath($this->_stylesheet->get_base_path() . $parsed_url["file"]);
     } else {
         $url = build_url($this->_stylesheet->get_protocol(), $this->_stylesheet->get_host(), $this->_stylesheet->get_base_path(), $val);
     }
     $this->_props["background_image"] = $url;
 }
示例#4
0
 /**
  * Builds the {@link Frame_Tree}, loads any CSS and applies the styles to
  * the {@link Frame_Tree}
  */
 protected function _process_html()
 {
     $this->_tree->build_tree();
     $this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET, Stylesheet::ORIG_UA);
     $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES;
     $acceptedmedia[] = $this->get_option("default_media_type");
     // <base href="" />
     $base_nodes = $this->_xml->getElementsByTagName("base");
     if ($base_nodes->length && ($href = $base_nodes->item(0)->getAttribute("href"))) {
         list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($href);
     }
     // Set the base path of the Stylesheet to that of the file being processed
     $this->_css->set_protocol($this->_protocol);
     $this->_css->set_host($this->_base_host);
     $this->_css->set_base_path($this->_base_path);
     // Get all the stylesheets so that they are processed in document order
     $xpath = new DOMXPath($this->_xml);
     $stylesheets = $xpath->query("//*[name() = 'link' or name() = 'style']");
     foreach ($stylesheets as $tag) {
         switch (strtolower($tag->nodeName)) {
             // load <link rel="STYLESHEET" ... /> tags
             case "link":
                 if (mb_strtolower(stripos($tag->getAttribute("rel"), "stylesheet") !== false) || mb_strtolower($tag->getAttribute("type")) === "text/css") {
                     //Check if the css file is for an accepted media type
                     //media not given then always valid
                     $formedialist = preg_split("/[\\s\n,]/", $tag->getAttribute("media"), -1, PREG_SPLIT_NO_EMPTY);
                     if (count($formedialist) > 0) {
                         $accept = false;
                         foreach ($formedialist as $type) {
                             if (in_array(mb_strtolower(trim($type)), $acceptedmedia)) {
                                 $accept = true;
                                 break;
                             }
                         }
                         if (!$accept) {
                             //found at least one mediatype, but none of the accepted ones
                             //Skip this css file.
                             continue;
                         }
                     }
                     $url = $tag->getAttribute("href");
                     $url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url);
                     $this->_css->load_css_file($url, Stylesheet::ORIG_AUTHOR);
                 }
                 break;
                 // load <style> tags
             // load <style> tags
             case "style":
                 // Accept all <style> tags by default (note this is contrary to W3C
                 // HTML 4.0 spec:
                 // http://www.w3.org/TR/REC-html40/present/styles.html#adef-media
                 // which states that the default media type is 'screen'
                 if ($tag->hasAttributes() && ($media = $tag->getAttribute("media")) && !in_array($media, $acceptedmedia)) {
                     continue;
                 }
                 $css = "";
                 if ($tag->hasChildNodes()) {
                     $child = $tag->firstChild;
                     while ($child) {
                         $css .= $child->nodeValue;
                         // Handle <style><!-- blah --></style>
                         $child = $child->nextSibling;
                     }
                 } else {
                     $css = $tag->nodeValue;
                 }
                 $this->_css->load_css($css);
                 break;
         }
     }
 }
示例#5
0
 /**
  * Loads an HTML file
  *
  * Parse errors are stored in the global array _dompdf_warnings.
  *
  * @param string $file a filename or url to load
  */
 function load_html_file($file)
 {
     $this->save_locale();
     // Store parsing warnings as messages (this is to prevent output to the
     // browser if the html is ugly and the dom extension complains,
     // preventing the pdf from being streamed.)
     if (!$this->_protocol && !$this->_base_host && !$this->_base_path) {
         list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
     }
     if (!DOMPDF_ENABLE_REMOTE && ($this->_protocol != "" && $this->_protocol !== "file://")) {
         throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
     }
     if ($this->_protocol == "" || $this->_protocol === "file://") {
         $realfile = realpath($file);
         if (!$file) {
             throw new DOMPDF_Exception("File '{$file}' not found.");
         }
         if (strpos($realfile, DOMPDF_CHROOT) !== 0) {
             throw new DOMPDF_Exception("Permission denied on {$file}.");
         }
         // Exclude dot files (e.g. .htaccess)
         if (substr(basename($realfile), 0, 1) === ".") {
             throw new DOMPDF_Exception("Permission denied on {$file}.");
         }
         $file = $realfile;
     }
     $contents = file_get_contents($file, null, $this->_http_context);
     $encoding = null;
     // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/
     if (isset($http_response_header)) {
         foreach ($http_response_header as $_header) {
             if (preg_match("@Content-Type:\\s*[\\w/]+;\\s*?charset=([^\\s]+)@i", $_header, $matches)) {
                 $encoding = strtoupper($matches[1]);
                 break;
             }
         }
     }
     $this->restore_locale();
     $this->load_html($contents, $encoding);
 }
 protected function _image($val)
 {
     $DEBUGCSS = DEBUGCSS;
     $parsed_url = "none";
     if (mb_strpos($val, "url") === false) {
         $path = "none";
         //Don't resolve no image -> otherwise would prefix path and no longer recognize as none
     } else {
         $val = preg_replace("/url\\(['\"]?([^'\")]+)['\"]?\\)/", "\\1", trim($val));
         // Resolve the url now in the context of the current stylesheet
         $parsed_url = explode_url($val);
         if ($parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "") {
             if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\') {
                 $path = $_SERVER["DOCUMENT_ROOT"] . '/';
             } else {
                 $path = $this->_stylesheet->get_base_path();
             }
             $path .= $parsed_url["path"] . $parsed_url["file"];
             $path = realpath($path);
             // If realpath returns FALSE then specifically state that there is no background image
             if (!$path) {
                 $path = 'none';
             }
         } else {
             $path = build_url($this->_stylesheet->get_protocol(), $this->_stylesheet->get_host(), $this->_stylesheet->get_base_path(), $val);
         }
     }
     if ($DEBUGCSS) {
         print "<pre>[_image\n";
         print_r($parsed_url);
         print $this->_stylesheet->get_protocol() . "\n" . $this->_stylesheet->get_base_path() . "\n" . $path . "\n";
         print "_image]</pre>";
     }
     return $path;
 }
示例#7
0
 /**
  * Add a link to the pdf
  *
  * @param string $url The url to link to
  * @param float  $x   The x position of the link
  * @param float  $y   The y position of the link
  * @param float  $width   The width of the link
  * @param float  $height   The height of the link
  */
 function add_link($url, $x, $y, $width, $height)
 {
     $y = $this->y($y) - $height;
     if (strpos($url, '#') === 0) {
         // Local link
         $name = substr($url, 1);
         if ($name) {
             $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} destname=" . substr($url, 1) . " linewidth=0");
         }
     } else {
         list($proto, $host, $path, $file) = explode_url($url);
         if ($proto == "" || $proto == "file://") {
             return;
         }
         // Local links are not allowed
         $url = build_url($proto, $host, $path, $file);
         $url = str_replace("=", "%3D", rawurldecode($url));
         $action = $this->_pdf->create_action("URI", "url=" . $url);
         $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} action={activate={$action}} linewidth=0");
     }
 }
 /**
  * Loads an HTML file
  *
  * Parse errors are stored in the global array _dompdf_warnings.
  *
  * @param string $file a filename or url to load
  */
 function load_html_file($file)
 {
     // Store parsing warnings as messages (this is to prevent output to the
     // browser if the html is ugly and the dom extension complains,
     // preventing the pdf from being streamed.)
     if (!$this->_protocol && !$this->_base_host && !$this->_base_path) {
         list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
     }
     if (!DOMPDF_ENABLE_REMOTE && ($this->_protocol != "" && $this->_protocol !== "file://")) {
         throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
     }
     if ($this->_protocol == "" || $this->_protocol === "file://") {
         $realfile = realpath($file);
         if (!$file) {
             throw new DOMPDF_Exception("File '{$file}' not found.");
         }
         if (strpos($realfile, DOMPDF_CHROOT) !== 0) {
             throw new DOMPDF_Exception("Permission denied on {$file}.");
         }
         // Exclude dot files (e.g. .htaccess)
         if (substr(basename($realfile), 0, 1) === ".") {
             throw new DOMPDF_Exception("Permission denied on {$file}.");
         }
         $file = $realfile;
     }
     $this->load_html(file_get_contents($file));
 }
 /**
  * load and parse a CSS file
  *
  * @param string $file
  */
 function load_css_file($file)
 {
     global $_dompdf_warnings;
     // Prevent circular references
     if (array_key_exists($file, $this->_loaded_files)) {
         return;
     }
     $this->_loaded_files[$file] = true;
     list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = explode_url($file);
     if (!DOMPDF_ENABLE_REMOTE && ($this->_protocol != "" && $this->_protocol != "file://")) {
         record_warnings(E_USER_ERROR, "Remote CSS file '{$file}' requested, but DOMPDF_ENABLE_REMOTE is false.", __FILE__, __LINE__);
         return;
     }
     if ($this->_protocol == "") {
         $file = $this->_base_path . $filename;
     }
     set_error_handler("record_warnings");
     $css = file_get_contents($file);
     restore_error_handler();
     if ($css == "") {
         record_warnings(E_USER_ERROR, "Unable to load css file {$file}", __FILE__, __LINE__);
         return;
     }
     $this->_parse_css($css);
 }
 /**
  * load and parse a CSS file
  *
  * @param string $file
  * @param int    $origin
  */
 function load_css_file($file, $origin = self::ORIG_AUTHOR)
 {
     if ($origin) {
         $this->_current_origin = $origin;
     }
     // Prevent circular references
     if (isset($this->_loaded_files[$file])) {
         return;
     }
     $this->_loaded_files[$file] = true;
     if (strpos($file, "data:") === 0) {
         $parsed = parse_data_uri($file);
         $css = $parsed["data"];
     } else {
         $parsed_url = explode_url($file);
         list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url;
         // Fix submitted by Nick Oostveen for aliased directory support:
         if ($this->_protocol == "") {
             $file = $this->_base_path . $filename;
         } else {
             $file = build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename);
         }
         set_error_handler("record_warnings");
         $css = file_get_contents($file, null, $this->_dompdf->get_http_context());
         restore_error_handler();
         $good_mime_type = true;
         // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/
         if (isset($http_response_header) && !$this->_dompdf->get_quirksmode()) {
             foreach ($http_response_header as $_header) {
                 if (preg_match("@Content-Type:\\s*([\\w/]+)@i", $_header, $matches) && $matches[1] !== "text/css") {
                     $good_mime_type = false;
                 }
             }
         }
         if (!$good_mime_type || $css == "") {
             record_warnings(E_USER_WARNING, "Unable to load css file {$file}", __FILE__, __LINE__);
             return;
         }
     }
     $this->_parse_css($css);
 }
示例#11
0
 /**
  * Loads an HTML file
  *
  * Parse errors are stored in the global array _dompdf_warnings.
  *
  * @param string $file a filename or url to load
  */
 function load_html_file($file)
 {
     // Store parsing warnings as messages (this is to prevent output to the
     // browser if the html is ugly and the dom extension complains,
     // preventing the pdf from being streamed.)
     list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
     if (!DOMPDF_ENABLE_REMOTE && ($this->_protocol != "" && $this->_protocol != "file://")) {
         throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
     }
     if (!DOMPDF_ENABLE_PHP) {
         set_error_handler("record_warnings");
         $this->_xml->loadHTMLFile($file);
         restore_error_handler();
     } else {
         $this->load_html(file_get_contents($file));
     }
 }
示例#12
0
 /**
  * Resolve and fetch an image for use.
  *
  * @param string $url        The url of the image
  * @param string $proto      Default protocol if none specified in $url
  * @param string $host       Default host if none specified in $url
  * @param string $base_path  Default path if none specified in $url
  * @return array             An array with two elements: The local path to the image and the image extension
  */
 static function resolve_url($url, $proto, $host, $base_path)
 {
     global $_dompdf_warnings;
     $parsed_url = explode_url($url);
     $DEBUGPNG = DEBUGPNG;
     //=DEBUGPNG; Allow override of global setting for ad hoc debug
     $full_url_dbg = '';
     //debugpng
     if ($DEBUGPNG) {
         print 'resolve_url(' . $url . ',' . $proto . ',' . $host . ',' . $base_path . ')(' . $parsed_url['protocol'] . ')';
     }
     $remote = $proto != "" && $proto !== "file://";
     $remote = $remote || $parsed_url['protocol'] != "";
     if (!DOMPDF_ENABLE_REMOTE && $remote) {
         $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
         $ext = "png";
         //debugpng
         if ($DEBUGPNG) {
             $full_url_dbg = '(blockedremote)';
         }
     } else {
         if (DOMPDF_ENABLE_REMOTE && $remote) {
             // Download remote files to a temporary directory
             $full_url = build_url($proto, $host, $base_path, $url);
             if (isset(self::$_cache[$full_url])) {
                 list($resolved_url, $ext) = self::$_cache[$full_url];
                 //debugpng
                 if ($DEBUGPNG) {
                     $full_url_dbg = $full_url . '(cache)';
                 }
             } else {
                 $resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_");
                 //debugpng
                 if ($DEBUGPNG) {
                     echo $resolved_url . "\n";
                 }
                 $old_err = set_error_handler("record_warnings");
                 $image = file_get_contents($full_url);
                 restore_error_handler();
                 if (strlen($image) == 0) {
                     //target image not found
                     $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
                     $ext = "png";
                     //debugpng
                     if ($DEBUGPNG) {
                         $full_url_dbg = $full_url . '(missing)';
                     }
                 } else {
                     file_put_contents($resolved_url, $image);
                     //e.g. fetch.php?media=url.jpg&cache=1
                     //- Image file name might be one of the dynamic parts of the url, don't strip off!
                     //  if ( preg_match("/.*\.(\w+)/",$url,$match) ) $ext = $match[1];
                     //- a remote url does not need to have a file extension at all
                     //- local cached file does not have a matching file extension
                     //Therefore get image type from the content
                     $imagedim = getimagesize($resolved_url);
                     if ($imagedim[2] >= 1 && $imagedim[2] <= 3 && $imagedim[0] && $imagedim[1]) {
                         //target image is valid
                         $imagetypes = array('', 'gif', 'jpeg', 'png', 'swf');
                         $ext = $imagetypes[$imagedim[2]];
                         if (rename($resolved_url, $resolved_url . '.' . $ext)) {
                             $resolved_url .= '.' . $ext;
                         }
                         //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup.
                         //Only execute on successfull caching of remote image.
                         self::$_cache[$full_url] = array($resolved_url, $ext);
                     } else {
                         //target image is not valid.
                         unlink($resolved_url);
                         $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
                         $ext = "png";
                     }
                 }
             }
         } else {
             $resolved_url = build_url($proto, $host, $base_path, $url);
             if ($DEBUGPNG) {
                 print 'build_url(' . $proto . ',' . $host . ',' . $base_path . ',' . $url . ')(' . $resolved_url . ')';
             }
             if (!preg_match("/.*\\.(\\w+)/", $url, $match)) {
                 //debugpng
                 if ($DEBUGPNG) {
                     print '[resolve_url exception ' . $url . ']';
                 }
                 throw new DOMPDF_Exception("Unknown image type: {$url}.");
             }
             $ext = $match[1];
             //debugpng
             if ($DEBUGPNG) {
                 $full_url_dbg = '(local)';
             }
         }
     }
     if (!is_readable($resolved_url) || !filesize($resolved_url)) {
         //debugpng
         if ($DEBUGPNG) {
             $full_url_dbg .= '(nocache' . $resolved_url . ')';
         }
         $_dompdf_warnings[] = "File " . $resolved_url . " is not readable or is an empty file.\n";
         $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
         $ext = "png";
     }
     //debugpng
     if ($DEBUGPNG) {
         print '[resolve_url ' . $url . '|' . $full_url_dbg . '|' . $resolved_url . '|' . $ext . ']';
     }
     return array($resolved_url, $ext);
 }
 function load_html_file($file)
 {
     $this->save_locale();
     if (!$this->_protocol && !$this->_base_host && !$this->_base_path) {
         list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
     }
     if (!DOMPDF_ENABLE_REMOTE && ($this->_protocol != "" && $this->_protocol !== "file://")) {
         throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
     }
     if ($this->_protocol == "" || $this->_protocol === "file://") {
         $realfile = realpath($file);
         if (!$file) {
             throw new DOMPDF_Exception("File '{$file}' not found.");
         }
         if (strpos($realfile, DOMPDF_CHROOT) !== 0) {
             throw new DOMPDF_Exception("Permission denied on {$file}.");
         }
         if (substr(basename($realfile), 0, 1) === ".") {
             throw new DOMPDF_Exception("Permission denied on {$file}.");
         }
         $file = $realfile;
     }
     $contents = file_get_contents($file, null, $this->_http_context);
     $encoding = null;
     if (isset($http_response_header)) {
         foreach ($http_response_header as $_header) {
             if (preg_match("@Content-Type:\\s*[\\w/]+;\\s*?charset=([^\\s]+)@i", $_header, $matches)) {
                 $encoding = strtoupper($matches[1]);
                 break;
             }
         }
     }
     $this->restore_locale();
     $this->load_html($contents, $encoding);
 }
 protected function _image($val)
 {
     $DEBUGCSS = DEBUGCSS;
     if (mb_strpos($val, "url") === false) {
         $path = "none";
     } else {
         $val = preg_replace("/url\\(['\"]?([^'\")]+)['\"]?\\)/", "\\1", trim($val));
         $parsed_url = explode_url($val);
         if ($parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "") {
             if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\') {
                 $path = $_SERVER["DOCUMENT_ROOT"] . '/';
             } else {
                 $path = $this->_stylesheet->get_base_path();
             }
             $path .= $parsed_url["path"] . $parsed_url["file"];
             $path = realpath($path);
             if (!$path) {
                 $path = 'none';
             }
         } else {
             $path = dompdf_build_url($this->_stylesheet->get_protocol(), $this->_stylesheet->get_host(), $this->_stylesheet->get_base_path(), $val);
         }
     }
     if ($DEBUGCSS) {
         print "<pre>[_image\n";
         print_r($parsed_url);
         print $this->_stylesheet->get_protocol() . "\n" . $this->_stylesheet->get_base_path() . "\n" . $path . "\n";
         print "_image]</pre>";
     }
     return $path;
 }
示例#15
0
 /**
  * Resolve and fetch an image for use.
  *
  * @param string $url        The url of the image
  * @param string $proto      Default protocol if none specified in $url
  * @param string $host       Default host if none specified in $url
  * @param string $base_path  Default path if none specified in $url
  * @return array             An array with two elements: The local path to the image and the image extension
  */
 static function resolve_url($url, $proto, $host, $base_path)
 {
     $parsed_url = explode_url($url);
     $message = null;
     $remote = $proto && $proto !== "file://" || $parsed_url['protocol'] != "";
     $datauri = strpos($parsed_url['protocol'], "data:") === 0;
     try {
         // Remote not allowed and is not DataURI
         if (!DOMPDF_ENABLE_REMOTE && $remote && !$datauri) {
             throw new DOMPDF_Image_Exception("DOMPDF_ENABLE_REMOTE is set to FALSE");
         } else {
             if (DOMPDF_ENABLE_REMOTE && $remote || $datauri) {
                 // Download remote files to a temporary directory
                 $full_url = build_url($proto, $host, $base_path, $url);
                 // From cache
                 if (isset(self::$_cache[$full_url])) {
                     $resolved_url = self::$_cache[$full_url];
                 } else {
                     $resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_");
                     if ($datauri) {
                         if ($parsed_data_uri = parse_data_uri($url)) {
                             $image = $parsed_data_uri['data'];
                         }
                     } else {
                         $old_err = set_error_handler("record_warnings");
                         $image = file_get_contents($full_url);
                         restore_error_handler();
                     }
                     // Image not found or invalid
                     if (strlen($image) == 0) {
                         $msg = $datauri ? "Data-URI could not be parsed" : "Image not found";
                         throw new DOMPDF_Image_Exception($msg);
                     } else {
                         //e.g. fetch.php?media=url.jpg&cache=1
                         //- Image file name might be one of the dynamic parts of the url, don't strip off!
                         //- a remote url does not need to have a file extension at all
                         //- local cached file does not have a matching file extension
                         //Therefore get image type from the content
                         file_put_contents($resolved_url, $image);
                     }
                 }
             } else {
                 $resolved_url = build_url($proto, $host, $base_path, $url);
             }
         }
         // Check if the local file is readable
         if (!is_readable($resolved_url) || !filesize($resolved_url)) {
             throw new DOMPDF_Image_Exception("Image not readable or empty");
         } else {
             list($width, $height, $type) = dompdf_getimagesize($resolved_url);
             // Known image type
             if ($width && $height && in_array($type, array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP))) {
                 //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup.
                 //Only execute on successfull caching of remote image.
                 if (DOMPDF_ENABLE_REMOTE && $remote) {
                     self::$_cache[$full_url] = $resolved_url;
                 }
             } else {
                 throw new DOMPDF_Image_Exception("Image type unknown");
                 unlink($resolved_url);
             }
         }
     } catch (DOMPDF_Image_Exception $e) {
         $resolved_url = self::$broken_image;
         $type = IMAGETYPE_PNG;
         $message = $e->getMessage() . " \n {$url}";
     }
     return array($resolved_url, $type, $message);
 }
示例#16
0
}
$dompdf->set_paper($paper, $orientation);
$dompdf->render();
if ($_dompdf_show_warnings) {
    foreach ($_dompdf_warnings as $msg) {
        echo $msg . "\n";
    }
    flush();
}
if ($save_file) {
    //   if ( !is_writable($outfile) )
    //     throw new DOMPDF_Exception("'$outfile' is not writable.");
    if (strtolower(DOMPDF_PDF_BACKEND) == "gd") {
        $outfile = str_replace(".pdf", ".png", $outfile);
    }
    list($proto, $host, $path, $file) = explode_url($outfile);
    if ($proto != "") {
        // i.e. not file://
        $outfile = $file;
    }
    // just save it locally, FIXME? could save it like wget: ./host/basepath/file
    $outfile = realpath(dirname($outfile)) . DIRECTORY_SEPARATOR . basename($outfile);
    if (strpos($outfile, DOMPDF_CHROOT) !== 0) {
        throw new DOMPDF_Exception("Permission denied.");
    }
    file_put_contents($outfile, $dompdf->output(array("compress" => 0)));
    exit(0);
}
if (!headers_sent()) {
    $dompdf->stream($outfile);
}
 /**
  * load and parse a CSS file
  *
  * @param string $file
  */
 function load_css_file($file)
 {
     global $_dompdf_warnings;
     // Prevent circular references
     if (isset($this->_loaded_files[$file])) {
         return;
     }
     $this->_loaded_files[$file] = true;
     $parsed_url = explode_url($file);
     list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url;
     if (!DOMPDF_ENABLE_REMOTE && ($this->_protocol != "" && $this->_protocol != "file://")) {
         record_warnings(E_USER_WARNING, "Remote CSS file '{$file}' requested, but DOMPDF_ENABLE_REMOTE is false.", __FILE__, __LINE__);
         return;
     }
     // Fix submitted by Nick Oostveen for aliased directory support:
     if ($this->_protocol == "") {
         $file = $this->_base_path . $filename;
     } else {
         $file = build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename);
     }
     set_error_handler("record_warnings");
     $css = file_get_contents($file);
     restore_error_handler();
     if ($css == "") {
         record_warnings(E_USER_WARNING, "Unable to load css file {$file}", __FILE__, __LINE__);
         return;
     }
     $this->_parse_css($css);
 }