亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用PHP+JavaScript將HTML頁面轉換為圖片的實例分享

2019-11-20 10:14:42
字體:
來源:轉載
供稿:網友

1,準備要素

1)替換字體的js文件

js代碼:

function com_stewartspeak_replacement() {/*  Dynamic Heading Generator  By Stewart Rosenberger  http://www.stewartspeak.com/headings/   This script searches through a web page for specific or general elements  and replaces them with dynamically generated images, in conjunction with  a server-side script.*/replaceSelector("h1","dynatext/heading.php",true);//前兩個參數需要修改var testURL = "dynatext/loading.gif" ;//修改為對應的圖片路徑 var doNotPrintImages = false;var printerCSS = "replacement-print.css"; var hideFlicker = false;var hideFlickerCSS = "replacement-screen.css";var hideFlickerTimeout = 100;//這里可以做相應的修改/* ---------------------------------------------------------------------------  For basic usage, you should not need to edit anything below this comment.  If you need to further customize this script's abilities, make sure  you're familiar with Javascript. And grab a soda or something.*/ var items;var imageLoaded = false;var documentLoaded = false; function replaceSelector(selector,url,wordwrap){  if(typeof items == "undefined")    items = new Array();   items[items.length] = {selector: selector, url: url, wordwrap: wordwrap};} if(hideFlicker){      document.write('<link id="hide-flicker" rel="stylesheet" media="screen" href="' + hideFlickerCSS + '" />');      window.flickerCheck = function()  {    if(!imageLoaded)      setStyleSheetState('hide-flicker',false);  };  setTimeout('window.flickerCheck();',hideFlickerTimeout)} if(doNotPrintImages)  document.write('<link id="print-text" rel="stylesheet" media="print" href="' + printerCSS + '" />'); var test = new Image();test.onload = function() { imageLoaded = true; if(documentLoaded) replacement(); };test.src = testURL + "?date=" + (new Date()).getTime(); addLoadHandler(function(){ documentLoaded = true; if(imageLoaded) replacement(); });  function documentLoad(){  documentLoaded = true;  if(imageLoaded)    replacement();} function replacement(){  for(var i=0;i<items.length;i++)  {    var elements = getElementsBySelector(items[i].selector);    if(elements.length > 0) for(var j=0;j<elements.length;j++)    {      if(!elements[j])        continue ;           var text = extractText(elements[j]);      while(elements[j].hasChildNodes())        elements[j].removeChild(elements[j].firstChild);       var tokens = items[i].wordwrap ? text.split(' ') : [text] ;      for(var k=0;k<tokens.length;k++)      {        var url = items[i].url + "?text="+escape(tokens[k]+' ')+"&selector="+escape(items[i].selector);        var image = document.createElement("img");        image.className = "replacement";        image.alt = tokens[k] ;        image.src = url;        elements[j].appendChild(image);      }       if(doNotPrintImages)      {        var span = document.createElement("span");        span.style.display = 'none';        span.className = "print-text";        span.appendChild(document.createTextNode(text));        elements[j].appendChild(span);      }    }  }   if(hideFlicker)    setStyleSheetState('hide-flicker',false);} function addLoadHandler(handler){  if(window.addEventListener)  {    window.addEventListener("load",handler,false);  }  else if(window.attachEvent)  {    window.attachEvent("onload",handler);  }  else if(window.onload)  {    var oldHandler = window.onload;    window.onload = function piggyback()    {      oldHandler();      handler();    };  }  else  {    window.onload = handler;  }} function setStyleSheetState(id,enabled) {  var sheet = document.getElementById(id);  if(sheet)    sheet.disabled = (!enabled);} function extractText(element){  if(typeof element == "string")    return element;  else if(typeof element == "undefined")    return element;  else if(element.innerText)    return element.innerText;   var text = "";  var kids = element.childNodes;  for(var i=0;i<kids.length;i++)  {    if(kids[i].nodeType == 1)    text += extractText(kids[i]);    else if(kids[i].nodeType == 3)    text += kids[i].nodeValue;  }   return text;} /*  Finds elements on page that match a given CSS selector rule. Some  complicated rules are not compatible.  Based on Simon Willison's excellent "getElementsBySelector" function.  Original code (with comments and description):    http://simon.incutio.com/archive/2003/03/25/getElementsBySelector*/function getElementsBySelector(selector){  var tokens = selector.split(' ');  var currentContext = new Array(document);  for(var i=0;i<tokens.length;i++)  {    token = tokens[i].replace(/^/s+/,'').replace(//s+$/,'');    if(token.indexOf('#') > -1)    {      var bits = token.split('#');      var tagName = bits[0];      var id = bits[1];      var element = document.getElementById(id);      if(tagName && element.nodeName.toLowerCase() != tagName)        return new Array();      currentContext = new Array(element);      continue;    }     if(token.indexOf('.') > -1)    {      var bits = token.split('.');      var tagName = bits[0];      var className = bits[1];      if(!tagName)        tagName = '*';       var found = new Array;      var foundCount = 0;      for(var h=0;h<currentContext.length;h++)      {        var elements;        if(tagName == '*')          elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');        else          elements = currentContext[h].getElementsByTagName(tagName);         for(var j=0;j<elements.length;j++)          found[foundCount++] = elements[j];      }       currentContext = new Array;      var currentContextIndex = 0;      for(var k=0;k<found.length;k++)      {        if(found[k].className && found[k].className.match(new RegExp('//b'+className+'//b')))          currentContext[currentContextIndex++] = found[k];      }       continue;    }     if(token.match(/^(/w*)/[(/w+)([=~/|/^/$/*]?)=?"?([^/]"]*)"?/]$/))    {      var tagName = RegExp.$1;      var attrName = RegExp.$2;      var attrOperator = RegExp.$3;      var attrValue = RegExp.$4;      if(!tagName)        tagName = '*';       var found = new Array;      var foundCount = 0;      for(var h=0;h<currentContext.length;h++)      {        var elements;        if(tagName == '*')          elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');        else          elements = currentContext[h].getElementsByTagName(tagName);         for(var j=0;j<elements.length;j++)          found[foundCount++] = elements[j];      }       currentContext = new Array;      var currentContextIndex = 0;      var checkFunction;      switch(attrOperator)      {        case '=':          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };          break;        case '~':          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('//b'+attrValue+'//b'))); };          break;        case '|':          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };          break;        case '^':          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };          break;        case '$':          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };          break;        case '*':          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };          break;        default :          checkFunction = function(e) { return e.getAttribute(attrName); };      }       currentContext = new Array;      var currentContextIndex = 0;      for(var k=0;k<found.length;k++)      {        if(checkFunction(found[k]))          currentContext[currentContextIndex++] = found[k];      }       continue;    }     tagName = token;    var found = new Array;    var foundCount = 0;    for(var h=0;h<currentContext.length;h++)    {      var elements = currentContext[h].getElementsByTagName(tagName);      for(var j=0;j<elements.length; j++)        found[foundCount++] = elements[j];    }     currentContext = found;  }   return currentContext;}  }// end of scope, execute codeif(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera//?6/i))  com_stewartspeak_replacement();

2)生成圖片的php文件

