2014-01-13 2 views
3

При рендеринге в pdf мне нужно, чтобы страница html составляла 100% от ширины печати. В противном случае контент отключается. Есть простой способ сделать это?По размеру содержимого в pdf

Я придумал обход, который получает ширину html после рендеринга, а затем устанавливает коэффициент масштабирования для принудительной правильной ширины.

var page = require('webpage').create(), 
    system = require('system'), 
    dpi = 89.9, // strange, but that's what I get on Mac 
    pageWidth = 210; // in mm 

var getWidth = function() { 
    return page.evaluate(function() { 
     // get width manually 
     // ... 
     return width; 
    }); 
}; 

page.paperSize = {format: 'A4', orientation: 'portrait'}; 

page.open(system.args[1], function (status) { 
    window.setTimeout(function() { 
     page.zoomFactor = (pageWidth/25.4) * dpi/getWidth(); 
     page.render(system.args[2]); 
     phantom.exit(); 
    }, 200); 
}); 

Ищет прямо вперед решение, потому что получение ширины требует от меня, чтобы сделать некоторые трюки из-за рамки я использую.

+0

Я использовал то же самое решение, не смог найти альтернативы. Я использую окна и должен был жестко задавать dpi до 120. Я пробовал различные методы для получения DPI, однако возвращаемый ими DPI не работает, например. GetDeviceCaps (IntPtr hDC, int nIndex) возвращен 96. –

+0

У меня было то же самое. Я фактически использую dpi на 89.9 для Linux, чтобы заполнить страницу без разницы. –

ответ

6

Успели решить эту проблему, добавив следующее правило CSS, который будет отдалять страницу и сделать его пригодным:

html { 
    zoom: 0.60; 
    } 
0

Редактировать rasterize.js следующим образом.

Сделайте резервную копию rasterize.js

Удалить этот блок (прибл. Линия 18-31)

if (system.args.length > 4) { 
    page.zoomFactor = system.args[4]; 
} 
page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to load the address!'); 
     phantom.exit(); 
    } else { 
     window.setTimeout(function() { 
      page.render(output); 
      phantom.exit(); 
     }, 200); 
    } 
}); 

Заменить его с помощью этого блока кода

if (system.args.length > 4) { 
     page.zoomFactor = parseFloat(system.args[4].split("=")[1]); 
} 
page.open(address, function (status) { 
     if (status !== 'success') { 
      console.log('Unable to load the address!'); 
      phantom.exit(1); 
     } else { 
      window.setTimeout(function() { 
console.log("zoomFactor: " + page.zoomFactor); 
     page.evaluate(function(zoom) { 
     return document.querySelector('body').style.zoom = zoom; 
    }, page.zoomFactor); // <-- your zoom here 
       page.render(output); 
       phantom.exit(); 
      }, 200); 
     } 
    }); 

Затем вы можете экспортировать html to pdf на лету вот так:

~/bin/phantomjs ~/bin/phantomjs/examples/rasterize.js \ 
'http://example.com/index.html' \ 
mysite.pdf paperformat=A4 zoom=0.4 
Смежные вопросы