Skip to content

Commit

Permalink
write_html: do not style header row if no <th> is present - fix #740
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas-C committed Apr 12, 2023
1 parent 393580e commit 6e183b8
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 4 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ in order to get warned about deprecated features used in your code.
This can also be enabled programmatically with `warnings.simplefilter('default', DeprecationWarning)`.

## [2.7.4] - Not released yet

### Added
- documentation on how to embed `graphs` and `charts` generated using `Pygal` lib: [documentation section](https://pyfpdf.github.io/fpdf2/Maths.html#using-pygal) - thanks to @ssavi-ict
### Changed
- [`FPDF.write_html()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.write_html) does not render the top row as a header, in bold with a line below, when no `<th>` are used, in order to be more backward-compatible with earlier versions of `fpdf2` - _cf._ [#740](https://github.com/PyFPDF/fpdf2/issues/740)

## [2.7.3] - 2023-04-03
### Fixed
Expand All @@ -29,7 +30,6 @@ This can also be enabled programmatically with `warnings.simplefilter('default',
### Fixed
- custom fonts can be used with `FPDF.table()` without triggering a `TypeError: cannot pickle 'dict_keys' object` - thanks @aeris07 for the bug report
- the SVG parser now accepts `<rect>` with `width` / `height` defined as percents

### Added
- documentation on how to generate Code128 barcodes using the `python-barcode` lib: [documentation section](https://pyfpdf.github.io/fpdf2/Barcodes.html#Code128)

Expand Down
13 changes: 12 additions & 1 deletion fpdf/html.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
from html.parser import HTMLParser

from .enums import TextEmphasis, XPos, YPos
from .errors import FPDFException
from .fonts import FontFace
from .table import Table
from .table import Table, TableBordersLayout

import re

Expand Down Expand Up @@ -447,13 +448,23 @@ def handle_starttag(self, tag, attrs):
)
self.pdf.ln()
if tag == "tr":
if not self.table:
raise FPDFException("Invalid HTML: <tr> used outside any <table>")
self.tr = {k.lower(): v for k, v in attrs.items()}
self.table_row = self.table.row()
if tag in ("td", "th"):
if not self.table_row:
raise FPDFException(f"Invalid HTML: <{tag}> used outside any <tr>")
self.td_th = {k.lower(): v for k, v in attrs.items()}
if tag == "th":
self.td_th["align"] = "CENTER"
self.td_th["b"] = True
elif len(self.table.rows) == 1 and not self.table_row.cells:
# => we are in the 1st <tr>, and the 1st cell is a <td>
# => we do not treat the first row as a header
# pylint: disable=protected-access
self.table._borders_layout = TableBordersLayout.NONE
self.table._first_row_as_headings = False
if "height" in attrs:
LOGGER.warning(
'Ignoring unsupported height="%s" specified on a <%s>',
Expand Down
6 changes: 5 additions & 1 deletion fpdf/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,11 @@ def get_cell_border(self, i, j):
def _render_table_row(self, i, fill=False, **kwargs):
row = self.rows[i]
lines_heights_per_cell = self._get_lines_heights_per_cell(i)
row_height = max(sum(lines_heights) for lines_heights in lines_heights_per_cell)
row_height = (
max(sum(lines_heights) for lines_heights in lines_heights_per_cell)
if lines_heights_per_cell
else 0
)
j = 0
while j < len(row.cells):
cell_line_height = row_height / len(lines_heights_per_cell[j])
Expand Down
Binary file added test/html/html_table_with_img.pdf
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added test/html/html_table_with_only_tds.pdf
Binary file not shown.

0 comments on commit 6e183b8

Please sign in to comment.