<?php/*  Dynamic Heading Generator  By Stewart Rosenberger  http://www.stewartspeak.com/headings/     This script generates PNG images of text, written in  the font/size that you specify. These PNG images are passed  back to the browser. Optionally, they can be cached for later use.   If a cached image is found, a new image will not be generated,  and the existing copy will be sent to the browser.   Additional documentation on PHP's image handling capabilities can  be found at http://www.php.net/image/  */$font_file = 'trebuc.ttf' ;//可以做相應的xiuga$font_size = 23 ;//可以做相應的修改$font_color = '#000000' ;$background_color = '#ffffff' ;$transparent_background = true ;$cache_images = true ;$cache_folder = 'cache' ;/* ---------------------------------------------------------------------------  For basic usage, you should not need to edit anything below this comment.  If you need to further customize this script's abilities, make sure you  are familiar with PHP and its image handling capabilities. ---------------------------------------------------------------------------*/ $mime_type = 'image/png' ;$extension = '.png' ;$send_buffer_size = 4096 ; // check for GD supportif(!function_exists('ImageCreate'))  fatal_error('Error: Server does not support PHP image generation') ; // clean up textif(empty($_GET['text']))  fatal_error('Error: No text specified.') ;   $text = $_GET['text'] ;if(get_magic_quotes_gpc())  $text = stripslashes($text) ;$text = javascript_to_html($text) ; // look for cached copy, send if it exists$hash = md5(basename($font_file) . $font_size . $font_color .      $background_color . $transparent_background . $text) ;$cache_filename = $cache_folder . '/' . $hash . $extension ;if($cache_images && ($file = @fopen($cache_filename,'rb'))){  header('Content-type: ' . $mime_type) ;  while(!feof($file))    print(($buffer = fread($file,$send_buffer_size))) ;  fclose($file) ;  exit ;} // check font availability$font_found = is_readable($font_file) ;if(!$font_found){  fatal_error('Error: The server is missing the specified font.') ;} // create image$background_rgb = hex_to_rgb($background_color) ;$font_rgb = hex_to_rgb($font_color) ;$dip = get_dip($font_file,$font_size) ;$box = @ImageTTFBBox($font_size,0,$font_file,$text) ;$image = @ImageCreate(abs($box[2]-$box[0]),abs($box[5]-$dip)) ;if(!$image || !$box){  fatal_error('Error: The server could not create this heading image.') ;} // allocate colors and draw text$background_color = @ImageColorAllocate($image,$background_rgb['red'],  $background_rgb['green'],$background_rgb['blue']) ;$font_color = ImageColorAllocate($image,$font_rgb['red'],  $font_rgb['green'],$font_rgb['blue']) ;  ImageTTFText($image,$font_size,0,-$box[0],abs($box[5]-$box[3])-$box[1],  $font_color,$font_file,$text) ; // set transparencyif($transparent_background)  ImageColorTransparent($image,$background_color) ; header('Content-type: ' . $mime_type) ;ImagePNG($image) ; // save copy of image for cacheif($cache_images){  @ImagePNG($image,$cache_filename) ;} ImageDestroy($image) ;exit ;  /*  try to determine the "dip" (pixels dropped below baseline) of this  font for this size.*/function get_dip($font,$size){  $test_chars = 'abcdefghijklmnopqrstuvwxyz' .         'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .         '1234567890' .         '!@#$%^&*()/'"http:///;.,`~<>[]{}-+_-=' ;  $box = @ImageTTFBBox($size,0,$font,$test_chars) ;  return $box[3] ;}  /*  attempt to create an image containing the error message given.   if this works, the image is sent to the browser. if not, an error  is logged, and passed back to the browser as a 500 code instead.*/function fatal_error($message){  // send an image  if(function_exists('ImageCreate'))  {    $width = ImageFontWidth(5) * strlen($message) + 10 ;    $height = ImageFontHeight(5) + 10 ;    if($image = ImageCreate($width,$height))    {      $background = ImageColorAllocate($image,255,255,255) ;      $text_color = ImageColorAllocate($image,0,0,0) ;      ImageString($image,5,5,5,$message,$text_color) ;        header('Content-type: image/png') ;      ImagePNG($image) ;      ImageDestroy($image) ;      exit ;    }  }   // send 500 code  header("HTTP/1.0 500 Internal Server Error") ;  print($message) ;  exit ;}  /*   decode an HTML hex-code into an array of R,G, and B values.  accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff */  function hex_to_rgb($hex){  // remove '#'  if(substr($hex,0,1) == '#')    $hex = substr($hex,1) ;   // expand short form ('fff') color  if(strlen($hex) == 3)  {    $hex = substr($hex,0,1) . substr($hex,0,1) .        substr($hex,1,1) . substr($hex,1,1) .        substr($hex,2,1) . substr($hex,2,1) ;  }   if(strlen($hex) != 6)    fatal_error('Error: Invalid color "'.$hex.'"') ;   // convert  $rgb['red'] = hexdec(substr($hex,0,2)) ;  $rgb['green'] = hexdec(substr($hex,2,2)) ;  $rgb['blue'] = hexdec(substr($hex,4,2)) ;   return $rgb ;}  /*  convert embedded, javascript unicode characters into embedded HTML  entities. (e.g. '%u2018' => '‘'). returns the converted string.*/function javascript_to_html($text){  $matches = null ;  preg_match_all('/%u([0-9A-F]{4})/i',$text,$matches) ;  if(!empty($matches)) for($i=0;$i<sizeof($matches[0]);$i++)    $text = str_replace($matches[0][$i],              '&#'.hexdec($matches[1][$i]).';',$text) ;   return $text ;} ?>

