mxgraph示例解析(-) pagebreaks分页符

pagebreaks分页符效果图

官方示例

mxEvent.disableContextMenu(container);

// Creates the graph inside the given container
var graph = new mxGraph(container);
graph.view.setScale(0.15);
graph.pageBreaksVisible = true;
graph.pageBreakDashed = true;
graph.preferPageSize = true;
graph.centerZoom = false;
graph.setPanning(true);

// Account for the header and footer size in the page format
var headerSize = 100;
var footerSize = 100;

// Removes header and footer from page height
graph.pageFormat.height -= headerSize + footerSize;

// Takes zoom into account for moving cells
graph.graphHandler.scaleGrid = true;

// Enables rubberband selection
new mxRubberband(graph);

// Gets the default parent for inserting new cells. This
// is normally the first child of the root (ie. layer 0).
var parent = graph.getDefaultParent();
                
// Adds cells to the model in a single step
graph.getModel().beginUpdate();
try
{
    var v1 = graph.insertVertex(parent, null, 'Hello,', 10, 10, 280, 330);
    var v2 = graph.insertVertex(parent, null, 'World!',
        graph.pageFormat.width * graph.pageScale - 280 - 10,
        graph.pageFormat.height * graph.pageScale - 330 - 10,
        280, 330);
    var e1 = graph.insertEdge(parent, null, '', v1, v2);
}
finally
{
    // Updates the display
    graph.getModel().endUpdate();
}

document.body.appendChild(mxUtils.button('Toggle Page Breaks',
    function(evt)
    {
        graph.pageBreaksVisible = !graph.pageBreaksVisible;
        graph.sizeDidChange();
    }
));

document.body.appendChild(mxUtils.button('Zoom In',
    function(evt)
    {
        graph.zoomIn();
    }
));

document.body.appendChild(mxUtils.button('Zoom Out',
    function(evt)
    {
        graph.zoomOut();
    }
));

document.body.appendChild(mxUtils.button('Print',
    function(evt)
    {
        // Matches actual printer paper size and avoids blank pages
        var scale = 0.5;

        // Applies scale to page
        var pf = mxRectangle.fromRectangle(graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT);
        pf.width = Math.round(pf.width * scale * graph.pageScale);
        pf.height = Math.round(pf.height * scale * graph.pageScale);

        // Finds top left corner of top left page
        var bounds = mxRectangle.fromRectangle(graph.getGraphBounds());
        bounds.x -= graph.view.translate.x * graph.view.scale;
        bounds.y -= graph.view.translate.y * graph.view.scale;

        var x0 = Math.floor(bounds.x / pf.width) * pf.width;
        var y0 = Math.floor(bounds.y / pf.height) * pf.height;
    
        var preview = new mxPrintPreview(graph, scale, pf, 0, -x0, -y0);
        preview.marginTop = headerSize * scale * graph.pageScale;
        preview.marginBottom = footerSize * scale * graph.pageScale;
        preview.autoOrigin = false;
        
        var oldRenderPage = preview.renderPage;
        preview.renderPage = function(w, h, x, y, content, pageNumber)
        {
            var div = oldRenderPage.apply(this, arguments);

            var header = document.createElement('div');
            header.style.position = 'absolute';
            header.style.boxSizing = 'border-box';
            header.style.fontFamily = 'Arial,Helvetica';
            header.style.height = (this.marginTop - 10) + 'px';
            header.style.textAlign = 'center';
            header.style.verticalAlign = 'middle';
            header.style.marginTop = 'auto';
            header.style.fontSize = '12px';
            header.style.width = '100%';

            // Vertical centering for text in header/footer
            header.style.lineHeight = (this.marginTop - 10) + 'px';
            
            var footer = header.cloneNode(true);

            mxUtils.write(header, 'Page ' + pageNumber + ' - Header');
            header.style.borderBottom = '1px solid gray';
            header.style.top = '0px';
                                        
            mxUtils.write(footer, 'Page ' + pageNumber + ' - Footer');
            footer.style.borderTop = '1px solid gray';
            footer.style.bottom = '0px';

            div.firstChild.appendChild(footer);
            div.firstChild.appendChild(header);
            
            return div;
        };
        
        preview.open();
    }
));

document.body.appendChild(mxUtils.button('Reset View',
    function(evt)
    {
        graph.view.scaleAndTranslate(0.15, 0, 0);
    }
));

实现原理

  • 开启分页分隔符显示
graph.pageBreaksVisible = true; //分割线是否显示,默认为false
graph.pageBreakDashed = true; //分割线为虚线,默认为true
  • 设置首选页面为默认页面大小(即当前画布大小)
graph.preferPageSize = true;
  • 设置镜头可移动
graph.centerZoom = false; //从页面中间进行缩放,默认为true
graph.setPanning(true); //设置镜头可移动

简化示例

graph.pageBreaksVisible = true;
graph.preferPageSize = true;
graph.centerZoom = false;
graph.setPanning(true);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,748评论 1 92
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,509评论 0 4
  • 去年有段时间得空,就把谷歌GAE的API权威指南看了一遍,收获颇丰,特别是在自己几乎独立开发了公司的云数据中心之后...
    骑单车的勋爵阅读 20,507评论 0 41
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5