Как распечатать компонент ExtJS? - PullRequest
6 голосов
/ 09 мая 2011

Как открыть диалоговое окно «Печать», в котором компонент будет распечатан, когда он будет в порядке?

Ответы [ 6 ]

8 голосов
/ 10 августа 2011
                    var targetElement = Ext.getCmp('PrintablePanelId');
                    var myWindow = window.open('', '', 'width=200,height=100');
                    myWindow.document.write('<html><head>');
                    myWindow.document.write('<title>' + 'Title' + '</title>');
                    myWindow.document.write('<link rel="Stylesheet" type="text/css" href="http://dev.sencha.com/deploy/ext-4.0.1/resources/css/ext-all.css" />');
                    myWindow.document.write('<script type="text/javascript" src="http://dev.sencha.com/deploy/ext-4.0.1/bootstrap.js"></script>');
                    myWindow.document.write('</head><body>');
                    myWindow.document.write(targetElement.body.dom.innerHTML);
                    myWindow.document.write('</body></html>');
                    myWindow.print();

записать ваш печатаемый компонент extjs в документ.

2 голосов
/ 29 мая 2017

Вы также можете добавить компонент для печати в Ext.window.Window с модальным свойством, установленным в true, и просто открыть стандартный диалог печати, который будет печатать только нужный компонент.

var view = this.getView();
var extWindow = Ext.create('Ext.window.Window', { modal: true });
extWindow.add(component); // move component from the original panel to the popup window
extWindow.show();

window.print(); // prints only the content of a modal window

// push events to the event queue to be fired on the print dialog close
setTimeout(function() {
    view.add(component); // add component back to the original panel
    extWindow.close();
}, 0);
2 голосов
/ 30 августа 2012
2 голосов
/ 10 июля 2012

Мне нравится ответ Гопала Саини!Я выбрал его подход и написал функцию для одного из моих приложений.Вот кодПроверено на FF и Safari.Не пробовал в IE, но он должен работать.

print: function(el){

    var win = window.open('', '', 'width='+el.getWidth()+',height='+el.getHeight());
    if (win==null){
        alert("Pop-up is blocked!");
        return;
    }


    Ext.Ajax.request({

        url: window.location.href,
        method: "GET",
        scope: this,
        success: function(response){

            var html = response.responseText;
            var xmlDoc;
            if (window.DOMParser){
                xmlDoc = new DOMParser().parseFromString(html,"text/xml");
            }
            else{
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                xmlDoc.async = false;
                xmlDoc.loadXML(html);
            }


            win.document.write('<html><head>');
            win.document.write('<title>' + document.title + '</title>');


            var xml2string = function(node) {
               if (typeof(XMLSerializer) !== 'undefined') {
                  var serializer = new XMLSerializer();
                  return serializer.serializeToString(node);
               } else if (node.xml) { 
                  return node.xml;
               }
            }


            var links = xmlDoc.getElementsByTagName("link");
            for (var i=0; i<links.length; i++){
                win.document.write(xml2string(links[i]));
            }

            win.document.write('</head><body>');
            win.document.write(el.dom.innerHTML);
            win.document.write('</body></html>');
            win.print();
        },
        failure: function(response){
            win.close();
        }
    });
}
1 голос
/ 09 мая 2011

Печать в ExtJS не очень проста.Лучший ресурс, который я нашел по созданию компонентов для печати, можно найти в блоге архитектора Сенчи .В публикации описывается, как настроить пользовательские средства печати для компонентов, а также другие подробности о печати.Тем не менее, эта информация для ExtJS 3.x;Возможно, что ExtJS 4 упростила печать.

0 голосов
/ 11 июля 2012

Другой вариант, который следует рассмотреть, - это визуализация компонента в изображение или PDF.Хотя опция всплывающего окна / печати хороша, некоторые браузеры печатают неправильно.Они склонны игнорировать фоновые изображения, определенные свойства CSS и т. Д. Чтобы заставить компонент печатать точно так, как он выглядит во всплывающем окне, я написал код на стороне сервера, чтобы преобразовать HTML в изображение.

Вот как выглядит код клиента:

print: function(el){

    var waitMask = new Ext.LoadMask(Ext.getBody(), {msg:"Please wait..."});
    waitMask.show();


  //Parse current url to set up the host and path variables. These will be
  //used to construct absolute urls to any stylesheets.
    var currURL = window.location.href.toString();
    var arr = currURL.split("/");
    var len = 0;
    for (var i=0; i<arr.length; i++){
        if (i<3) len+=(arr[i].length+1);
    }
    var host = currURL.substring(0, len);
    if (host.substring(host.length-1)=="/") host = host.substring(0, host.length-1);

    var path = window.location.pathname;
    if (path.lastIndexOf("/")!=path.length-1){
        var filename = path.substring(path.lastIndexOf("/")+1);
        if (filename.indexOf(".")!=-1){
            path = path.substring(0, path.lastIndexOf("/")+1);
        }
        else{
            path += "/";
        }
    }


  //Start constructing an html document that we will send to the server
    var html = ('<html><head>');
    html += ('<title>' + document.title + '</title>');


  //Insert stylesheets found in the current page. Update href attributes
  //to absolute URLs as needed.
    var links = document.getElementsByTagName("link");
    for (var i=0; i<links.length; i++){
        var attr = links[i].attributes;
        if (attr.getNamedItem("rel")!=null){

            var rel = attr.getNamedItem("rel").value;
            var type = attr.getNamedItem("type").value;
            var href = attr.getNamedItem("href").value;

            if (href.toLowerCase().indexOf("http")!=0){
                if (href.toString().substring(0, 1)=="/"){
                    href = host + href;
                }
                else{
                    href = host + path + href;
                }
            }

            html += ('<link type="' + type + '" rel="' + rel+ '" href="' + href + '"/>');
        }
    }

    html += ('</head><body id="print">');
    html += (el.dom.innerHTML);
    html += ('</body></html>');


  //Execute AJAX request to convert the html into an image or pdf -
  //something that will preserve styles, background images, etc.
  //This, of course, requires some server-side code. In our case,
  //our server is generating a png that we return to the client.
    Ext.Ajax.request({

        url: "/WebServices/Print?action=submit",
        method: "POST",
        rawData: html,
        scope: this,
        success: function(response){
            var url = "/WebServices/Print?action=pickup&id="+response.responseText;
            window.location.href = url;
            waitMask.hide();
        },
        failure: function(response){
            win.close();
            waitMask.hide();
            var msg = (response.responseText.length>0 ? response.responseText : response.statusText);
            alert(msg);
        }
    });
}

Опять же, для преобразования html в изображение требуется некоторая магия на стороне сервера.В моем случае я реализовал сервис «Печать».Клиенты отправляют запросы на работу с помощью действия «submit» и извлекают выходные продукты с помощью действия «pickup».

Для преобразования html в изображения я использовал бесплатное приложение командной строки под названием Захват веб-экрана .Он работает только на Windows, и я не знаю, насколько он масштабируемый, поэтому используйте его на свой страх и риск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...