3)需要的字體

這里將需要的自己放在與js和php文件同在的一個目錄下(也可以修改,但是對應文件也要修改)

4)PHP的GD2庫

2,實現的html代碼

<?php//load the popup utils library//require_once 'include/popup_utils.inc.php';?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN""http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html>  <head>    <title>      Professional Search Engine Optimization with PHP: Table of Contents    </title>    <script type="text/javascript" language="javascript" src="dynatext/replacement.js"></script>  </head>  <body onload="window.resizeTo(800,600);" onresize='setTimeout("window.resizeTo(800,600);", 100)'>    <h1>      Professional Search Engine Optimization with PHP: Table of Contents    </h1>    <?php      //display popup navigation only when visitor comes from a SERP      // display_navigation();      //display_popup_navigation();    ?>    <ol>      <li>You: Programmer and Search Engine Marketer</li>      <li>A Primer in Basic SEO</li>      <li>Provocative SE-Friendly URLs</li>      <li>Content Relocation and HTTP Status Codes</li>      <li>Duplicate Content</li>      <li>SE-Friendly HTML and JavaScript</li>      <li>Web Syndication and Social Bookmarking</li>      <li>Black Hat SEO</li>      <li>Sitemaps</li>      <li>Link Bait</li>      <li>IP Cloaking, Geo-Targeting, and IP Delivery</li>      <li>Foreign Language SEO</li>      <li>Coping with Technical Issues</li>      <li>Site Clinic: So You Have a Web Site?</li>      <li>WordPress: Creating a SE-Friendly Weblog?</li>      <li>Introduction to Regular Expression</li>    </ol>  </body></html>

