That is the proper formatting of a table, while most browsers couldn't care less, converters like the one you mention can, if your missing <tbody> or <th> tags i suggest you try adding those first.
This is a known issue in wkhtmltopdf. The page breaking algorithm used by webkit (the WK in WKhtmltopdf) doesn't really work well for large tables. I suggest breaking the table down to smaller chunks that are more easily split to pages and using the css a lot:
Also have a look at the following wkhtmltopdf issues, they have interesting comments that discuss for example the table splitting problem. There is a JS solution that programmatically splits tables in 168 that might help you (I don't use it though).
Update 08.11.2013
There is much discussion about this in issue 168 linked above. Someone has managed to compile a version of wkhtmltopdf that supports better table breaking, but unfortunately it seems that it's not officially released and might contain other bugs. I don't know how to get it and I don't know how to compile on Windows, but anyone interested can check for example the comment here (see new update below).
Update 24.02.2014
You will be pleased to hear that in wkhtmltopdf 0.12 this feature among others has been greatly improved. However, wait for 0.12.1 and test thoroughly before starting to use any new version, it's still a little unstable although the new guys working on with antialize are doing a Great job (ashkulz rocks)! Keep updated at wkhtmltopdf.org and github. The google code site is obsolete and being slowly migrate.
The answers above did not work to me. I had to specifically disable the zoom option my pdfkit config.
PDFKit.configure do |config|
config.default_options = {
print_media_type: false,
page_size: "A4",
encoding: "UTF-8",
## Make sure the zoom option is not enabled!
## zoom: '1.3',
disable_smart_shrinking: false,
footer_right: "Page [page] of [toPage]"
}
end
It is old post, but since i was wasting lot of time trying to find proper solution, i will put it here, maybe it will be useful to someone.
So from what i read, the problem with
page-break-inside: avoid
is that it doesn't work. But actually if you set it on element that has display:block it works as expected (as noted somewhere in SO).
so for simple structure of table css with
I had bit more complicated case with rowspans, so the solution from above was breaking it to peaces, which wasn't desired effect. I solved it using divs for each rowspaned set of lines. My jquery js doing all the job:
$(window).load(function () {
var sizes = {};
$('#the_table tr:first th').each(function (a, td) {
var w = $(td).width();
if (sizes.hasOwnProperty('' + a)) {
if (sizes['' + a] < w)
sizes['' + a] = w;
}
else {
sizes['' + a] = w;
}
});
var tableClone = $('#the_table').clone();
$('#the_table').replaceWith('<div class="container"></div>');
var curentDivTable;
var cDiv = $('.container');
tableClone.find('tr').each(function (i, ln) {
var line = $(ln);
if (line.hasClass('main_row')) {
var div = $('<div class="new-section"><table><tbody>')
currentDivTable = div.find('tbody');
cDiv.append(div);
}
currentDivTable.append(line);
});
//optional - maybe in % its better than px
var sum = 0;
$.each(sizes, function (a, b) {
sum += b;
});
var widths = {};
$.each(sizes, function (a, b) {
var p = Math.ceil(b * 100 / sum);
widths['' + a] = p + '%';
});
//setup
$('.container table').each(function (a, tbl) {
$(tbl).find('tr:first td, tr:first th').each(function (b, td) {
$(td).width(widths['' + b]);
});
$(tbl).addClass('fixed');
});
});
Since 0.12 this issue has been solved but, sometimes, when a table is too long to fit in the page, wkhtmltopdf breaks it in two parts and repeats the column headers on the new page and these column headers appear superposed to the first row.
For anyone still having problems with this, one thing to remember is that the table has to be a direct child of body, otherwise the css won't work (at least that's what happened with me).
I tried all manner of manipulations to my tables, but nothing I tried could stop the page breaks being put into the middle of a row.
In desperation I tried different versions, and found the following:
Wkhtmltopdf 0.12.2.1: Bad
Wkhtmltopdf 0.12.3: Bad
Wkhtmltopdf 0.12.1: Good
My solution was to downgrade to version 0.12.1, which solved my issues. Granted, they might have been partly due to not being super OCD about my html, but as the HTML is generated inside TinyMCE (by users) I don't really have much choice.
Also, nested tables don't work in any version for me.
With these modifications I can now successfully use Mako templates to generate the HTML and then feed that to Wkhtmltopdf and get a beautifully paginated PDF.
I've digged into this problems for days, and finally found the perfect solution. You can reference this project phpwkhtmltopdf. Look into the directory article and you will find 3 solutions for 3 problems.
In short, the ultimate solution is add the css style
I didn't need to create any div inside the td or th tags.
Important things that I noticed while trying to solve the problem:
The tbody must be included in the table
The div must have display: block
When a table doesn't fit in a page, it will automatically move the whole table to the next page (I haven't tried this one with huge tables)
If you remove only the ".wrapping-div table" selector from the CSS, it will allow the table to be split in two pages, but will render it correctly, not breaking one cell in two pages (it's like the default behavior on Word)
I have struggled a lot with the issue, using latest h4cc/wkhtmltopdf-amd64 version 0.12.4 and finally made it working by downgrading the version of the package to 0.12.3!
#main_div {
position: relative;
width: 672px; /* find your width in px based on the page margins */
}
tr td {
page-break-before: auto;
page-break-inside: avoid !important;
}
But the most important is to give to your container which contains the table (or some parent div) a fixed width in pixels. Should work for most (WebKit) pdf generators and permit them to calculate correctly the heights.
I can confirm that works for me with wkhtmltopdf 0.12.6 (with patched qt) in kubuntu 20.04
I do not understand why the most correct version is not yet here ;)
If you have a fixed layout, there is an actual pretty easy way to do this.
You make the layout fixed (table-layout: fixed at the table), set the sizes with the first row or a colgroup: