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); }
/** * 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; }
/** * 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; } } }
/** * 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; }
/** * 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); }
/** * 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)); } }
/** * 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; }
/** * 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); }
} $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); }