пятница, 21 августа 2009 г.

Печать фрагмента VML из javascript

При сохранении файла из Microsoft Visio в формате веб-страницы (векторный рисунок в формате VML) создаваемая страница выглядит так:
Потребовалось выделять фрагмент рисунка в правом фрейме и распечатывать его на принтере. Эта возможность изначально не реализована, распечатывается весь рисунок целиком. Я добавил такую возможность. Опишу по шагам. Все изменения проводятся в папке <Имя_файла>.files.
1. В файле widgets.htm  между строками
<script src="find.js" type="text/jscript" language="jscript"></script>
и
<script type="text/jscript" language="jscript">
вставляю строку
<script src="vml_print.js" type="text/jscript" language="jscript"></script>
2. В том же файле между строками
<td><p class="p1"><a href="javascript:ToggleNav();" title="Свернуть область переходов" class="a1">Скрыть</a></p></td>
и
<td align="right"><p class="p1"><a href="javascript:widgets.ToggleAll()" id="textExp" class="a1">Свернуть все</a></p></td>
вставляю строку
<td><p class="p1"><a href="javascript:print_fragment();" title="Печать" id="PrintVML" class="a1">Печать</a></p></td>
Теперь в заголовке левой панели между элементами "Скрыть" и "Свернуть все" добавлена ссылка "Печать", при нажатии на которую будет выполняться функция print_fragment().
3. Создаю в той же папке файл vml_print.htm, содержащий заготовку окна с фрагментом VML. Содержимое этого файла:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  <style type="text/css">
   v\:* { behavior: url(#default#VML); }
  </style>
</head>
<body>
  <h1 id="title1" align="center">Название схемы</h1>
  <center>
    <v:rect id="container" strokecolor="gray" strokeweight="1pt"
      style="position:relative; height:500px; width:800px">
   <v:imagedata id="content" croptop="0" cropbottom="0" cropleft="0" cropright="0"
     src="vml_1.emz" /> 
    </v:rect>
  </center>
</body>
</html>
Важно, чтобы кодировка этого файла была в ANSI. Если будет UNICODE, то VML не отобразится в окне.
4. И, наконец, создаю в той же папке файл vml_print.js, содержащий функцию print_fragment(), которая изменяет заголовок и размеры окна, обрезает изображение по краям и вызывает печать окна.
function print_fragment() {
 var image = parent.frmDrawing.document.all['ConvertedImage'];
 var pixelWidth = image.style.pixelWidth;
 var pixelHeight = image.style.pixelHeight;
 var winWidth = parent.frmDrawing.document.body.clientWidth;
 var winHeight = parent.frmDrawing.document.body.clientHeight;
 var winScrollLeft = parent.frmDrawing.document.body.scrollLeft;
 var winScrollTop = parent.frmDrawing.document.body.scrollTop;
 var newWidth = winWidth / pixelWidth;
 var newHeight = winHeight / pixelHeight;
 var newXOffset = winScrollLeft / pixelWidth;
 var newYOffset = winScrollTop / pixelHeight;
 var win = window.open('vml_print.htm','vml_prin','width='+winWidth+',height='+winHeight+',scrollbars=yes');
 win.document.all["title1"].innerText = parent.document.title;
 win.document.all["container"].style.height = winHeight+"px";
 win.document.all["container"].style.width = winWidth+"px";
 win.document.all["content"].setAttribute("croptop", newYOffset);
 win.document.all["content"].setAttribute("cropbottom", 1-newHeight-newYOffset);
 win.document.all["content"].setAttribute("cropleft", newXOffset);
 win.document.all["content"].setAttribute("cropright", 1-newWidth-newXOffset);
 win.print();
 win.close();
}
Всё. Задача решена. Спасибо за внимание.

Комментариев нет:

Отправить комментарий