3,使用效果前后對比
使用前

2016418174755219.png (1160×394)

使用后

2016418174816337.png (961×401)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久中文字幕久久av| 久久久免费观看视频| 日韩极品精品视频免费观看| 亚洲欧美日韩综合| 欧美日在线观看| 国产精品久久久久久五月尺| 精品福利一区二区| 国产成人精品在线播放| 亚洲一区www| 日韩亚洲成人av在线| 国产成人一区三区| 日本国产一区二区三区| 亚洲精品美女免费| 91精品国产91久久久久| 精品福利视频导航| 日韩欧美中文字幕在线播放| 欧美性猛交xxxx免费看| 91精品国产乱码久久久久久久久| 日韩国产中文字幕| 中文字幕最新精品| 成人久久精品视频| 国产一区二区在线免费| 欧美电影在线观看高清| 欧美日韩另类在线| 91av视频导航| 欧美日韩成人黄色| 欧美高清激情视频| 97在线视频国产| 国产精品美女网站| 992tv在线成人免费观看| 国产精品自产拍在线观| 欧美亚洲成人免费| 色悠久久久久综合先锋影音下载| 欧美激情精品久久久久久蜜臀| 九九久久国产精品| 亚洲第一网中文字幕| 亚洲精品资源美女情侣酒店| 国产成人精品一区二区三区| 国产精品久久久一区| 中文字幕不卡在线视频极品| 久热精品视频在线观看| 成人亚洲综合色就1024| 欧美性猛xxx| 欧美专区第一页| 91网站免费观看| 日韩精品在线免费观看视频| 亚洲欧美制服第一页| 国产精品精品久久久| 91超碰中文字幕久久精品| 国产欧美精品一区二区三区介绍| 国产欧美在线看| 国产精品国产三级国产aⅴ浪潮| 国产精品第一页在线| 神马久久桃色视频| 91精品久久久久久久久久入口| 色777狠狠综合秋免鲁丝| 欧美插天视频在线播放| 亚洲高清色综合| 少妇高潮久久77777| 国产一区私人高清影院| 亚洲毛片在线免费观看| 亚洲视频在线观看网站| 国产精品视频不卡| 色婷婷久久一区二区| 国产精品精品久久久久久| 久久国产色av| 亚洲美女视频网| 久久激情视频久久| 欧美一级黄色网| 全色精品综合影院| 亚洲天堂免费视频| 日韩成人久久久| 欧美视频裸体精品| 精品免费在线观看| 日韩中文字幕免费看| 亚洲一区美女视频在线观看免费| 欧美中文字幕第一页| 国产精品旅馆在线| 欧美夫妻性生活视频| 曰本色欧美视频在线| 亚洲网站视频福利| 91探花福利精品国产自产在线| 亚洲天堂免费在线| 欧美大片在线影院| 午夜精品久久久久久99热| 国产精品吴梦梦| 亚洲欧美制服第一页| 日韩中文在线观看| 色婷婷亚洲mv天堂mv在影片| 91情侣偷在线精品国产| 亚洲xxxx在线| 亚洲国产成人精品久久| 奇米一区二区三区四区久久| 亚洲a一级视频| 亚洲精品www| 成人淫片在线看| 一区二区中文字幕| 亚洲综合在线播放| 亚洲高清福利视频| 亚洲欧洲xxxx| 国产美女精品视频免费观看| 中文字幕亚洲国产| 国产精品嫩草视频| 久久久国产精品亚洲一区| 日本国产精品视频| 亚洲欧美一区二区三区情侣bbw| 亚洲激情在线观看视频免费| 成人中心免费视频| 国产一区视频在线| 日韩精品在线看| 97在线视频国产| 亚洲成人性视频| 欧美成人一区在线| 欧美床上激情在线观看| 欧美成人精品一区二区| 亚洲最新中文字幕| 欧美裸体xxxx极品少妇软件| 九九热这里只有精品免费看| 欧美在线观看一区二区三区| 亚洲欧洲av一区二区| 成人两性免费视频| 久久中文字幕一区| 国产精品99久久久久久人| 亚洲va欧美va在线观看| 成人写真视频福利网| 久久国产精品久久久久| 欧美中文字幕在线| 亚洲精选在线观看| 欧美精品久久久久久久久久| 成人午夜一级二级三级| 欧美综合激情网| 久久久久久亚洲| 91亚洲精品久久久| 自拍偷拍亚洲精品| 欧美一级电影久久| 91亚洲精华国产精华| 欧美日韩国产黄| 日韩免费电影在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美猛男性生活免费| 91精品国产高清自在线| 狠狠久久五月精品中文字幕| 亚洲а∨天堂久久精品9966| 亚洲女人被黑人巨大进入al| 亚洲激情第一页| 91最新在线免费观看| 国产精品久久久久久久久久99| 这里只有视频精品| 久久免费精品日本久久中文字幕| 欧美精品激情视频| 欧美香蕉大胸在线视频观看| 亚洲国产99精品国自产| 伊人av综合网| 欧美性xxxxxxxxx| 国产精品视频久久久久| 夜夜狂射影院欧美极品| 中文字幕日韩在线播放| 美女精品久久久| 日韩欧美国产骚| 国产一区二区三区精品久久久| 中文字幕亚洲精品| 丝袜美腿亚洲一区二区| 亚洲欧美另类在线观看| 亚洲的天堂在线中文字幕|