From 0579097951177ba61ac196c1f0765abea710cdb9 Mon Sep 17 00:00:00 2001 From: Lucas Cimon <925560+Lucas-C@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:12:56 +0200 Subject: [PATCH] Implement FPDF.table() - close #701 & #723 (#703) --- .../continuous-integration-workflow.yml | 12 +- CHANGELOG.md | 10 +- README.md | 2 +- docs/Images.md | 2 +- docs/Maths.md | 27 +- docs/Tables.md | 295 +++++++++---- docs/Tutorial-de.md | 18 +- docs/Tutorial-es.md | 30 +- docs/Tutorial-fr.md | 17 +- docs/Tutorial-gr.md | 13 +- docs/Tutorial-he.md | 16 +- docs/Tutorial-it.md | 13 +- docs/Tutorial-pt.md | 16 +- docs/Tutorial-ru.md | 14 +- docs/Tutorial-zh.md | 23 +- ...77\340\244\202\340\244\246\340\245\200.md" | 20 +- docs/Tutorial.md | 36 +- docs/index.md | 2 +- docs/table-pandas.png | Bin 12279 -> 23645 bytes docs/table-simple.jpg | Bin 0 -> 24560 bytes docs/table-styled.jpg | Bin 0 -> 24132 bytes docs/table-with-cells-filled.jpg | Bin 0 -> 23937 bytes docs/table-with-cells-filled2.jpg | Bin 0 -> 19463 bytes docs/table-with-fixed-column-widths.jpg | Bin 0 -> 18152 bytes docs/table_align.jpg | Bin 0 -> 39270 bytes docs/table_with_images.jpg | Bin 0 -> 31466 bytes docs/table_with_images_and_img_fill_width.jpg | Bin 0 -> 46561 bytes docs/table_with_internal_layout.jpg | Bin 0 -> 18536 bytes docs/table_with_minimal_layout.jpg | Bin 0 -> 14822 bytes docs/table_with_single_top_line_layout.jpg | Bin 0 -> 13287 bytes fpdf/enums.py | 84 +++- fpdf/fonts.py | 59 ++- fpdf/fpdf.py | 195 +++++---- fpdf/html.py | 386 +++++------------- fpdf/image_parsing.py | 2 +- fpdf/output.py | 1 + fpdf/table.py | 346 ++++++++++++++++ fpdf/util.py | 10 +- setup.cfg | 2 + test/conftest.py | 33 +- test/embed_file_all_optionals.pdf | Bin 1306 -> 1451 bytes test/embed_file_self.pdf | Bin 1148 -> 1486 bytes test/file_attachment_annotation.pdf | Bin 1321 -> 1658 bytes test/fonts/test_set_font.py | 6 +- test/html/bgcolor_in_table.pdf | Bin 1623 -> 0 bytes ...customize_ul.pdf => html_customize_ul.pdf} | Bin test/html/html_features.pdf | Bin 5929 -> 5938 bytes ...pping.pdf => html_img_not_overlapping.pdf} | Bin test/html/html_table_line_separators.pdf | Bin 1231 -> 1252 bytes .../html_table_line_separators_issue_137.pdf | Bin 1223 -> 1250 bytes test/html/html_table_with_border.pdf | Bin 1309 -> 1346 bytes .../html_table_with_empty_cell_contents.pdf | Bin 1280 -> 1301 bytes ...dling.pdf => html_whitespace_handling.pdf} | Bin test/html/test_html.py | 239 +---------- test/html/test_img_inside_html_table.pdf | Bin 14797 -> 0 bytes .../test_img_inside_html_table_centered.pdf | Bin 14796 -> 0 bytes ..._inside_html_table_centered_with_align.pdf | Bin 14801 -> 0 bytes ...nside_html_table_centered_with_caption.pdf | Bin 22666 -> 0 bytes ...html_table_without_explicit_dimensions.pdf | Bin 14788 -> 0 bytes test/image/test_load_image.py | 2 +- test/image/test_oversized.py | 2 +- test/requirements.txt | 5 + test/table/table_align.pdf | Bin 0 -> 2124 bytes test/table/table_simple.pdf | Bin 0 -> 1646 bytes test/table/table_with_cell_fill.pdf | Bin 0 -> 2250 bytes test/table/table_with_fixed_col_width.pdf | Bin 0 -> 1647 bytes test/table/table_with_fixed_row_height.pdf | Bin 0 -> 1630 bytes test/table/table_with_fixed_width.pdf | Bin 0 -> 1642 bytes test/table/table_with_headings_styled.pdf | Bin 0 -> 1708 bytes test/table/table_with_images.pdf | Bin 0 -> 79296 bytes .../table_with_images_and_img_fill_width.pdf | Bin 0 -> 79299 bytes test/table/table_with_internal_layout.pdf | Bin 0 -> 1572 bytes test/table/table_with_minimal_layout.pdf | Bin 0 -> 1498 bytes test/table/table_with_multiline_cells.pdf | Bin 0 -> 3050 bytes ...h_multiline_cells_and_fixed_row_height.pdf | Bin 0 -> 2974 bytes .../table_with_multiline_cells_and_images.pdf | Bin 0 -> 80470 bytes ...multiline_cells_and_split_over_3_pages.pdf | Bin 0 -> 5254 bytes ...h_multiline_cells_and_without_headings.pdf | Bin 0 -> 4919 bytes .../table_with_single_top_line_layout.pdf} | Bin 1221 -> 1360 bytes test/table/table_with_varying_col_widths.pdf | Bin 0 -> 1643 bytes test/table/table_without_headings.pdf | Bin 0 -> 1507 bytes test/table/test_table.py | 291 +++++++++++++ test/table/test_table_extraction.py | 124 ++++++ test/table/test_table_with_image.py | 103 +++++ test/test_perfs.py | 2 +- test/text/test_cell.py | 23 +- test/text/test_multi_cell.py | 4 +- test/text/test_multi_cell_markdown.py | 9 +- tutorial/tuto1.htm | 91 ----- tutorial/tuto2.htm | 50 --- tutorial/tuto3.htm | 43 -- tutorial/tuto4.htm | 34 -- tutorial/tuto5.htm | 43 -- tutorial/tuto5.pdf | Bin 8069 -> 7482 bytes tutorial/tuto5.py | 95 ++--- tutorial/tuto6.htm | 68 --- tutorial/tuto7.htm | 315 -------------- 97 files changed, 1620 insertions(+), 1613 deletions(-) create mode 100644 docs/table-simple.jpg create mode 100644 docs/table-styled.jpg create mode 100644 docs/table-with-cells-filled.jpg create mode 100644 docs/table-with-cells-filled2.jpg create mode 100644 docs/table-with-fixed-column-widths.jpg create mode 100644 docs/table_align.jpg create mode 100644 docs/table_with_images.jpg create mode 100644 docs/table_with_images_and_img_fill_width.jpg create mode 100644 docs/table_with_internal_layout.jpg create mode 100644 docs/table_with_minimal_layout.jpg create mode 100644 docs/table_with_single_top_line_layout.jpg create mode 100644 fpdf/table.py delete mode 100644 test/html/bgcolor_in_table.pdf rename test/html/{test_customize_ul.pdf => html_customize_ul.pdf} (100%) rename test/html/{test_img_not_overlapping.pdf => html_img_not_overlapping.pdf} (100%) rename test/html/{test_html_whitespace_handling.pdf => html_whitespace_handling.pdf} (100%) delete mode 100644 test/html/test_img_inside_html_table.pdf delete mode 100644 test/html/test_img_inside_html_table_centered.pdf delete mode 100644 test/html/test_img_inside_html_table_centered_with_align.pdf delete mode 100644 test/html/test_img_inside_html_table_centered_with_caption.pdf delete mode 100644 test/html/test_img_inside_html_table_without_explicit_dimensions.pdf create mode 100644 test/table/table_align.pdf create mode 100644 test/table/table_simple.pdf create mode 100644 test/table/table_with_cell_fill.pdf create mode 100644 test/table/table_with_fixed_col_width.pdf create mode 100644 test/table/table_with_fixed_row_height.pdf create mode 100644 test/table/table_with_fixed_width.pdf create mode 100644 test/table/table_with_headings_styled.pdf create mode 100644 test/table/table_with_images.pdf create mode 100644 test/table/table_with_images_and_img_fill_width.pdf create mode 100644 test/table/table_with_internal_layout.pdf create mode 100644 test/table/table_with_minimal_layout.pdf create mode 100644 test/table/table_with_multiline_cells.pdf create mode 100644 test/table/table_with_multiline_cells_and_fixed_row_height.pdf create mode 100644 test/table/table_with_multiline_cells_and_images.pdf create mode 100644 test/table/table_with_multiline_cells_and_split_over_3_pages.pdf create mode 100644 test/table/table_with_multiline_cells_and_without_headings.pdf rename test/{html/html_simple_table.pdf => table/table_with_single_top_line_layout.pdf} (63%) create mode 100644 test/table/table_with_varying_col_widths.pdf create mode 100644 test/table/table_without_headings.pdf create mode 100644 test/table/test_table.py create mode 100644 test/table/test_table_extraction.py create mode 100644 test/table/test_table_with_image.py delete mode 100644 tutorial/tuto1.htm delete mode 100644 tutorial/tuto2.htm delete mode 100644 tutorial/tuto3.htm delete mode 100644 tutorial/tuto4.htm delete mode 100644 tutorial/tuto5.htm delete mode 100644 tutorial/tuto6.htm delete mode 100644 tutorial/tuto7.htm diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index c4e6c53fb..29a8e499a 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -24,7 +24,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install system dependencies ⚙️ if: matrix.platform == 'ubuntu-latest' - run: sudo apt-get install libjpeg-dev + run: sudo apt-get install ghostscript libjpeg-dev - name: Install qpdf ⚙️ if: matrix.platform == 'ubuntu-latest' && matrix.python-version != '3.9' # This allows us to run the unit tests WITHOUT qpdf in just one parallel execution run: sudo apt-get install qpdf @@ -35,9 +35,9 @@ jobs: - name: Statically checking code 🔎 if: matrix.python-version == '3.10' && matrix.platform == 'ubuntu-latest' run: | - pylint fpdf test tutorial/tuto*.py - bandit -c .banditrc.yml -r contributors/ fpdf/ tutorial/ - semgrep scan --config auto --lang=py --error --strict --exclude-rule=python.lang.security.insecure-hash-function.insecure-hash-function fpdf + pylint fpdf test tutorial/tuto*.py + bandit -c .banditrc.yml -r contributors/ fpdf/ tutorial/ + semgrep scan --config auto --lang=py --error --strict --exclude-rule=python.lang.security.insecure-hash-function.insecure-hash-function fpdf - name: Ensure code has been autoformatted with black 🖌️ if: matrix.python-version == '3.10' && matrix.platform == 'ubuntu-latest' run: black --check . @@ -59,7 +59,7 @@ jobs: # Ensuring there is no `generate=True` left remaining in calls to assert_pdf_equal: grep -IRF generate=True test/ && exit 1 # Executing all tests: - pytest -vv --final-memory-usage + pytest -vv --trace-memory-usage - name: Uploading coverage report to codecov.io ☑ if: matrix.python-version == '3.10' && matrix.platform == 'ubuntu-latest' run: bash <(curl -s https://codecov.io/bash) @@ -75,7 +75,7 @@ jobs: sed -i "s/author:.*/author: v$(python setup.py -V 2>/dev/null)/" mkdocs.yml cp tutorial/notebook.ipynb docs/ mkdocs build - pdoc --html -o public/ fpdf + pdoc --html -o public/ fpdf --config "git_link_template='https://github.com/PyFPDF/fpdf2/blob/{commit}/{path}#L{start_line}-L{end_line}'" cd contributors/ && PYTHONUNBUFFERED=1 ./build_contributors_html_page.py PyFPDF/fpdf2 cp -t ../public/ contributors.html contributors-map-small.png - name: Deploy documentation 🚀 diff --git a/CHANGELOG.md b/CHANGELOG.md index 33f8e2c11..a0f184ae7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,12 @@ in order to get warned about deprecated features used in your code. This can also be enabled programmatically with `warnings.simplefilter('default', DeprecationWarning)`. -## [2.6.2] - Not released yet +## [2.7.0] - Not released yet ### Added -* [`FPDF.multi_cell()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.multi_cell) and [`FPDF.write()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.write) now accept a `wrapmode` argument for word or character based line wrapping ("WORD"/"CHAR"). +- new method [`FPDF.table()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.table): [documentation](https://pyfpdf.github.io/fpdf2/Tables.html) - [`FPDF.image()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.image) has a new `keep_aspect_ratio` optional boolean parameter, to fit it inside a given rectangle: [documentation](https://pyfpdf.github.io/fpdf2/Images.html#fitting-an-image-inside-a-rectangle) -- new method `FPDF.preload_image()`: [documentation](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.preload_image) +- [`FPDF.multi_cell()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.multi_cell) and [`FPDF.write()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.write) now accept a `wrapmode` argument for word or character based line wrapping ("WORD"/"CHAR"). +- new methods: [`FPDF.preload_image()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.preload_image) & [`FPDF.use_font_style()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.use_font_style) - new translation of the tutorial in [简体中文](https://pyfpdf.github.io/fpdf2/Tutorial-zh.html) - thanks to @Bubbu0129 - new method [`FPDF.set_fallback_fonts()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.set_fallback_fonts) allow alternative fonts to be provided if a character on the text is not available on the currently set font - thanks to @andersonhc - documentation on how to embed static [Plotly](https://plotly.com/python/) charts: [link to docs](https://pyfpdf.github.io/fpdf2/Maths.html) @@ -32,10 +33,13 @@ This can also be enabled programmatically with `warnings.simplefilter('default', - all `TitleStyle` constructor parameters are now effectively optional - memory usage was reduced by 10 MiB in some cases, thanks to a small optimization in using `fonttools` ### Changed +* [`FPDF.write_html()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.write_html) now uses the new [`FPDF.table()`](https://pyfpdf.github.io/fpdf2/Tables.html) method to render `` tags. As a consequence, vertical space before `
` tags has sometimes been reduced. - vector images parsing is now more robust: `fpdf2` can now embed SVG files without `viewPort` or no `height` / `width` - bitonal images are now encoded using `CCITTFaxDecode`, reducing their size in the PDF document - thanks to @eroux - when possible, JPG and group4 encoded TIFFs are now embedded directly without recompression - thanks to @eroux - ICC Profiles of included images are now extracted and turned into PDF objects; they should now be taken into account by PDF viewers - thanks to @eroux +### Removed +* [`FPDF.write_html()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.write_html) now uses the new [`FPDF.table()`](https://pyfpdf.github.io/fpdf2/Tables.html) method to render `
` tags. As a consequence, it does not support the `height` attribute defined on `` / `` tags. ## [2.6.1] - 2023-01-13 ### Added diff --git a/README.md b/README.md index 31acd5527..5248a5064 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ pip install git+https://github.com/PyFPDF/fpdf2.git@master * Embedding images, including transparency and alpha channel * Arbitrary path drawing and basic [SVG](https://pyfpdf.github.io/fpdf2/SVG.html) import * Embedding [barcodes](https://pyfpdf.github.io/fpdf2/Barcodes.html), [charts & graphs](https://pyfpdf.github.io/fpdf2/Maths.html), [emojis, symbols & dingbats](https://pyfpdf.github.io/fpdf2/EmojisSymbolsDingbats.html) - * [Cell / multi-cell / plaintext writing](https://pyfpdf.github.io/fpdf2/Text.html), with [automatic page breaks](https://pyfpdf.github.io/fpdf2/PageBreaks.html), line break and text justification + * [Tables](https://pyfpdf.github.io/fpdf2/Tables.html) and also [cell / multi-cell / plaintext writing](https://pyfpdf.github.io/fpdf2/Text.html), with [automatic page breaks](https://pyfpdf.github.io/fpdf2/PageBreaks.html), line break and text justification * Choice of measurement unit, page format & margins. Optional page header and footer * Basic [conversion from HTML to PDF](https://pyfpdf.github.io/fpdf2/HTML.html) * A [templating system](https://pyfpdf.github.io/fpdf2/Templates.html) to render PDFs in batchs diff --git a/docs/Images.md b/docs/Images.md index 925091e84..aa0d26982 100644 --- a/docs/Images.md +++ b/docs/Images.md @@ -56,7 +56,7 @@ When you want to scale an image to fill a rectangle, while keeping its aspect ra and ensuring it does **not** overflow the rectangle width nor height in the process, you can set `w` / `h` and also provide `keep_aspect_ratio=True` to the [`image()`](fpdf/fpdf.html#fpdf.fpdf.FPDF.image) method. -The following unit test illustrates that: +The following unit tests illustrate that: * [test_image_fit.py](https://github.com/PyFPDF/fpdf2/blob/master/test/image/test_image_fit.py) * resulting document: [image_fit_in_rect.pdf](https://github.com/PyFPDF/fpdf2/blob/master/test/image/image_fit_in_rect.pdf) diff --git a/docs/Maths.md b/docs/Maths.md index 831a65527..9beacb554 100644 --- a/docs/Maths.md +++ b/docs/Maths.md @@ -128,25 +128,20 @@ columns = [list(df)] # Get list of dataframe columns rows = df.values.tolist() # Get list of dataframe rows data = columns + rows # Combine columns and rows in one list -# Start pdf creating pdf = FPDF() pdf.add_page() pdf.set_font("Times", size=10) -line_height = pdf.font_size * 2.5 -col_width = pdf.epw / 4 # distribute content evenly - -for row in data: - for datum in row: - pdf.multi_cell( - col_width, - line_height, - datum, - border=1, - new_y="TOP", - max_line_height=pdf.font_size, - ) - pdf.ln(line_height) -pdf.output("table_with_cells.pdf") +with pdf.table(borders_layout="MINIMAL", + cell_fill_color=200, # grey + cell_fill_mode="ROWS", + line_height=pdf.font_size * 2.5, + text_align="CENTER", + width=160) as table: + for data_row in data: + row = table.row() + for datum in data_row: + row.cell(datum) +pdf.output("table_from_pandas.pdf") ``` Result: diff --git a/docs/Tables.md b/docs/Tables.md index b7ba46343..1e7a1c79d 100644 --- a/docs/Tables.md +++ b/docs/Tables.md @@ -1,42 +1,224 @@ -# Tables # +# Tables -Tables can be built either using **cells** -or with [`write_html`](HTML.md). +_New in [:octicons-tag-24: 2.7.0](https://github.com/PyFPDF/fpdf2/blob/master/CHANGELOG.md)_ - -## Using cells ## - -There is a method to build tables allowing for multilines content in cells: +Tables can be built using the `table()` method. +Here is a simple example: ```python from fpdf import FPDF -data = ( +TABLE_DATA = ( ("First name", "Last name", "Age", "City"), ("Jules", "Smith", "34", "San Juan"), ("Mary", "Ramos", "45", "Orlando"), ("Carlson", "Banks", "19", "Los Angeles"), ("Lucas", "Cimon", "31", "Saint-Mahturin-sur-Loire"), ) +pdf = FPDF() +pdf.add_page() +pdf.set_font("Times", size=16) +with pdf.table() as table: + for data_row in TABLE_DATA: + row = table.row() + for datum in data_row: + row.cell(datum) +pdf.output('table.pdf') +``` +Result: + +![](table-simple.jpg) + +## Features +* support cells with content wrapping over several lines +* control over column & row sizes (automatically computed by default) +* allow to style table headings (top row), or disable them +* control over borders: color, width & where they are drawn +* handle splitting a table over page breaks, with headings repeated +* control over cell background color +* control table width & position +* control over text alignment in cells, globally or per row +* allow to embed images in cells + +## Setting table & column widths +```python +... +with pdf.table(width=150, col_widths=(30, 30, 10, 30)) as table: + ... +``` +Result: + +![](table-with-fixed-column-widths.jpg) + +`align` can be passed to `table()` to set the table horizontal position relative to the page, +when it's not using the full page width. It's centered by default. + +## Setting text alignment +This can be set globally, or on a per-column basis: +```python +... +with pdf.table(text_align="CENTER") as table: + ... +pdf.ln() +with pdf.table(text_align=("CENTER", "CENTER", "RIGHT", "LEFT")) as table: + ... +``` +Result: + +![](table_align.jpg) + +## Setting row height +```python +... +with pdf.table(line_height=2.5 * pdf.font_size) as table: + ... +``` + +## Disable table headings +```python +... +with pdf.table(first_row_as_headings=False) as table:y + ... +``` + +## Style table headings +```python +... +blue = (0, 0, 255) +grey = (128, 128, 128) +headings_style = FontStyle(emphasis="ITALICS", color=blue, fill_color=grey) +with pdf.table(headings_styleheadings_style=headings_style) as table: + ... +``` +Result: + +![](table-styled.jpg) + +## Set cells background +```python +... +greyscale = 200 +with pdf.table(cell_fill_color=greyscale, cell_fill_mode="ROWS") as table: + ... +``` +Result: + +![](table-with-cells-filled.jpg) + +```python +... +lightblue = (173, 216, 230) +with pdf.table(cell_fill_color=lightblue, cell_fill_mode="COLUMNS") as table: + ... +``` +Result: + +![](table-with-cells-filled2.jpg) + +## Set borders layout +```python +... +with pdf.table(borders_layout="INTERNAL") as table: + ... +``` +Result: + +![](table_with_internal_layout.jpg) + +```python +... +with pdf.table(borders_layout="MINIMAL") as table: + ... +``` +Result: +![](table_with_minimal_layout.jpg) + +```python +... +pdf.set_draw_color(50) # very dark grey +pdf.set_line_width(.5) +with pdf.table(borders_layout="SINGLE_TOP_LINE") as table: + ... +``` +Result: + +![](table_with_single_top_line_layout.jpg) + +All the possible layout values are described there: [`TableBordersLayout`](https://pyfpdf.github.io/fpdf2/fpdf/enums.html#fpdf.enums.TableBordersLayout). + +## Insert images +```python +TABLE_DATA = ( + ("First name", "Last name", "Image", "City"), + ("Jules", "Smith", "shirt.png", "San Juan"), + ("Mary", "Ramos", "joker.png", "Orlando"), + ("Carlson", "Banks", "socialist.png", "Los Angeles"), + ("Lucas", "Cimon", "circle.bmp", "Angers"), +) pdf = FPDF() pdf.add_page() -pdf.set_font("Times", size=10) -line_height = pdf.font_size * 2.5 -col_width = pdf.epw / 4 # distribute content evenly -for row in data: - for datum in row: - pdf.multi_cell(col_width, line_height, datum, border=1, - new_x="RIGHT", new_y="TOP", max_line_height=pdf.font_size) - pdf.ln(line_height) -pdf.output('table_with_cells.pdf') +pdf.set_font("Times", size=16) +with pdf.table() as table: + for i, data_row in enumerate(TABLE_DATA): + row = table.row() + for j, datum in enumerate(data_row): + if j == 2 and i > 0: + row.cell(img=datum) + else: + row.cell(datum) +pdf.output('table_with_images.pdf') +``` +Result: + +![](table_with_images.jpg) + +By default, images height & width are constrained by the row height (based on text content) +and the column width. To render bigger images, you can set the `line_height` to increase the row height, or pass `img_fill_width=True` to `.cell()`: + +```python + row.cell(img=datum, img_fill_width=True) ``` +Result: +![](table_with_images_and_img_fill_width.jpg) -## Using write_html ## +## Syntactic sugar -An alternative method using [`FPDF.write_html`](HTML.md), -with the same `data` as above, and column widths defined as percent of the effective width: +To simplify `table()` usage, shorter, alternative usage forms are allowed. + +This sample code: +```python +with pdf.table() as table: + for data_row in TABLE_DATA: + row = table.row() + for datum in data_row: + row.cell(datum) +``` + +Can be shortened to the followng code, +by passing lists of strings as the `cells` optional argument of `.row()`: +```python +with pdf.table() as table: + for data_row in TABLE_DATA: + table.row(data_row) +``` + +And even shortened further to a single line, +by passing lists of lists of strings as the `rows` optional argument of `.table()`: +```python +with pdf.table(TABLE_DATA): + pass +``` + +## Table from pandas DataFrame + +_cf._ https://pyfpdf.github.io/fpdf2/Maths.html#using-pandas + +## Using write_html + +Tables can also be defined in HTML using [`FPDF.write_html`](HTML.md). +With the same `data` as above, and column widths defined as percent of the effective width: ```python from fpdf import FPDF @@ -46,18 +228,18 @@ pdf.set_font_size(16) pdf.add_page() pdf.write_html( f"""
` / `` tags anymore, nor `height` / `width` attributes defined on `` tags inside cells, nor `width` attributes defined on `
- - - - + + + + - + - + - + - +
{data[0][0]}{data[0][1]}{data[0][2]}{data[0][3]}{TABLE_DATA[0][0]}{TABLE_DATA[0][1]}{TABLE_DATA[0][2]}{TABLE_DATA[0][3]}
{''.join(data[1])}{''.join(TABLE_DATA[1])}
{''.join(data[2])}{''.join(TABLE_DATA[2])}
{''.join(data[3])}{''.join(TABLE_DATA[3])}
{''.join(data[4])}{''.join(TABLE_DATA[4])}
""", table_line_separators=True, ) @@ -66,55 +248,14 @@ pdf.output('table_html.pdf') Note that `write_html` has [some limitations, notably regarding multi-lines cells](HTML.html#supported-html-features). +## "Parsabilty" of the tables generated -## Recipes ## +The PDF file format is not designed to embed structured tables. +Hence, it can be tricky to extract tables data from PDF documents. -- our 5th tutorial provides examples on how to build tables: [Tuto 5 - Creating Tables](Tutorial.md#tuto-5-creating-tables) -- `@bvalgard` wrote a custom `table()` method: [YouTube video](https://www.youtube.com/watch?v=euNvxWaRQMY) - [`create_table()` source code](https://github.com/bvalgard/create-pdf-with-python-fpdf2/blob/main/create_table_fpdf2.py) -- [code snippet by @RubendeBruin to adapt row height to the highest cell](https://github.com/PyFPDF/fpdf2/issues/91#issuecomment-813033012) -- detect if adding a table row will result in a page break: this can be done using [`.offset_rendering()`](https://pyfpdf.github.io/fpdf2/PageBreaks.html#unbreakable-sections) +In our tests suite, we ensure that several PDF-tables parsing Python libraries can successfully extract tables in documents generated with `fpdf2`. +Namely, we test [camelot-py](https://camelot-py.readthedocs.io) & [tabula-py](https://tabula-py.readthedocs.io): [test/table/test_table_extraction.py](https://github.com/PyFPDF/fpdf2/blob/master/test/table/test_table_extraction.py). - -## Repeat table header on each page ## - -The following recipe demonstrates a solution to handle this requirement: - -```python -from fpdf import FPDF - -TABLE_COL_NAMES = ("First name", "Last name", "Age", "City") -TABLE_DATA = ( - ("Jules", "Smith", "34", "San Juan"), - ("Mary", "Ramos", "45", "Orlando"), - ("Carlson", "Banks", "19", "Los Angeles"), - ("Lucas", "Cimon", "31", "Angers"), -) - -pdf = FPDF() -pdf.add_page() -pdf.set_font("Times", size=16) -line_height = pdf.font_size * 2 -col_width = pdf.epw / 4 # distribute content evenly - -def render_table_header(): - pdf.set_font(style="B") # enabling bold text - for col_name in TABLE_COL_NAMES: - pdf.cell(col_width, line_height, col_name, border=1) - pdf.ln(line_height) - pdf.set_font(style="") # disabling bold text - -render_table_header() -for _ in range(10): # repeat data rows - for row in TABLE_DATA: - if pdf.will_page_break(line_height): - render_table_header() - for datum in row: - pdf.cell(col_width, line_height, datum, border=1) - pdf.ln(line_height) - -pdf.output("table_with_headers_on_every_page.pdf") -``` - -Note that if you want to use [`multi_cell()`](fpdf/fpdf.html#fpdf.fpdf.FPDF.multi_cell) method instead of `cell()`, -some extra code will be required: an initial call to `multi_cell` with `split_only=True` -will be needed in order to compute the number of lines in the cell. +Based on those tests, if you want to ease table extraction from the documents you produce, we recommend the following guidelines: +* avoid splitting tables on several pages +* avoid the `INTERNAL` / `MINIMAL` / `SINGLE_TOP_LINE` borders layouts diff --git a/docs/Tutorial-de.md b/docs/Tutorial-de.md index 56d4d3c32..0d0e0388a 100644 --- a/docs/Tutorial-de.md +++ b/docs/Tutorial-de.md @@ -144,10 +144,6 @@ Sobald det Text der dritten den oben beschriebenen Abstand zum Seitenende erreic ## Lektion 5 - Tabellen erstellen ## -In dieser Lektion zeigen wir, wie man auf einfache Weise Tabellen erstellen kann. - -Der Code wird drei verschiedene Tabellen erstellen, um zu zeigen, welche Effekte wir mit einigen einfachen Anpassungen erzielen können. - ```python {% include "../tutorial/tuto5.py" %} ``` @@ -155,18 +151,12 @@ Der Code wird drei verschiedene Tabellen erstellen, um zu zeigen, welche Effekte [Erzeugtes PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Länder](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -Da eine Tabelle lediglich eine Sammlung von Zellen darstellt, ist es naheliegend, eine Tabelle aus den bereits bekannten Zellen aufzubauen. - -Das erste Beispiel wird auf die einfachste Art und Weise realisiert. Einfach gerahmte Zellen, die alle die gleiche Größe haben und linksbündig ausgerichtet sind. Das Ergebnis ist rudimentär, aber sehr schnell zu erzielen. +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -Die zweite Tabelle bringt einige Verbesserungen: Jede Spalte hat ihre eigene Breite, - die Überschriften sind zentriert und die Zahlen rechtsbündig ausgerichtet. Außerdem wurden die horizontalen Linien - entfernt. Dies geschieht mit Hilfe des Randparameters der Methode `cell()`, der angibt, welche Seiten der Zelle gezeichnet werden müssen. - Im Beispiel wählen wir die linke (L) und die rechte (R) Seite. Jetzt muss nur noch das Problem der horizontalen Linie - zum Abschluss der Tabelle gelöst werden. Es gibt zwei Möglichkeiten, es zu lösen: In der Schleife prüfen, ob wir uns in der letzten Zeile befinden und dann "LRB" als Rahmenparameter übergeben oder, wie hier geschehen, eine abschließende Zelle separat nach dem Durchlaufen der Schleife einfügen. +English versions: -Die dritte Tabelle der zweiten sehr ähnlich, verwendet aber zusätzlich Farben. Füllung, Text und - Linienfarben werden einfach mit den entsprechenden Methoden gesetzt. Eine wechselnde Färbung der Zeilen wird durch die abwechselnde Verwendung transparenter und gefüllter Zellen erreicht. +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Lektion 6 - Links erstellen und Textstile mischen ## diff --git a/docs/Tutorial-es.md b/docs/Tutorial-es.md index 7a17f1efc..20fc0c460 100644 --- a/docs/Tutorial-es.md +++ b/docs/Tutorial-es.md @@ -169,11 +169,6 @@ volverá a la primera columna, desencadenando un salto de página. ## Tutorial 5 - Creando tablas ## -Este tutorial explicará cómo crear tablas fácilmente. - -El código creará tres tablas diferentes para explicar lo que -puede lograrse con algunos cambios sencillos. - ```python {% include "../tutorial/tuto5.py" %} ``` @@ -181,25 +176,12 @@ puede lograrse con algunos cambios sencillos. [PDF resultante](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Archivo de texto con países](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -Dado que una tabla es solo una colección de celdas, es natural construir una -a partir de ellas. - -El primer ejemplo se logra de la forma más básica posible: simples celdas -enmarcadas, todas del mismo tamaño y alineadas a la izquierda. El resultado es rudimentario pero -muy rápido de obtener. - -La segunda tabla incluye algunas mejoras: cada columna tiene su propio ancho, -los títulos están centrados y las figuras alineadas a la derecha. Es más, las líneas horizontales han -sido removidas. Esto es hecho por medio del parámetro `border` del método -`Cell()`, el cual especifica qué lados de la celda deben dibujarse. Aquí queremos -el izquierdo (`L`) y el derecho (`R`). Ahora solo queda el problema de la línea horizontal -para terminar la tabla. Hay dos posibilidades para resolverlo: encontrar -la última línea en el ciclo, en cuyo caso usamos LRB para el parámetro -`border`; o, como se hizo aquí, agregar la línea una vez el ciclo ha terminado. - -La tercera tabla es similar a la segunda, pero usa colores. Los colores de relleno, -texto y línea son especificados de manera simple. Un coloreado alternante para las filas es obtenido -usando de forma alternada celdas transparentes y rellenas. +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 + +English versions: + +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Tutorial 6 - Creando enlaces y combinando estilos de texto ## diff --git a/docs/Tutorial-fr.md b/docs/Tutorial-fr.md index c6687a679..c67d71f65 100644 --- a/docs/Tutorial-fr.md +++ b/docs/Tutorial-fr.md @@ -110,24 +110,21 @@ En utilisant la méthode [accept_page_break](fpdf/fpdf.html#fpdf.fpdf.FPDF.accep Une fois que la limite inférieure de la troisième colonne est atteinte, la méthode [accept_page_break](fpdf/fpdf.html#fpdf.fpdf.FPDF.accept_page_break) sera réinitialisée et retournera à la première colonne. Cela déclenchera un saut de page. ## Tuto 5 - Créer des tables ## -Ce tutoriel explique comment créer facilement des tableaux. - -Le code créera trois tableaux différents pour expliquer ce qui peut être réalisé avec quelques modifications. +Ce tutoriel explique comment créer facilement des tableaux. Deux tableaux différents sont générés, pour illustrer ce qui peut être produit avec de très simples changements. ```python {% include "../tutorial/tuto5.py" %} ``` [PDF généré](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - -[Liste de pays](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) - -Comme un tableau n'est qu'une collection de cellules, il est naturel d'en construire un à partir de celles-ci. - -Le premier exemple est réalisé de la manière la plus basique qui soit : de simples cellules encadrées, toutes de même taille et alignées à gauche. Le résultat est rudimentaire mais très rapide à obtenir. +[Données CSV des pays](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -Le deuxième tableau apporte quelques améliorations : chaque colonne possède sa propre largeur, les titres sont centrés et les chiffres alignés à droite. De plus, les lignes horizontales ont été supprimées. C'est fait grâce au paramètre `border` de la méthode [`.cell()`](fpdf/fpdf.html#fpdf.fpdf.FPDF.cell) qui spécifie quels côtés de la cellule doivent être dessinés. Ici, nous voulons les côtés gauche (`L`) et droit (`R`). Il ne reste plus que le problème de la ligne horizontale pour terminer le tableau. Il y a deux possibilités pour le résoudre : vérifier la dernière ligne dans la boucle (dans ce cas nous utilisons `LRB` pour le paramètre de bordure) ou, comme fait ici, ajouter la ligne une fois la boucle terminée. +Le premier exemple est généré de la façon la plus simple possible, en fournissant des données à [`FPDF.table()`](https://pyfpdf.github.io/fpdf2/Tables.html). Le résultat est rudimentaire, mais très rapide à obtenir. -Le troisième tableau est similaire au deuxième mais utilise des couleurs. Les couleurs de remplissage, de texte et de ligne sont simplement spécifiées. Une coloration alternative pour les lignes est obtenue en utilisant des cellules alternativement transparentes et remplies. +Le second tableau introduit quelques améliorations : couleurs, largeur réduite de la table, moindre hauteur des lignes de texte, titres centrés, colonnes avec des largeurs propres, nombres alignés à droite... +De plus, les lignes horizontales ont été supprimées. +Cela grâce à la sélection d'un `borders_layout` parmi les valeurs disponibles : + [`TableBordersLayout`](https://pyfpdf.github.io/fpdf2/fpdf/enums.html#fpdf.enums.TableBordersLayout). ## Tuto 6 - Créer des liens et mélanger différents styles de textes ## Ce tutoriel explique plusieurs façons d'insérer des liens à l'intérieur d'un document pdf, ainsi que l'ajout de liens vers des sources externes. diff --git a/docs/Tutorial-gr.md b/docs/Tutorial-gr.md index c80460a09..f25e80198 100644 --- a/docs/Tutorial-gr.md +++ b/docs/Tutorial-gr.md @@ -109,10 +109,6 @@ pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C') ## Μάθημα 5 - Δημιουργία Πινάκων ## -Σε αυτό το μάθημα θα εξηγήσουμε πως να δημιουργούμε εύκολα πίνακες. - -Ο κώδικας θα δημιουργήσει τρεις διαφορετικούς πίνακες έτσι ώστε να παρουσιάσουμε τι μπορεί να επιτευχθεί με μερικές απλές προσαρμογές. - ```python {% include "../tutorial/tuto5.py" %} ``` @@ -120,13 +116,12 @@ pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C') [Παραγόμενο PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Κείμενο Χωρών](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -Εφόσον ένας πίνακας αποτελεί μία συλλογή από κελιά, είναι φυσικό να τον κατασκευάσουμε από αυτά. - -Το πρώτο παράδειγμα επιτυγχάνεται με τον πιο απλό τρόπο: πλαισιωμένα κελιά, ίδιου μεγέθους και αριστερά στοιχισμένα. Το αποτέλεσμα είναι υποτυπώδες αλλά αποκτάται αρκετά εύκολα. +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -Ο δεύτερος πίνακας παρουσιάζει ορισμένες βελτιώσεις: κάθε στήλη έχει το δικό της πλάτος, οι τίτλοι είναι κεντραρισμένοι και οι αριθμοί δεξιά στοιχισμένοι. Επιπλέον, οριζόντιες γραμμές έχουν αφαιρεθεί. Αυτό επιτυγχάνεται με την παράμετρο border της μεθόδου Cell(), η οποία ορίζει ποιες πλευρές του κελιού χρειάζεται να σχεδιαστούν. Στη συγκεκριμένη περίπτωση θέλουμε τις αριστερές (L) και τις δεξιές (R). Τώρα απομένει μόνο το πρόβλημα των οριζόντιων γραμμών. Μπορούμε να το λύσουμε με δύο τρόπους: να ελέγξουμε την τελευταία γραμμή στο βρόχο επαναλήψεων, οπότε θα χρησιμοποιήσουμε LRB για την παράμετρο border ή, όπως πράξαμε εδώ, να προσθέσουμε την γραμμή όταν τελειώσει ο βρόχος επαναλήψεων. +English versions: -Ο τρίτος πίνακας είναι παρόμοιος με τον δεύτερο αλλά χρησιμοποιεί χρώματα. Τα χρώματα του γεμίσματος, του κειμένου και των γραμμών ορίζονται ξεχωριστά. Ο εναλλασσόμενος χρωματισμός των γραμμών του πίνακα επιτυγχάνεται με τη χρήση διαφανών και γεμισμένων κελιών. +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Μάθημα 6 - Δημιουργία συνδέσμων και μίξη στυλ κειμένου ## diff --git a/docs/Tutorial-he.md b/docs/Tutorial-he.md index 59d6e7308..f0476ec94 100644 --- a/docs/Tutorial-he.md +++ b/docs/Tutorial-he.md @@ -114,24 +114,16 @@ pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C') ## 5 - יצירת טבלאות ## -דוגמא זו מסבירה איך ליצור טבלאות בקלות. - -הקוד ייצור שלוש טבלאות שונות על מנת להראות מה ניתן להשיג עם שינוים קלים. - ```python {% include "../tutorial/tuto5.py" %} ``` -[תוצר](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - -[טקסט מתמשך](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) - -מאחר וטבלה היא בסה"כ אוסף של תאים, טבעי שכך נבנה טבלאות. - -הדוגמא הראשונה נוצרת באופן הבסיסי ביותר שאפשר:תאים ממוסגרים, מיושרים לשמאל ובגדלים שווים. התוצאה היא בסיסית אבל קלה מאוד להשגה. +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -הטבלה השניה מציגה כמה שיפורים: לכל עמודה יש רוחב משלה, כותרות ממורכזות ותמונות מיושרות לימין. הוסרו קווים אופקיים. זה נעשה על ידי תכונות הגבול של המתודה Cell(), שמציינת איזה גבולות של התא להדפיס. כאן אנחנו רוצים את הגבול השמאלי (L) והימני (R). כעת נותרה הבעיה של הקווים האופקיים. ישנן שתי אפשרויות לפתור בעיה זו: לבדוק את הקו האחרון בלולאה, במקרה זה נשתמש בLRB עבור פרמטר הגבול; או לחלופין, כמו שעשינו כאן, להוסיף את הקו בסוף הלולאה. +English versions: -הטבלה השלישית דומה לשניה אבל עושה שימוש בצבעים. צבעי המילוי, טקסט והקווים מצויינים במפורש. שינוי הצבעים נעשה על ידי שימוש בתאים שקופים ומלאים לסירוגין. +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## 6 - יצירת קישורים וערבוב סגנונות טקסט ## diff --git a/docs/Tutorial-it.md b/docs/Tutorial-it.md index f19d0f6f9..bde3bfb9c 100644 --- a/docs/Tutorial-it.md +++ b/docs/Tutorial-it.md @@ -130,10 +130,6 @@ Una volta che il limite inferiore della terza colonna sarà raggiunto, [accept_p ## Tuto 5 - Creare tabelle ## -Questo tutoria spiegherà come creare facilmente tabelle. - -Creeremo tre diverse tabelle per spiegare cosa si può ottenere con piccolo cambiamenti. - ```python {% include "../tutorial/tuto5.py" %} ``` @@ -141,13 +137,12 @@ Creeremo tre diverse tabelle per spiegare cosa si può ottenere con piccolo camb [Risultato PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Testo delle nazioni](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -Dato che una tabella è un insieme di celle, viene natura crearne una partendo da loro. - -Il primo esempio è la via più elementare: semplici celle con cornice, tutte della stessa dimensione e allineate a sinistra. Il risultato è rudimentale ma molto veloce da ottenere. +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -La seconda tabella contiene dei miglioramenti: ogni colonna ha la propria larghezza, i titoli sono centrati e i numeri allineati a destra. Inoltre, le linee orizzontale sono state rimosse. Questo è stato possibile grazie al parametro border del metodo Cell(), che specifica quali lati della cella saranno disegnati. In questo caso vogliamo il sinistro (L) e il destro (R). Rimane il problema delle linee orizzontali. Ci sono due possibilità per risolverlo: controllare di essere nell'ultimo giro del ciclo, nel qual caso utilizziamo LRB per il parametro border; oppure, come fatto in questo esempio, aggiungiamo una linea dopo il completamento del ciclo. +English versions: -La terza tabella è molto simile alla seconda, ma utilizza i colori. Il colore di sfondo, testo e linee sono semplicemente specificati. L'alternanza dei colori delle righe è ottenuta utilizzando celle con sfondo colorato e trasparente alternativamente. +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Tuto 6 - Creare link e mescolare stili di testo ## diff --git a/docs/Tutorial-pt.md b/docs/Tutorial-pt.md index 6064beb42..6e66b2b0c 100644 --- a/docs/Tutorial-pt.md +++ b/docs/Tutorial-pt.md @@ -125,10 +125,6 @@ Quando o limite inferior da terceira coluna é alcançado, o método [accept_pag ## Tuto 5 - Criar Tabelas ## -Este tutorial irá explicar como criar tabelas facilmente. - -O código seguinte cria três tabelas diferentes para explicar o que pode ser alcançado com alguns ajustes simples. - ```python {% include "../tutorial/tuto5.py"%} ``` @@ -136,16 +132,12 @@ O código seguinte cria três tabelas diferentes para explicar o que pode ser al [PDF resultante](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Texto dos países](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -Uma vez que uma tabela é apenas uma coleção de células, é natural construir uma -a partir delas. - -O primeiro exemplo é obtido da maneira mais básica possível: moldura simples - células, todas do mesmo tamanho e alinhadas à esquerda. O resultado é rudimentar, mas - muito rápido de obter. +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -A segunda tabela traz algumas melhorias: cada coluna tem sua largura própria, os títulos estão centrados e as figuras alinhadas à direita. Além disso, as linhas horizontais foram removidas. Isto é feito por meio do parâmetro border do método Cell(), que especifica quais lados da célula devem ser desenhados. Aqui nós queremos os esquerdo (L) e direito (R). Agora apenas o problema da linha horizontal para terminar a mesa permanece. Existem duas possibilidades para resolvê-lo: verificar para a última linha do loop, caso este em que usamos LRB para o parâmetro da borda; ou, como foi feito aqui, adicione a linha assim que o loop terminar. +English versions: -A terceira tabela é semelhante à segunda, mas usa cores. Preenchimento, texto e as cores das linhas são simplesmente especificadas. Coloração alternativa para linhas é obtida usando células alternativamente transparentes e preenchidas. +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Tuto 6 - Criar links e misturar estilos de texto ## diff --git a/docs/Tutorial-ru.md b/docs/Tutorial-ru.md index 1712f0f6c..0601a56d2 100644 --- a/docs/Tutorial-ru.md +++ b/docs/Tutorial-ru.md @@ -105,24 +105,18 @@ pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C') ## Руковдство 5 - Создание таблиц ## -В этом уроке мы расскажем, как можно с легкостью создавать таблицы. - -Код создаст три различные таблицы, чтобы объяснить, чего можно достичь с помощью нескольких простых настроек. - ```python {% include "../tutorial/tuto5.py" %} ``` [Итоговый PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Список стран](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -Поскольку таблица - это просто набор ячеек, естественно построить таблицу из них. - -Первый пример достигается самым простым способом: простые ячейки в рамке, все одинакового размера и выровненные по левому краю. Результат элементарен, но достигается очень быстро. - -Вторая таблица имеет некоторые улучшения: каждый столбец имеет свою ширину, заголовки выровнены по центру, а цифры - по правому краю. Более того, горизонтальные линии были удалены. Это сделано с помощью параметра border метода Cell(), который указывает, какие стороны ячейки должны быть нарисованы. Здесь нам нужны левая (L) и правая (R). Теперь остается только проблема горизонтальной линии для завершения таблицы. Есть две возможности решить ее: проверить наличие последней строки в цикле, в этом случае мы используем LRB для параметра границы; или, как сделано здесь, добавить линию после завершения цикла. +English versions: -Третья таблица похожа на вторую, но в ней используются цвета. Цвета заливки, текста и линий просто задаются. Альтернативная окраска строк достигается путем использования поочередно прозрачных и заполненных ячеек. +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Руководство 6 - Создание ссылок и смешивание стилей текста ## diff --git a/docs/Tutorial-zh.md b/docs/Tutorial-zh.md index 55985fad1..fd85d992f 100644 --- a/docs/Tutorial-zh.md +++ b/docs/Tutorial-zh.md @@ -177,10 +177,6 @@ pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C') ## 教程五 - 创建表 ## -本教程将演示如何创建表。 - -该代码创建了三个不同的表,演示了几个简单的表格配置。 - ```python {% include "../tutorial/tuto5.py" %} ``` @@ -188,23 +184,12 @@ pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C') [生成的 PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [源文本](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -表格只是单元格的集合,因此由单元格便可构建一个表格。 - -第一张表以最基本的方式实现:带框的单元格,大小相同且左对齐。 -虽然简陋,但操作便捷。 +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -第二张表进行了一些改进:每列都设定了宽度,标题居中,数字右对齐。 -此外,水平线也被删除。 -上述设定由`Cell()` 的边界参数完成,在参数中指定需要绘制的 -单元格边框。 -在示例中,需要绘制左侧 (`L`) 和右侧 (`R`) 的边框。 -水平的边框可使用两种方法设置: -对于循环中的最后一行,使用 `LRB` 作为边界参数; -或者,如示例中,在循环结束后添加一行。 +English versions: -第三张表与第二张表类似,但设置了颜色。 -填充、文本和线条的颜色直接指定即可。行间的间隔着色可以 -通过交替使用透明和填充的单元格实现。 +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## 教程六 - 创建链接和混合文本样式 ## diff --git "a/docs/Tutorial-\340\244\271\340\244\277\340\244\202\340\244\246\340\245\200.md" "b/docs/Tutorial-\340\244\271\340\244\277\340\244\202\340\244\246\340\245\200.md" index f64e976bd..e481ccc0e 100644 --- "a/docs/Tutorial-\340\244\271\340\244\277\340\244\202\340\244\246\340\245\200.md" +++ "b/docs/Tutorial-\340\244\271\340\244\277\340\244\202\340\244\246\340\245\200.md" @@ -154,10 +154,6 @@ Logo को निर्दिष्ट करके [image](fpdf/fpdf.html#fpdf ## Tuto 5 - टेबल बनाना ## -यह ट्यूटोरियल समझाएगा कि टेबल को आसानी से कैसे बनाया जाए। - -कुछ सरल समायोजनों के साथ क्या हासिल किया जा सकता है, यह समझाने के लिए कोड तीन अलग-अलग टेबल बनाएगा। - ```python {% include "../tutorial/tuto5.py" %} ``` @@ -165,20 +161,12 @@ Logo को निर्दिष्ट करके [image](fpdf/fpdf.html#fpdf [Resulting PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - [Countries text](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) -चूंकि तालिका (Table) केवल कोशिकाओं (Cells) का एक संग्रह (Collection) है, इसलिए उनमें से एक का निर्माण करना स्वाभाविक है। +This section has changed a lot and requires a new translation: https://github.com/PyFPDF/fpdf2/issues/267 -पहला उदाहरण सबसे बुनियादी संभव तरीके से हासिल किया गया है: सरल फ़्रेमयुक्त कोशिकाएं (simple framed cells, सभी समान आकार कोशिकाएं (same sized cells) और बाएं संरेखित कोशिकाएं (left aligned cells)। -परिणाम अल्पविकसित है लेकिन प्राप्त करने के लिए बहुत जल्दी है। - -दूसरी तालिका कुछ सुधार लाती है: प्रत्येक कॉलम की अपनी चौड़ाई होती है, शीर्षक केंद्रित होते हैं और आंकड़े सही संरेखित होते हैं। इसके अलावा, क्षैतिज रेखाओं को हटा दिया गया है। -यह Cell() विधि के बॉर्डर पैरामीटर के माध्यम से किया जाता है, जो निर्दिष्ट करता है कि सेल के किन पक्षों को खींचा जाना चाहिए। -यहां हम बाएं (L) और दाएं (R) वाले चाहते हैं। -अब केवल क्षैतिज रेखा की तालिका (Table) को Finish करने की समस्या बनी हुई है। - - इसे हल करने की दो संभावनाएं हैं: लूप में अंतिम पंक्ति की जाँच करें, जिस स्थिति में हम सीमा पैरामीटर के लिए LRB का उपयोग करते हैं; या जैसा कि यहां किया गया है, लूप खत्म होने के बाद लाइन जोड़ें। +English versions: -तीसरी तालिका दूसरे के समान है लेकिन रंगों का उपयोग करती है। Fill, टेक्स्ट और लाइन रंग बस निर्दिष्ट हैं। -वैकल्पिक(Alternate) रूप से पारदर्शी और भरी हुई कोशिकाओं का उपयोग करके पंक्तियों के लिए वैकल्पिक रंग प्राप्त किया जाता है। +* [Tuto 5 - Creating Tables](https://pyfpdf.github.io/fpdf2/Tutorial.html#tuto-5-creating-tables) +* [Documentation on tables](https://pyfpdf.github.io/fpdf2/Tables.html) ## Tuto 6 - लिंक बनाना और टेक्स्ट शैलियों को मिलाना ## diff --git a/docs/Tutorial.md b/docs/Tutorial.md index 8142de057..8014802af 100644 --- a/docs/Tutorial.md +++ b/docs/Tutorial.md @@ -169,37 +169,23 @@ back to the first column and trigger a page break. ## Tuto 5 - Creating Tables ## -This tutorial will explain how to create tables easily. - -The code will create three different tables to explain what - can be achieved with some simple adjustments. +This tutorial will explain how to create two different tables, + to demonstrate what can be achieved with some simple adjustments. ```python {% include "../tutorial/tuto5.py" %} ``` [Resulting PDF](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/tuto5.pdf) - -[Countries text](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) - -Since a table is just a collection of cells, it is natural to build one - from them. - -The first example is achieved in the most basic way possible: simple framed - cells, all of the same size and left aligned. The result is rudimentary but - very quick to obtain. - -The second table brings some improvements: each column has its own width, - titles are centered and figures right aligned. Moreover, horizontal lines have - been removed. This is done by means of the border parameter of the `Cell()` - method, which specifies which sides of the cell must be drawn. Here we want - the left (`L`) and right (`R`) ones. Now only the problem of the horizontal line - to finish the table remains. There are two possibilities to solve it: check - for the last line in the loop, in which case we use LRB for the border - parameter; or, as done here, add the line once the loop is over. - -The third table is similar to the second one but uses colors. Fill, text and - line colors are simply specified. Alternate coloring for rows is obtained by - using alternatively transparent and filled cells. +[Countries CSV data](https://github.com/PyFPDF/fpdf2/raw/master/tutorial/countries.txt) + +The first example is achieved in the most basic way possible, feeding data to [`FPDF.table()`](https://pyfpdf.github.io/fpdf2/Tables.html). The result is rudimentary but very quick to obtain. + +The second table brings some improvements: colors, limited table width, reduced line height, + centered titles, columns with custom widths, figures right aligned... + Moreover, horizontal lines have been removed. + This was done by picking a `borders_layout` among the available values: + [`TableBordersLayout`](https://pyfpdf.github.io/fpdf2/fpdf/enums.html#fpdf.enums.TableBordersLayout). ## Tuto 6 - Creating links and mixing text styles ## diff --git a/docs/index.md b/docs/index.md index 57ba123ec..628463800 100644 --- a/docs/index.md +++ b/docs/index.md @@ -30,7 +30,7 @@ Go try it **now** online in a Jupyter notebook: [![Open In Colab](https://colab. * Embedding images, including transparency and alpha channel, using [Pillow (Python Imaging Library)](https://pillow.readthedocs.io/en/stable/) * Arbitrary path drawing and basic [SVG](SVG.md) import * Embedding [barcodes](Barcodes.md), [charts & graphs](Maths.md), [emojis, symbols & dingbats](EmojisSymbolsDingbats.md) -* [Cell / multi-cell / plaintext writing](Text.md), with [automatic page breaks](PageBreaks.md), line break and text justification +* [Tables](Tables.md), and also [cell / multi-cell / plaintext writing](Text.md), with [automatic page breaks](PageBreaks.md), line break and text justification * Choice of measurement unit, page format & margins. Optional page header and footer * Basic [conversion from HTML to PDF](HTML.md) * A [templating system](Templates.md) to render PDFs in batchs diff --git a/docs/table-pandas.png b/docs/table-pandas.png index ee350d41ee365ffca045ec23a41130c2750ac555..d0da1d064a17eef97bbe862179a7af4e56314483 100644 GIT binary patch literal 23645 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 literal 12279 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 diff --git a/docs/table-simple.jpg b/docs/table-simple.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb0f0ae2c12f91d68153ca9e505ff900a7ecf0e2 GIT binary patch literal 24560 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 z%0D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 PaoZ`SQI39O{j2Y9*I4W; literal 0 HcmV?d00001 diff --git a/docs/table-with-cells-filled2.jpg b/docs/table-with-cells-filled2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b2e015ec4888f111b1ca8a475f6713ecb5c9747 GIT binary patch literal 19463 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 aHS+O4L|jyCKBf2x|B{Zo_fY@%?f(PvKVnn> literal 0 HcmV?d00001 diff --git a/docs/table-with-fixed-column-widths.jpg b/docs/table-with-fixed-column-widths.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6634b26fe82fce339d09e93f80f80782a3bed617 GIT binary patch literal 18152 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 DdD;i* literal 0 HcmV?d00001 diff --git a/docs/table_align.jpg b/docs/table_align.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d4e7dae2cfec9c012dba467d1324bfab4a12d42 GIT binary patch literal 39270 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 n2>8 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 AB>(^b literal 0 HcmV?d00001 diff --git a/docs/table_with_images_and_img_fill_width.jpg b/docs/table_with_images_and_img_fill_width.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dda23c59fc54bc870a4b9dab4eab08975ab0bd5f GIT binary patch literal 46561 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 DR>xtd literal 0 HcmV?d00001 diff --git a/docs/table_with_internal_layout.jpg b/docs/table_with_internal_layout.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70c9513ce7896f44722cd24e1af54532f5c3eee2 GIT binary patch literal 18536 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 literal 0 HcmV?d00001 diff --git a/docs/table_with_single_top_line_layout.jpg b/docs/table_with_single_top_line_layout.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c43454886ae92747c9b229f4b9783a1ad9af692a GIT binary patch literal 13287 zcmch81zglm*YE7ou)xv{ONdK{lz_5yiF6|k64FR0v2-Iys347`ARw&*(t=2bf;7?s zA}MiK|L^~~_kHhspXc_E+2PDN-*e8)eD=%?^E+HlUCslznv$v#fIt9%V1B^m0^n8j zbF>FQLj!OF0Pry~AppftgqROK<^z;H?d)8=9NfIY@%DGe<(B`rB673FUu5G;%iHVy#} z4gn=G5i#Ze@^je^$ne1mG#v}V2B2gREHcPtCt$=33F}Y!-S0mS4lW)x1d5M^ky8F1 z^}l~EzW^9U0Sd>0VmFF2*5T=-sKjf0N9Jkbb?a8 zttmg@9lQiOho4US`<{7W?8Ab-o9Hx*;yk4`_#T%Izm-@G7*xd$WI#|$*@FU5p zlhMIpd1&aVgRU#aqF?9XaDx6t0?Uof^pO2A!%=z2;T$eiGa7*CC$s_rL&=<2jUVr0 zngHP5wW@oRZF?jU!vDMZ`-x4X6nU4F&r1=y~~kUWN3E z|9_O8S@;urS`@x|6&l$>NPmoUp3nQ63=+tX_|`T5N+2}ySr!-1e--?}B>Q6A!s_vi zR*^RvvUTbTxRJ*v!&8U^v^!MsUV*>{Y!wUJr4gt{$~Wl zcweoC#_7AP^u2rO*t0BBf#et%WHBT+;LPQRQGj;!REuvt{o*6P-`Wp;5x%N0M1My8 zZUDV)P-Q}ymbzCshkm)lPTG(^pYoOb;QYjeAU?|fWx9hncRM$#F7m@Hv0CS- zPd||#k8PBD<#Y9~gPT>OQvl*RUQGVAyXgnbTf-RSoBJN=a@z>~Hbje(@f`0ytc z-uU(#McH}=nxVN^qJub#RQ@-2sY2JqIyak-gWI!-A5``g+tx6N?w z1CvS02Q9|3e;zTFsaDUb6Fn5R@A{?l z4O~9Q@-|tS33-3ts*$5;Xro~8k$na2v)oW2o1eum;g8?hw4W^fhL)e{{jmZ&g4STj^Hbc%4IR<_Chg?E}`7^MzW2iEwbrw;J1w z`R>9OTL+w}E36}QIu2#OV&$0a#M3@iznt2P^YUepw|N=5VD*j*ZD#aT0wJj_wtdoj z8VCJmWyiviD=%`Go?)fSRPn&VfQ?y$$v<4UL?xO$v=&B7i|zXiS^lN6oNBoyiFW#@ zWq?Hy(GiKXwd^udwLTx>cGz=%APDs@czq#8Y^^}GUYEG`5Z_2h+@phC zOt#2^V_(G2DVAR&%AC!j`KK5U*R#99(ix){C-o$g71Y1%xo=!G5d)DD&tQ`Dv`pe@w<0pBroSdy4&`1f7i3WVIr+jj zY1g`j_Rbw=S9bg`;-CEMSyne9RK>#$#-B3dDLWwUn~X=RlDxJRdA!j>S!K}s>y?>D zKDo>WMdef00+SDXi6+x8bkFu&c=*9RG1ir?WPUtaIDK>J@=;nry1ru?-Dpi+=M{yjV2uq4OE&{#NAlL+yG)&CPqok4;>vL{yvy z5;SYM4VYb;yyBc06gl}^{i!Xahq@I!BCxfPSlkk1v)yq-9J2YU>2LMB>uBfb4R9yb zvAtH?7>)uRp60?TW2xl^d9B_PDpDXG4Ly}0=#{0t+byDflgx_FOyqV3swZ8ug5pfd z=&|DkB})@-OidM%%~nuJD!4);q5L$$*ZJp?YE6}A;cI@_6DP}Fh?=eW9o6{HXrv!f zaJy2Q%Ey+mw#AE+!R@jA3Fo7ef;{c0FD1c!_ktoq5?&GMiD_@eOfOT_zY(8oJWp9z z)eu>oFb{k=o0s}xpxRhF=bp&v^ByiL>f+J&C~sUHo%(0exx*Byd@rsW5DSuM88erugCCSBCA*VNJrnx3s2cKYv5WhyDx1~A?(3)#c80TCp1z^U!4cV=>p-=7 zTmt^!--j-;|9I$1`m+pUK_D^^rq+Lgfc^s^4+l^P6dQ_%gM*6$#l!3vnAIJd4B(Kn zQV3D9iOOoHF5n7Vd4y203!;+Y9M|M@@~qvfhj$U^D_Xjqq3_%OZRN+6!L0nv(&><= zH?9zC94~HAnlAcVmt#&>rLm!&p9Z;RV2bG$i+NTPON*DLIE7^vbD-?WP_GwFA3QKE` z_O~T-s7t=vcD50mxRPl07Pln)l`&-J_)$97qIq&z5kD`B``p7_7Dm;lF-%s8w~2UI zNjNSt{dQtTZm5e&?XJX}FH2tnyqhnwYm7_RvWJx>cCIe8aE+KgD`Qd677&-YQ_BuVF^d0CZima~hPC2hc&5T9+?8M0te0?YmSbFKDBJJGURBzshb z4MG7Z(N@BI8x6|S2MLG^3$lZ*0M|O4wTd47@GQj9S+#~TgKB5#qc|)P1>VrfsYTkQ z;i(MXRQl?IfBEo+9Vl17p0V078g-NR$L5bbsBV;5%8v=>-Aim5rrv5 z*Aufuj0@SbUVYtb9~%`b`M~aBjXxE3{4;5IovN;8*ZM9E!Q#YeJj!98uCbiW!>^Ex zdxQQ>bJ66=y@%@hJsEF@n;|ND*l-Gu!M7H4@&-L3UWO5R8~4nnml~usU)=H2?6?wj zZTGB2!$MQVuBhOG-C6tLG1P<8G+o!}ZjzvetlU8zqqe<$a(cQX+3kS}R|c=8z0PM5 zFyUc)bvFF6#WXoprt~w}hsTL`I_S3L+lZOG*k7J@PvALwwHzM?6=mnd;84c@sDDBI z?yY7A^UzN<1&WDD@94((s1l>>^Dxhz+C*gLZ7ZefuCiPyrxBc(tIQwz96rT2V=&P-u2D}7;1epwo1=-I(jZGN>rhg^-NV}b1D9j zLD~8m&+!+IG{5JFX{f)28>68tqeS0vpW^L=9U+*ZB-ija?P(5ZJWMc-G-ccDfL#$2#4cQlH8q^3xwxx z7v=EEeWmi;WO2Fsj(X%ukHx81Z7!xhaMw5ygsupGfYnk7bfg473}!j%PAgCYA1y*F z$|m=2$~?L?R#|GQDnQQ^w0_K}RLu84d^&nxCBC5hi^kw#Pd!$_`Y&~P-C4ysRVk*! zPUApLk`&S65W7%jq(CX4q28MbRAP;pHp?|vz9^QeK3Ba2gW)4`ur|j<;*43E-R|gQ z8_jiXw+~&qeA1qpG)?S$eP^xw*6S3b7ANb|>Oqa$&!<10+SGfwU0YB5Jn(j~Nb0WG z{>`WV*V$hN&izkE_mmT7#TvHxdw0PKpWw*t z!;AB&@_el`C(HOFhWoFagL2|O%{=J{&`@vB$j-k)Vv{BExHyG0a_W}^xs!yMH6DT= zZ?kpTilp+#$5Xc08=nVWU7#1e$@(d)k}4lpJmNVIcGA>(EOKu_fc9O?3R;C{S0?>1 zkaENB6OM8rvd~TIF~vxtBj^kF=*_<@kVZ)>wGLcE6RnTp;s_(dSs^rJyYX zou6e-bAMg8Ct!^5ZmFl4UKZM_P#+&)pDf@*-Q8&TO3h@Bnz1I4-d8V>A;T4hd&j)I zZu7-DjS5cdkZ0#m$n8q4PVWC)OOxyE?}MLm}8ia>UurQtm`!Vq)em*93lbLT~4 z$ZZRw__13|F9Eb}n^TG_o3{TG#a3!MkGAI?x0 zD^ZD;Kz->;xbX^la=qD=9Jd=Kvppj;&Z`j)g<7LDJAY-CDC}dvMU4Q z5X?>Fpw?$ZpBaYci>A|1+giDMI1~_k-Rn^qdh6aSkv^v>6{JY-M{e+FhF9F;N#vCm zBGnoG8q0DG69Jkr9i_Qp>Lp6_ct(DV-f1z4O4%$lC$+~`+=ayn8(M&aJ+R5VG`dNwNhZsM{Bb%}o+L-(oiPy;8hf3g%AMbvJRK4ivBc>mscZo+HA)>@rPqcv;QtT{Uz)a~;# zCE@Xx5p#kiT1;#Vc%wc|%h#<#6+-i6joB4xwHino8l^5l_?eK%wz5H~rZ_ZzA!vDq z_;h-od3#Tv(S1N?tc>23s=0xte$~rmH~;Ak{q>3R?-fCG99Y)A%fVEINuTx1p4*pS zx5kksWx8>g_)VkbA<=XE*D|$^*EkK5tuhMkNM}p()laT`Jz>n@4*AGu!M>U1AFkMh zwHV;>Wc)qvAa)v;rnGS1C&Gq(V#8`Ys?=(o@kENZ09;yL4m&ECF4IZRtr!|G*GcGd?63umUb-EPw!5l?B}2YPY_ z1UDz}zV6LwRK!=Z536Y#^xx==7v*vOK3cu`I^$2TjGrMt-mg~BHdRAh{t^7-Cf0X z0}LidrJ5Y{Ese`wxHgUl`f@ILEV=9{8X7Zdy%TiiaC`N#eP&Cn?h;t^4vn|J=W!?$ zAPc@9LTx7_G#AUC&KCMO!%9m>oZr^t`wg&P8(nMV!}Xa6ITbPxs~yX3B79?alnB(4Oy+E`he%-a@uD5db`r5=J1G!i`ld`$CMxGNB4yo)<>t>_hkBz zB?U1X&bB&>$nBa(->m&%-dqkV#VL`tBr3@E`FlaFq@R^w0#{YD96R`$3y&}4g+`xz zY7gnt$V<(NIGhWtCe|aaq)U~|iQ0-Zh?}Tfn!4DHEyfG=nsAJab`x*+L9!-U&Ly@>c>ZmZ~LX=I-)m4igzfP z>Tk^LcQB84F)4VI4fXJN~=+mngg zw!Al7b9|~gURc6Bzv>Y@6#r0!dy!I8tb%fK7$;3-)8c7eG_zRGYlj2At2=e@mS-x> ziC04A+F%CnDQ0w6;~3eLIFO61SSu|&lhL(wE!9k_DS^U|d1Vg8CK^1tY;{I{NkVAt2b?8|mC}_vBE#JVJ-5?zn>HC{=XOq5 z?pC5ML09hTk9&Gu%7_#p2Mz~zje+)*hryq=9*XKeX%f(Kkuf<_IktT*6N5XQy&qlb zL}hPZB-~*^bl-`+`TJ7S5ld+&T>vYyQ<#skGYS3oS?NQI3!|6)8~SXIgqiqp5kMIOw zY<1Fhx?ged3|GR~I^$Tsy;t0|BSWO_2TENuI*-cTcb)SQmjFbN85s(#LNp6AZTlX( zu}Efu`a?#iwLPctvQs=6M$`Nb=ec8>Y}yRJ7?-DO3`@5h$O0%$_cEif9m{7&axEb2 ziV1jEw5?9ax+AZ<^qYhwXzO-Scs3(w?NyTL-Yu3p&+q1|>*ot{ak zDk5Q-@mVSb`W-bBVuplvHRe<`uRPY6u5M7ZOpEl#?BR6M^qX{c8}irPyp`=+Hyeec zlhphh?+i}DVz3<^?I2N*?x#yeJyOVq6PG93)dk7D-^XZ;&h{8*_=RgfkkMDTXcS$7 zIl97Ya(Y_P4F;_gF@fy!ZkSV=*{x=!1;x(WSk8->J<4;AE{C4AGQ#HW!iUm((_Zxx z)h$!}`p~(u;g&iNOIOm#UqRQtjc;(9`&&dYX1+ucqp=#d2eXBbO}My6%-Y=5d)?d*;IZX^>XH4&?Z8T1|{phS7AN}chYNITMTjHY80Aup@0nPTiyrg`imo8dud76q^1C8-t$1tfnZ;kLl&4?3?6kpQelwnq1QX~)Xet9 zQ#BK_rWM~Jwdzg}7X5^m%F&&n$Vmmyw>p8V=E6l^?dm5RRxCd*WK)sJ4Ml$?csH=~ za53-d%NPqix7+0GF9^jdj%JSsOp2=A?l8)Kw{9R_5;tHtUM$Nf7EW;D&>-NGRs_dc zN3Ek&`p~kc^wD_<$(F22p*~Em3gkk1?4yjj>Rm?cN9rw30+ay|Ki- z&SqghyG@zQHYJCcROF_5->a3n<;j?7k9tSH!U@(G&pl}Fs=Wk3!Lf_a3REk`g-h*D z(Ms$UrCcNA6ok>;ZR7-(KsNqU#aB9KV+OfPz?n9BaF&1=XHiPj@a)_S;+!VUn_Cll zVmM6e$o#}0uj7I{+sP$i3-2d9t$(%CPk9plh_)nJ@@+DI zig31Ui^Y$*!#9{KI9@pBwFvb0>k|kT=C#T13pO&qDkQ7DXC;X82uX(Ly>~|sBeX25 z7yf>SBExzKylqU#Da|?#XHksIuA$KxrNKt0(osDU}^=fKEMf6M2vAB+~SKDQOk! zfzl%x*tlR4D^9F}f+CA#P}pn2xA)P@xt0WG^%I#~T3RALS&Vt9vF}bK(DoaH&lRtj zE1=%UC0FiH@{*P4hV@!3(N~dILbom?8;pFH*>prin&G5unOy@x*!`kK+dHBHVL|Cc zkYJ-j0{@esiNz3@Md1kA5Hi`N;v4kCO)ag08&XJQh?-vxXa0cCejlOgdM)b*8_I|6 z>ZC;20m`2scj@7x$bB8tupmfzX|qZZ8j$Z$1z?vyI`(GGxC0%wZzUnsYXi`s+Rv?% z?1x*N6B(IFRr@lZ3@m9gXL7000ryiEV+@MoaqScBb1|2sG4hG4KPPaG(#*2Sh&hnL-|{6A z@4HGs{)MVHB67k@;*^xuH1{2H7$Q53w(q6Ll{6_Vfp=$rgN4S%FzKl|*(h-8I`pHc zxvcEfEXlYN@CA5>dyEFIm}kiEmLIJeMNnNOo(Q||SmJiRYY2Im0P#2VD8|H@?rVuPCKT|kKYKBuS}-4zd8~B z0VU6xL=`;7zouOFVILD=X=>ZAy%j4y3BFg$jWDVDQGOV}cJb?>v|Di2d8-(DBL`b@ z&|t9q?)dAC&jjO=1R^p03$?NiaixKs1vL`=XF-rEi77*J)bN4@OIW-JCup~yQn6Ng?6e#w%_D) zF6*l*+c*7sgpzRcuDy5^B->h*`ElqwOZx%6p^ERuS_an}gmnseLWx=ZU{#cA2-KvM z^0B)h^Ap(iwtt14!F%K_&j@VJwDhI@q0rM>gI`gV$d?adY&H(xn_qmqHnQ$2+u~Sh zBQfA-;?ehZU9&@Qr!tk1pl8pT;F}X3H{(r-Uf9NRtsAt;;nk!)mJ*&%qj)pl4!Pmu zmcUCe8n4oqZ|XQ%y(C`0dQ~C^;U+FxLrx}4zD!TTSv8M+%n#OXR^}nePOgQosrI?^ z)CVl#4og$UzSX+hGgTX}t8Zt>W0pB!>Gb|8|4#e>ns%MyiSg8SiJ z?z!4|FMliE@nGysI_^pi>kMo%r9|LjcuLvxJh8={-~X+a6hmf=4-OYxA=f<=c|dJ3 z;e_wtfN%Qo1??Rv0s@pCj#F!@FsQ0q7RBD%7fHpY5hB~z{K61rp(dQa&*!|NCYwBJ&B3jb@7|$PT7w;XKSsUWKPT|Q&;l81~ z#m}NLuUIt>OYv$F4xLzZ2AVD3?q<1Z0Rq#`~LgT2=5f%k;Nys7g- z)wRHrYy{_~C;dq5!ONG$nUVtsl9F}s{fcE@vxeu$5`A?jOb zLJ)$pBu-^AXHEAB;7Sm4oDX`_%~zG$Nv=)xAc+69Dyv9IQML@rsCBullD=O-+`$Ct z@h8iHF$RU?{fXNmRE5?)wV(04bFB5HOh0YynhG%5u_bR^6sPe^5LYsJzmEs&WS1a+ z{~vQ`tMkN|%jvt6r#3!qAzGH4dmnYaWLs**%X&u8f5+!Dga?9s7v6|G@Ba=Ob+1-I4`K6^q@ zudufC66o|M5MdCCWyz}9G^WL<5rP0~7WXJGs;0zk!-qW8L-X+(VM2P8MWYegH5#L; zV5wpU$x*KIhE@C3tgumRb`_*3L|&WDld2JEl?zuWaIg>0Fz(X&L7Wrs7b}0oNsBV= z_V+azdsU)whtHHznTL#yf~G$tJ2%*bqp}E6mI)}Kqfsx@wC#=DLK!Vs7bnkq9*qlgXs6 z9>v1KCc)WQ!*Y5@d0iDrf)~L98@kiuPHL$srjL zGe;pE79_*@qM|`0%}1G0tLTR)$Za@M`f1kL>u6#zc9XNkMbJDCrNsSM;NMkS~wj%FweF z)k!0k>WvREX=_VBMDAyu?ihwqMk2KZ2;-PF;%*OQDwtEajfu98Bz-5&=6YS|`Oz|y zDm>GZ+mNEd6Pn8vaqHw4QwpTO4&Fpo4q$IxfH&2h}+lkjGsY~Kfyu!m(LhA-wZ@ylo^)D~d&q-64^(JU7n_76u z`Q_X90sl|z{xN96M^`Me^V3=$Gq@$0H$=auh~-a-XCIVMy1D62kc{s|5^8t7bPey$ z{d&*&$#K1_w@7;_cAuWW2-hZE?snq!hXfLN)G>*K%9+N#5Go5_Yg|$ul&E zDz)z6n~Gm_1Y=IyfASLn7UoP2-yf9zKPm&#qlv#QEWt#6+xbK9e-!+O&D}v5hW;_g z_yZ&Dm(cy=&g*ZdKiaVcJ79tx_<~`W8YYPKyB2DL!GAM$0sohI5`Q81e&r6~F_xQ$92LAaV5H%y|@|fa-`0l>!3I(K3kJ1^|wQ z+?*;(0xg0C;cmr7g9y|z@fdwu6;^F-2tYf!80!Fh;wZb4POMT%7Vgk500`3EWkp#H z;bT{)MQXuC!kA^H+Ome|AvkE(h4JuY0JZz^SmO&eAb9LEUkE4MEW>2~g5u9DIUHy} zxVbls1kmg?7c_tn+;~=&)rJO)3A1Zx%LSnCK?o-K(OfPG1wfBly$bm<5E`Y>LZBdjVzy|+b zEA;IT!ck;4yy+)iqX+=3!rsiG`y4lK#S4xzk{%)?}=UT+R*LEpdF<4C&4 zmJ2}@;q7t)Kq3B1W)TIAkDf$^WdQ)#kuPA$f;c6bs2E&D*)8k^uUp6H&k=LqR0xXF zbO6-QKUx**#Sd;pG{D;PRD?=XLW07Sv3MDw;JqQ-K^6xMt%)HAFvxu)!dYfCPDtb3 zLM_Zxb&~3Z{#;{>tyeW=)xrjuUMgJx@-T_gLliS%T;7CTP^i;30X_nXvqT0$;IDeK z70$qr!iJtJ4KIj=VRGD|1l5VylIT7J4jI%EMPMJIR|UYh*dSU9D3)mq1I4h7Xb1R+ z8TVL98xU#@7Y7J{Ba?@Q=o7$)5b0_-D1bU>?_PTk3I#es{2&iUqF(`d=!8xVDm==l zw<`pYM0N0npedd>oyiBb<6yN7E6Q8v%@9-QtDYg~W1IY9fC^FLXuKk+EnHYi*H>^T z_nF=6-Zp5Uv}+^eZOhCt86OckoEl3~!ZJx#VVi2#9n9S6Wt76&%mA*I(7Uk%7x&^^~ez-e+-Uw_U`n{kU*2pY{5 z1jwQ@e1$8?faKMigqyc}adJu87*G%tRQXC0J^(hOmgqu&{U9l*tsKouBXzF^GkgWd z!I4~mPtm59)d=8rAe+(V5&*=#;9%YQUu`%pG7kh3?0_eUj`vD#{DCJ!pOEd_8RtwgJTB{^^)HE=F$OJW18gj`*85KEAwOAZC%k5cjh9KSu=b1@A?i?$GcBZ1ESWL3Tqf~yct zX@QMRaBzk6&T|4mUNlk?Zifx}zY^btBVq&}sn~*Jb#2Nd6#C~E{KA}E;0T6^02+Pm zQx6py4JaBo5D=p5pYj}N0C+A0v;lCDgi9L4N#H`oRZrTm8fzjlK+a1EYxw$wMm%)z z*91aQRx1Rb;fha0YzoB-!A=6*Fcnmv1e8A)ew~~y=@_D`K0wFLKm0>*NY-r`SwSX4D1pRgs0PK_i zp{pSXpf0GpiOqx(!+8lcKoQ6p*Szcmt`K4YhItMI4aW!?$94#_4nw%kytKq36)3b! zkmU#fk#Cl$LIcv7(qjhHc?T;Vvwy6%sdH;Vjgn;UUN~IfUV_Wd F{{>JIV)p<5 literal 0 HcmV?d00001 diff --git a/fpdf/enums.py b/fpdf/enums.py index b5849fb09..0ef0d57f7 100644 --- a/fpdf/enums.py +++ b/fpdf/enums.py @@ -108,19 +108,32 @@ class CoerciveIntFlag(IntFlag): @classmethod def coerce(cls, value): """ - Attempt to coerce `value` into a member of this enumeration. - If value is already a member of this enumeration it is returned unchanged. - Otherwise, if it is a string, attempt to convert it (case insensitively, by - upcasing) as an enumeration name. Otherwise, if it is an int, attempt to - convert it as an enumeration value. - Otherwise, an exception is raised. - Args: - value (IntEnum, str, int): the value to be coerced. - Raises: - ValueError: if `value` is an int but not a member of this enumeration. - ValueError: if `value` is a string but not a member by name. - TypeError: if `value`'s type is neither a member of the enumeration nor an - int or a string. + Attempt to coerce `value` into a member of this enumeration. + <<<<<<< HEAD + ======= + + >>>>>>> Handling page breaks in tables + If value is already a member of this enumeration it is returned unchanged. + Otherwise, if it is a string, attempt to convert it (case insensitively, by + upcasing) as an enumeration name. Otherwise, if it is an int, attempt to + convert it as an enumeration value. + <<<<<<< HEAD + Otherwise, an exception is raised. + Args: + value (IntEnum, str, int): the value to be coerced. + ======= + + Otherwise, an exception is raised. + + Args: + value (IntEnum, str, int): the value to be coerced. + + >>>>>>> Handling page breaks in tables + Raises: + ValueError: if `value` is an int but not a member of this enumeration. + ValueError: if `value` is a string but not a member by name. + TypeError: if `value`'s type is neither a member of the enumeration nor an + int or a string. """ if isinstance(value, cls): return value @@ -228,6 +241,47 @@ def coerce(cls, value): return super(cls, cls).coerce(value) +class TableBordersLayout(CoerciveEnum): + "Defines how to render table borders" + + ALL = intern("ALL") + "Draw all table cells borders" + + NONE = intern("NONE") + "Draw zero cells border" + + INTERNAL = intern("INTERNAL") + "Draw only internal horizontal & vertical borders" + + MINIMAL = intern("MINIMAL") + "Draw only the top horizontal border, below the headings, and internal vertical borders" + + HORIZONTAL_LINES = intern("HORIZONTAL_LINES") + "Draw only horizontal lines" + + NO_HORIZONTAL_LINES = intern("NO_HORIZONTAL_LINES") + "Draw all cells border except horizontal lines, after the headings" + + SINGLE_TOP_LINE = intern("SINGLE_TOP_LINE") + "Draw only the top horizontal border, below the headings" + + +class TableCellFillMode(CoerciveEnum): + "Defines which table cells to fill" + + NONE = intern("NONE") + "Fill zero table cell" + + ALL = intern("ALL") + "Fill all table cells" + + ROWS = intern("ROWS") + "Fill only table cells in odd rows" + + COLUMNS = intern("COLUMNS") + "Fill only table cells in odd columns" + + class RenderStyle(CoerciveEnum): "Defines how to render shapes" @@ -766,7 +820,3 @@ class EncryptionMethod(Enum): NO_ENCRYPTION = 0 RC4 = 1 AES_128 = 2 - - -# This enum is only used internally: -__pdoc__ = {"DocumentState": False} diff --git a/fpdf/fonts.py b/fpdf/fonts.py index e0568b26c..db8ae97c8 100644 --- a/fpdf/fonts.py +++ b/fpdf/fonts.py @@ -1,16 +1,43 @@ """ Definition of the character widths of all PDF standard fonts. """ +from dataclasses import dataclass, replace +from typing import Optional, Union -courier = {chr(i): 600 for i in range(256)} -fpdf_charwidths = { - "courier": courier, - "courierB": courier, - "courierI": courier, - "courierBI": courier, +from .drawing import DeviceGray, DeviceRGB +from .enums import TextEmphasis + + +@dataclass +class FontStyle: + family: Optional[str] + emphasis: Optional[TextEmphasis] + size_pt: Optional[int] + # Colors are single number grey scales or (red, green, blue) tuples: + color: Optional[Union[int, tuple, DeviceGray, DeviceRGB]] + fill_color: Optional[Union[int, tuple, DeviceGray, DeviceRGB]] + + def __init__( + self, family=None, emphasis=None, size_pt=None, color=None, fill_color=None + ): + self.family = family + self.emphasis = TextEmphasis.coerce(emphasis) if emphasis else None + self.size_pt = size_pt + self.color = color + self.fill_color = fill_color + + replace = replace + + +COURIER_FONT = {chr(i): 600 for i in range(256)} +CORE_FONTS_CHARWIDTHS = { + "courier": COURIER_FONT, + "courierB": COURIER_FONT, + "courierI": COURIER_FONT, + "courierBI": COURIER_FONT, } -fpdf_charwidths["helvetica"] = { +CORE_FONTS_CHARWIDTHS["helvetica"] = { "\x00": 278, "\x01": 278, "\x02": 278, @@ -269,7 +296,7 @@ "\xff": 500, } -fpdf_charwidths["helveticaB"] = { +CORE_FONTS_CHARWIDTHS["helveticaB"] = { "\x00": 278, "\x01": 278, "\x02": 278, @@ -528,7 +555,7 @@ "\xff": 556, } -fpdf_charwidths["helveticaBI"] = { +CORE_FONTS_CHARWIDTHS["helveticaBI"] = { "\x00": 278, "\x01": 278, "\x02": 278, @@ -787,7 +814,7 @@ "\xff": 556, } -fpdf_charwidths["helveticaI"] = { +CORE_FONTS_CHARWIDTHS["helveticaI"] = { "\x00": 278, "\x01": 278, "\x02": 278, @@ -1046,7 +1073,7 @@ "\xff": 500, } -fpdf_charwidths["symbol"] = { +CORE_FONTS_CHARWIDTHS["symbol"] = { "\x00": 250, "\x01": 250, "\x02": 250, @@ -1305,7 +1332,7 @@ "\xff": 0, } -fpdf_charwidths["times"] = { +CORE_FONTS_CHARWIDTHS["times"] = { "\x00": 250, "\x01": 250, "\x02": 250, @@ -1564,7 +1591,7 @@ "\xff": 500, } -fpdf_charwidths["timesB"] = { +CORE_FONTS_CHARWIDTHS["timesB"] = { "\x00": 250, "\x01": 250, "\x02": 250, @@ -1823,7 +1850,7 @@ "\xff": 500, } -fpdf_charwidths["timesBI"] = { +CORE_FONTS_CHARWIDTHS["timesBI"] = { "\x00": 250, "\x01": 250, "\x02": 250, @@ -2082,7 +2109,7 @@ "\xff": 444, } -fpdf_charwidths["timesI"] = { +CORE_FONTS_CHARWIDTHS["timesI"] = { "\x00": 250, "\x01": 250, "\x02": 250, @@ -2341,7 +2368,7 @@ "\xff": 444, } -fpdf_charwidths["zapfdingbats"] = { +CORE_FONTS_CHARWIDTHS["zapfdingbats"] = { "\x00": 0, "\x01": 0, "\x02": 0, diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index 83563e00e..dd4359553 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -73,7 +73,7 @@ class Image: YPos, ) from .errors import FPDFException, FPDFPageFormatException, FPDFUnicodeEncodingException -from .fonts import fpdf_charwidths +from .fonts import CORE_FONTS_CHARWIDTHS, FontStyle from .graphics_state import GraphicsStateMixin from .html import HTML2FPDF from .image_parsing import SUPPORTED_IMAGE_FILTERS, get_img_info, load_image @@ -86,6 +86,7 @@ class Image: from .sign import Signature from .svg import Percent, SVGObject from .syntax import DestinationXYZ, PDFDate +from .table import Table from .util import ( escape_parens, get_scale_factor, @@ -142,15 +143,27 @@ def __str__(self): return f"ImageInfo({d})" -class TitleStyle(NamedTuple): - font_family: Optional[str] = None - font_style: Optional[str] = None - font_size_pt: Optional[int] = None - color: Union[int, tuple] = None # grey scale or (red, green, blue) - underline: bool = False - t_margin: Optional[int] = None - l_margin: Optional[int] = None - b_margin: Optional[int] = None +class TitleStyle(FontStyle): + def __init__( + self, + font_family: Optional[str] = None, + font_style: Optional[str] = None, + font_size_pt: Optional[int] = None, + color: Union[int, tuple] = None, # grey scale or (red, green, blue), + underline: bool = False, + t_margin: Optional[int] = None, + l_margin: Optional[int] = None, + b_margin: Optional[int] = None, + ): + super().__init__( + font_family, + (font_style or "") + ("U" if underline else ""), + font_size_pt, + color, + ) + self.t_margin = t_margin + self.l_margin = l_margin + self.b_margin = b_margin class ToCPlaceholder(NamedTuple): @@ -933,7 +946,7 @@ def footer(self): """ Footer to be implemented in your own inherited class. - This is automatically called by `FPDF.add_page()` and `FPDF.close()` + This is automatically called by `FPDF.add_page()` and `FPDF.output()` and should not be called directly by the user application. The default implementation performs nothing: you have to override this method in a subclass to implement your own rendering logic. @@ -950,15 +963,12 @@ def set_draw_color(self, r, g=-1, b=-1): The method can be called before the first page is created and the value is retained from page to page. Args: - r (int): if `g` and `b` are given, this indicates the red component. + r (int, tuple, fpdf.drawing.DeviceGray, fpdf.drawing.DeviceRGB): if `g` and `b` are given, this indicates the red component. Else, this indicates the grey level. The value must be between 0 and 255. g (int): green component (between 0 and 255) b (int): blue component (between 0 and 255) """ - if (r == 0 and g == 0 and b == 0) or g == -1: - self.draw_color = drawing.DeviceGray(r / 255) - else: - self.draw_color = drawing.DeviceRGB(r / 255, g / 255, b / 255) + self.draw_color = _convert_to_drawing_color(r, g, b) if self.page > 0: self._out(self.draw_color.serialize().upper()) @@ -969,15 +979,12 @@ def set_fill_color(self, r, g=-1, b=-1): The method can be called before the first page is created and the value is retained from page to page. Args: - r (int): if `g` and `b` are given, this indicates the red component. + r (int, tuple, fpdf.drawing.DeviceGray, fpdf.drawing.DeviceRGB): if `g` and `b` are given, this indicates the red component. Else, this indicates the grey level. The value must be between 0 and 255. g (int): green component (between 0 and 255) b (int): blue component (between 0 and 255) """ - if (r == 0 and g == 0 and b == 0) or g == -1: - self.fill_color = drawing.DeviceGray(r / 255) - else: - self.fill_color = drawing.DeviceRGB(r / 255, g / 255, b / 255) + self.fill_color = _convert_to_drawing_color(r, g, b) if self.page > 0: self._out(self.fill_color.serialize().lower()) @@ -988,15 +995,12 @@ def set_text_color(self, r, g=-1, b=-1): The method can be called before the first page is created and the value is retained from page to page. Args: - r (int): if `g` and `b` are given, this indicates the red component. + r (int, tuple, fpdf.drawing.DeviceGray, fpdf.drawing.DeviceRGB): if `g` and `b` are given, this indicates the red component. Else, this indicates the grey level. The value must be between 0 and 255. g (int): green component (between 0 and 255) b (int): blue component (between 0 and 255) """ - if (r == 0 and g == 0 and b == 0) or g == -1: - self.text_color = drawing.DeviceGray(r / 255) - else: - self.text_color = drawing.DeviceRGB(r / 255, g / 255, b / 255) + self.text_color = _convert_to_drawing_color(r, g, b) def get_string_width(self, s, normalized=False, markdown=False): """ @@ -1950,7 +1954,7 @@ def set_font(self, family=None, style="", size=0): "name": self.core_fonts[fontkey], "up": -100, "ut": 50, - "cw": fpdf_charwidths[fontkey], + "cw": CORE_FONTS_CHARWIDTHS[fontkey], "fontkey": fontkey, "emphasis": TextEmphasis.coerce(style), } @@ -2652,20 +2656,11 @@ def local_context( if line_width is not None: self.set_line_width(line_width) if draw_color is not None: - if isinstance(draw_color, Sequence): - self.set_draw_color(*draw_color) - else: - self.set_draw_color(draw_color) + self.set_draw_color(draw_color) if fill_color is not None: - if isinstance(fill_color, Sequence): - self.set_fill_color(*fill_color) - else: - self.set_fill_color(fill_color) + self.set_fill_color(fill_color) if text_color is not None: - if isinstance(text_color, Sequence): - self.set_text_color(*text_color) - else: - self.set_text_color(text_color) + self.set_text_color(text_color) if dash_pattern is not None: self.set_dash_pattern(**dash_pattern) yield @@ -3767,6 +3762,14 @@ def image( if self.oversized_images and info["usages"] == 1 and not dims: info = self._downscale_image(name, img, info, w, h) + # Flowing mode + if y is None: + self._perform_page_break_if_need_be(h) + y = self.y + self.y += h + if x is None: + x = self.x + if keep_aspect_ratio: ratio = info.width / info.height if h * ratio < w: @@ -3776,14 +3779,7 @@ def image( y += (h - w / ratio) / 2 h = w / ratio - # Flowing mode - if y is None: - self._perform_page_break_if_need_be(h) - y = self.y - self.y += h - if x is None: - x = self.x - elif not isinstance(x, Number): + if not isinstance(x, Number): if keep_aspect_ratio: raise ValueError( "FPDF.image(): 'keep_aspect_ratio' cannot be used with an enum value provided to `x`" @@ -4621,7 +4617,7 @@ def start_section(self, name, level=0, strict=True): # We first check if adding this multi-cell will trigger a page break: with self.offset_rendering() as pdf: # pylint: disable=protected-access - with pdf._apply_style(pdf.section_title_styles[level]): + with pdf._use_title_style(pdf.section_title_styles[level]): pdf.multi_cell( w=pdf.epw, h=pdf.font_size, @@ -4634,7 +4630,7 @@ def start_section(self, name, level=0, strict=True): self.add_page() with self._marked_sequence(title=name) as struct_elem: outline_struct_elem = struct_elem - with self._apply_style(self.section_title_styles[level]): + with self._use_title_style(self.section_title_styles[level]): self.multi_cell( w=self.epw, h=self.font_size, @@ -4647,33 +4643,83 @@ def start_section(self, name, level=0, strict=True): ) @contextmanager - def _apply_style(self, title_style): - prev_font = (self.font_family, self.font_style, self.font_size_pt) - self.set_font( - title_style.font_family or self.font_family, - title_style.font_style - if title_style.font_style is not None - else self.font_style, - title_style.font_size_pt or self.font_size_pt, - ) - prev_text_color = self.text_color - if title_style.color is not None: - if isinstance(title_style.color, Sequence): - self.set_text_color(*title_style.color) - else: - self.set_text_color(title_style.color) - prev_underline = self.underline - self.underline = title_style.underline + def _use_title_style(self, title_style: TitleStyle): if title_style.t_margin: self.ln(title_style.t_margin) if title_style.l_margin: self.set_x(title_style.l_margin) - yield + with self.use_font_style(title_style): + yield if title_style.b_margin: self.ln(title_style.b_margin) - self.set_font(*prev_font) + + @contextmanager + def use_font_style(self, font_style: FontStyle): + """ + Sets the provided `fpdf.font.FontStyle` in a local context, + then restore font settings back to they were initially. + This method must be used as a context manager using `with`: + + with pdf.use_font_style(FontStyle(emphasis="BOLD", color=255, size_pt=42)): + put_some_text() + """ + if not font_style: + yield + return + prev_font = (self.font_family, self.font_style, self.font_size_pt) + self.set_font( + font_style.family or self.font_family, + font_style.emphasis.style + if font_style.emphasis is not None + else self.font_style, + font_style.size_pt or self.font_size_pt, + ) + prev_text_color = self.text_color + if font_style.color is not None and font_style.color != self.text_color: + self.set_text_color(font_style.color) + prev_fill_color = self.fill_color + if ( + font_style.fill_color is not None + and font_style.fill_color != self.fill_color + ): + self.set_fill_color(font_style.fill_color) + yield + if ( + font_style.fill_color is not None + and font_style.fill_color != prev_fill_color + ): + self.set_fill_color(prev_fill_color) self.text_color = prev_text_color - self.underline = prev_underline + self.set_font(*prev_font) + + @check_page + @contextmanager + def table(self, *args, **kwargs): + """ + Inserts a table, that can be built using the `fpdf.table.Table` object yield. + Detailed usage documentation: https://pyfpdf.github.io/fpdf2/Tables.html + + Args: + rows: optional. Sequence of rows (iterable) of str to initiate the table cells with text content + align (str, fpdf.enums.Align): optional, default to CENTER. Sets the table horizontal position relative to the page, + when it's not using the full page width + borders_layout (str, fpdf.enums.TableBordersLayout): optional, default to ALL. Control what cell borders are drawn + cell_fill_color (int, tuple, fpdf.drawing.DeviceGray, fpdf.drawing.DeviceRGB): optional. + Defines the cells background color + cell_fill_mode (str, fpdf.enums.TableCellFillMode): optional. Defines which cells are filled with color in the background + col_widths (int, tuple): optional. Sets column width. Can be a single number or a sequence of numbers + first_row_as_headings (bool): optional, default to True. If False, the first row of the table + is not styled differently from the others + headings_style (fpdf.fonts.FontStyle): optional, default to bold. + Defines the visual style of the top headings row: size, color, emphasis... + line_height (number): optional. Defines how much vertical space a line of text will occupy + markdown (bool): optional, default to False. Enable markdown interpretation of cells textual content + text_align (str, fpdf.enums.Align): optional, default to JUSTIFY. Control text alignment inside cells. + width (number): optional. Sets the table width + """ + table = Table(self, *args, **kwargs) + yield table + table.render() def output( self, name="", dest="", linearize=False, output_producer_class=OutputProducer @@ -4725,6 +4771,17 @@ def output( return self.buffer +def _convert_to_drawing_color(r, g, b): + if isinstance(r, (drawing.DeviceGray, drawing.DeviceRGB)): + # Note: in this case, r is also a Sequence + return r + if isinstance(r, Sequence): + r, g, b = r + if (r, g, b) == (0, 0, 0) or g == -1: + return drawing.DeviceGray(r / 255) + return drawing.DeviceRGB(r / 255, g / 255, b / 255) + + def _is_svg(bytes): return bytes.startswith(b", attributes dict - self.th = None # inside a , attributes dict - self.tr = None # inside a , attributes dict - self.thead = None # inside a , attributes dict - self.tfoot = None # inside a , attributes dict - self.tr_index = None # row index - self.theader = None # table header cells - self.tfooter = None # table footer cells - self.theader_out = self.tfooter_out = False - self.table_row_height = 0 self.heading_level = None self.heading_sizes = dict(**DEFAULT_HEADING_SIZES) self.heading_above = 0.2 # extra space above heading, relative to font size self.heading_below = 0.2 # extra space below heading, relative to font size if heading_sizes: self.heading_sizes.update(heading_sizes) - self._only_imgs_in_td = False self.warn_on_tags_not_matching = warn_on_tags_not_matching self._tags_stack = [] - - def width2unit(self, length): - "Handle conversion of % measures into the measurement unit used" - if length[-1] == "%": - total = self.pdf.w - self.pdf.r_margin - self.pdf.l_margin - if self.table["width"][-1] == "%": - total *= int(self.table["width"][:-1]) / 100 - return int(length[:-1]) * total / 100 - return int(length) + # -related properties: + self.table_line_separators = table_line_separators + self.table = None # becomes a Table instance when processing
tags + self.table_row = None # becomes a Row instance when processing tags + self.tr = None # becomes a dict of attributes when processing tags + self.td_th = None # becomes a dict of attributes when processing ', + width, + tag, + ) if tag == "img" and "src" in attrs: width = px2mm(int(attrs.get("width", 0))) height = px2mm(int(attrs.get("height", 0))) + if self.table_row: # => in a
/ tags + # "inserted" is a special attribute indicating that a cell has be inserted in self.table_row def handle_data(self, data): trailing_space_flag = TRAILING_SPACE.search(data) - if self.td is not None: # drawing a table? - self._insert_td(data) + if self.td_th is not None: + data = data.strip() + if not data: + return + align = self.td_th.get("align", self.tr.get("align")) + if align: + align = align.upper() + bgcolor = color_as_decimal( + self.td_th.get("bgcolor", self.tr.get("bgcolor", None)) + ) + colspan = int(self.td_th.get("colspan", "1")) + emphasis = 0 + if self.td_th.get("b"): + emphasis |= TextEmphasis.B + if self.td_th.get("i"): + emphasis |= TextEmphasis.I + if self.td_th.get("U"): + emphasis |= TextEmphasis.U + style = None + if bgcolor or emphasis: + style = FontStyle(emphasis=emphasis, fill_color=bgcolor) + self.table_row.cell(text=data, align=align, style=style, colspan=colspan) + self.td_th["inserted"] = True elif self.table is not None: # ignore anything else than td inside a table pass @@ -331,154 +337,6 @@ def handle_data(self, data): self.pdf.write(self.h, data) self.follows_fmt_tag = False - def _insert_td(self, data=""): - self._only_imgs_in_td = False - width = self._td_width() - height = int(self.td.get("height", 0)) // 4 or self.h * 1.30 - if not self.table_row_height: - self.table_row_height = height - elif self.table_row_height > height: - height = self.table_row_height - border = int(self.table.get("border", 0)) - if self.th: - self.set_style("B", True) - border = border or "B" - align = self.td.get("align", "C")[0].upper() - else: - align = self.td.get("align", "L")[0].upper() - border = border and "LR" - bgcolor = color_as_decimal(self.td.get("bgcolor", self.tr.get("bgcolor", ""))) - # parsing table header/footer (drawn later): - if self.thead is not None: - self.theader.append( - ( - dict( - w=width, - h=height, - txt=data, - border=border, - new_x=XPos.RIGHT, - new_y=YPos.TOP, - align=align, - ), - bgcolor, - ) - ) - if self.tfoot is not None: - self.tfooter.append( - ( - dict( - w=width, - h=height, - txt=data, - border=border, - new_x=XPos.RIGHT, - new_y=YPos.TOP, - align=align, - ), - bgcolor, - ) - ) - # check if reached end of page, add table footer and header: - if self.tfooter: - height += self.tfooter[0][0]["h"] - if self.pdf.y + height > self.pdf.page_break_trigger and not self.th: - self.output_table_footer() - self.pdf.add_page(same=True) - self.theader_out = self.tfooter_out = False - if self.tfoot is None and self.thead is None: - if not self.theader_out: - self.output_table_header() - self.box_shadow(width, height, bgcolor) - # self.pdf.x may have shifted due to inside : - self.pdf.set_x(self._td_x()) - LOGGER.debug( - "td cell x=%d width=%d height=%d border=%s align=%s '%s'", - self.pdf.x, - width, - height, - border, - align, - data.replace("\n", "\\n"), - ) - self.pdf.cell( - width, - height, - data, - border=border, - align=align, - new_x=XPos.RIGHT, - new_y=YPos.TOP, - ) - - def _td_x(self): - "Return the current table cell left side horizontal position" - prev_cells_total_width = sum( - self.width2unit(width) - for width in self.table_col_width[: self.table_col_index] - ) - return self.table_offset + prev_cells_total_width - - def _td_width(self): - "Return the current table cell width" - # pylint: disable=raise-missing-from - if "width" in self.td: - column_widths = [self.td["width"]] - elif "colspan" in self.td: - i = self.table_col_index - colspan = int(self.td["colspan"]) - column_widths = self.table_col_width[i : i + colspan] - else: - try: - column_widths = [self.table_col_width[self.table_col_index]] - except IndexError: - raise ValueError( - f"Width not specified for table column {self.table_col_index}," - " unable to continue" - ) - return sum(self.width2unit(width) for width in column_widths) - - def box_shadow(self, w, h, bgcolor): - LOGGER.debug("box_shadow w=%d h=%d bgcolor=%s", w, h, bgcolor) - if bgcolor: - fill_color = self.pdf.fill_color - self.pdf.set_fill_color(*bgcolor) - self.pdf.rect(self.pdf.x, self.pdf.y, w, h, "F") - self.pdf.set_fill_color(*fill_color.colors) - - def output_table_header(self): - if self.theader: - b = self.style.get("b") - self.pdf.set_x(self.table_offset) - self.set_style("b", True) - for celldict, bgcolor in self.theader: - self.box_shadow(celldict["w"], celldict["h"], bgcolor) - self.pdf.cell(**celldict) # includes the border - self.set_style("b", b) - self.pdf.ln(self.theader[0][0]["h"]) - self.pdf.set_x(self.table_offset) - # self.pdf.set_x(prev_x) - self.theader_out = True - - def output_table_footer(self): - if self.tfooter: - x = self.pdf.x - self.pdf.set_x(self.table_offset) - for celldict, bgcolor in self.tfooter: - self.box_shadow(celldict["w"], celldict["h"], bgcolor) - self.pdf.cell(**celldict) - self.pdf.ln(self.tfooter[0][0]["h"]) - self.pdf.set_x(x) - if self.table.get("border"): - self.output_table_sep() - self.tfooter_out = True - - def output_table_sep(self): - x1 = self.pdf.x - y1 = self.pdf.y - width = sum(self.width2unit(length) for length in self.table_col_width) - self.pdf.line(x1, y1, x1 + width, y1) - def handle_starttag(self, tag, attrs): attrs = dict(attrs) LOGGER.debug("STARTTAG %s %s", tag, attrs) @@ -494,7 +352,10 @@ def handle_starttag(self, tag, attrs): if tag == "em": tag = "i" if tag in ("b", "i", "u"): - self.set_style(tag, True) + if self.td_th is not None: + self.td_th[tag] = True + else: + self.set_style(tag, True) if tag == "a": self.href = attrs["href"] if tag == "br": @@ -562,72 +423,76 @@ def handle_starttag(self, tag, attrs): self.set_font() self.set_text_color(*self.font_color) if tag == "table": - self.table = {k.lower(): v for k, v in attrs.items()} - if "width" not in self.table: - self.table["width"] = "100%" - if self.table["width"][-1] == "%": - w = self.pdf.w - self.pdf.r_margin - self.pdf.l_margin - w *= int(self.table["width"][:-1]) / 100 - self.table_offset = (self.pdf.w - w) / 2 - self.table_col_width = [] - self.theader_out = self.tfooter_out = False - self.theader = [] - self.tfooter = [] - self.thead = None - self.tfoot = None + width = attrs.get("width") + if width: + if width[-1] == "%": + width = self.pdf.epw * int(width[:-1]) / 100 + else: + width = px2mm(int(width)) + if "border" in attrs: + borders_layout = ( + "ALL" if self.table_line_separators else "NO_HORIZONTAL_LINES" + ) + else: + borders_layout = ( + "HORIZONTAL_LINES" + if self.table_line_separators + else "SINGLE_TOP_LINE" + ) + self.table = Table( + self.pdf, + borders_layout=borders_layout, + line_height=self.h * 1.30, + width=width, + ) self.pdf.ln() if tag == "tr": - self.tr_index = 0 if self.tr_index is None else (self.tr_index + 1) self.tr = {k.lower(): v for k, v in attrs.items()} - self.table_col_index = 0 - self.table_row_height = 0 - self.pdf.set_x(self.table_offset) - # Adding an horizontal line separator between rows: - if self.table_line_separators and self.tr_index > 0: - self.output_table_sep() - if tag == "td": - self.td = {k.lower(): v for k, v in attrs.items()} - if "width" in self.td and self.table_col_index >= len(self.table_col_width): - assert self.table_col_index == len( - self.table_col_width - ), f"table_col_index={self.table_col_index} #table_col_width={len(self.table_col_width)}" - self.table_col_width.append(self.td["width"]) - if attrs: - self.align = attrs.get("align") - self._only_imgs_in_td = False - if tag == "th": - self.td = {k.lower(): v for k, v in attrs.items()} - self.th = True - if "width" in self.td and self.table_col_index >= len(self.table_col_width): - assert self.table_col_index == len( - self.table_col_width - ), f"table_col_index={self.table_col_index} #table_col_width={len(self.table_col_width)}" - self.table_col_width.append(self.td["width"]) - if tag == "thead": - self.thead = {} - if tag == "tfoot": - self.tfoot = {} + self.table_row = self.table.row() + if tag in ("td", "th"): + 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 + if "height" in attrs: + LOGGER.warning( + 'Ignoring unsupported height="%s" specified on a <%s>', + attrs["height"], + tag, + ) + if "width" in attrs: + width = attrs["width"] + # pylint: disable=protected-access + if len(self.table.rows) == 1: # => first table row + if width[-1] == "%": + width = width[:-1] + if not self.table._col_widths: + self.table._col_widths = [] + self.table._col_widths.append(int(width)) + else: + LOGGER.warning( + 'Ignoring width="%s" specified on a <%s> that is not in the first
+ if width or height: + LOGGER.warning( + 'Ignoring unsupported "width" / "height" set on element' + ) + if self.align: + LOGGER.warning("Ignoring unsupported alignment") + self.table_row.cell(img=attrs["src"], img_fill_width=True) + self.td_th["inserted"] = True + return if self.pdf.y + height > self.pdf.page_break_trigger: self.pdf.add_page(same=True) - y = self.pdf.get_y() - if self.table_col_index is not None: - self._only_imgs_in_td = True - # in a " " " " " - ' ' - ' ' + " " + " " " " " " "
: its width must not exceed the cell width: - td_width = self._td_width() - if not width or width > td_width: - if width: # Preserving image aspect ratio: - height *= td_width / width - width = td_width - x = self._td_x() - if self.align and self.align[0].upper() == "C": - x += (td_width - width) / 2 - else: - x = self.pdf.get_x() - if self.align and self.align[0].upper() == "C": - x = self.pdf.w / 2 - width / 2 + x, y = self.pdf.get_x(), self.pdf.get_y() + if self.align and self.align[0].upper() == "C": + x = self.pdf.w / 2 - width / 2 LOGGER.debug( 'image "%s" x=%d y=%d width=%d height=%d', attrs["src"], @@ -636,20 +501,10 @@ def handle_starttag(self, tag, attrs): width, height, ) - image_info = self.pdf.image( + info = self.pdf.image( self.image_map(attrs["src"]), x, y, width, height, link=self.href ) - width = image_info["rendered_width"] - height = image_info["rendered_height"] - self.pdf.set_x(x + width) - if self.table_col_index is not None: - # in a : we grow the cell height according to the image height: - if height > self.table_row_height: - self.table_row_height = height - else: - self.pdf.set_y(y + height) - if tag in ("b", "i", "u"): - self.set_style(tag, True) + self.pdf.set_y(y + info.rendered_height) if tag == "center": self.align = "Center" if tag == "toc": @@ -708,7 +563,8 @@ def handle_endtag(self, tag): if tag == "em": tag = "i" if tag in ("b", "i", "u"): - self.set_style(tag, False) + if not self.td_th is not None: + self.set_style(tag, False) self.follows_fmt_tag = True if tag == "a": self.href = "" @@ -720,37 +576,21 @@ def handle_endtag(self, tag): self.indent -= 1 self.bullet.pop() if tag == "table": - if not self.tfooter_out: - self.output_table_footer() + self.table.render() self.table = None - self.th = False - self.theader = None - self.tfooter = None self.pdf.ln(self.h) - self.tr_index = None - if tag == "thead": - self.thead = None - self.tr_index = None - if tag == "tfoot": - self.tfoot = None - self.tr_index = None - if tag == "tbody": - self.tbody = None - self.tr_index = None if tag == "tr": - if self.tfoot is None: - self.pdf.ln(self.table_row_height) - self.table_col_index = None self.tr = None + self.table_row = None if tag in ("td", "th"): - if self.th: - LOGGER.debug("revert style") - self.set_style("b", False) # revert style - elif self._only_imgs_in_td: - self._insert_td() - self.table_col_index += int(self.td.get("colspan", "1")) - self.td = None - self.th = False + if "inserted" not in self.td_th: + # handle_data() was not called => we call it to produce an empty cell: + bgcolor = color_as_decimal( + self.td_th.get("bgcolor", self.tr.get("bgcolor", None)) + ) + style = FontStyle(fill_color=bgcolor) if bgcolor else None + self.table_row.cell(text="", style=style) + self.td_th = None if tag == "font": # recover last font state face, size, color = self.font_stack.pop() diff --git a/fpdf/image_parsing.py b/fpdf/image_parsing.py index 0c5087968..3a0f6d5f8 100644 --- a/fpdf/image_parsing.py +++ b/fpdf/image_parsing.py @@ -59,7 +59,7 @@ def load_image(filename): """ This method is used to load external resources, such as images. - It is automatically called when resource added to document by `FPDF.image()`. + It is automatically called when resource added to document by `fpdf.FPDF.image()`. It always return a BytesIO buffer. """ # if a bytesio instance is passed in, use it as is. diff --git a/fpdf/output.py b/fpdf/output.py index 82221e6d0..571c0a6e4 100644 --- a/fpdf/output.py +++ b/fpdf/output.py @@ -580,6 +580,7 @@ def _add_fonts(self): glyph_names = [ cmap[unicode] for unicode in uni_to_new_code_char if unicode in cmap ] + print(glyph_names) missing_glyphs = [ chr(unicode) diff --git a/fpdf/table.py b/fpdf/table.py new file mode 100644 index 000000000..0c77ff2be --- /dev/null +++ b/fpdf/table.py @@ -0,0 +1,346 @@ +from dataclasses import dataclass +from numbers import Number +from typing import List, Union + +from .enums import Align, TableBordersLayout, TableCellFillMode +from .fonts import FontStyle + + +DEFAULT_HEADINGS_STYLE = FontStyle(emphasis="BOLD") + + +class Table: + """ + Object that `fpdf.FPDF.table()` yields, used to build a table in the document. + Detailed usage documentation: https://pyfpdf.github.io/fpdf2/Tables.html + """ + + def __init__( + self, + fpdf, + rows=(), + *, + align="CENTER", + borders_layout=TableBordersLayout.ALL, + cell_fill_color=None, + cell_fill_mode=TableCellFillMode.NONE, + col_widths=None, + first_row_as_headings=True, + headings_style=DEFAULT_HEADINGS_STYLE, + line_height=None, + markdown=False, + text_align="JUSTIFY", + width=None, + ): + """ + Args: + fpdf (fpdf.FPDF): FPDF current instance + rows: optional. Sequence of rows (iterable) of str to initiate the table cells with text content + align (str, fpdf.enums.Align): optional, default to CENTER. Sets the table horizontal position relative to the page, + when it's not using the full page width + borders_layout (str, fpdf.enums.TableBordersLayout): optional, default to ALL. Control what cell borders are drawn + cell_fill_color (int, tuple, fpdf.drawing.DeviceGray, fpdf.drawing.DeviceRGB): optional. + Defines the cells background color + cell_fill_mode (str, fpdf.enums.TableCellFillMode): optional. Defines which cells are filled with color in the background + col_widths (int, tuple): optional. Sets column width. Can be a single number or a sequence of numbers + first_row_as_headings (bool): optional, default to True. If False, the first row of the table + is not styled differently from the others + headings_style (fpdf.fonts.FontStyle): optional, default to bold. + Defines the visual style of the top headings row: size, color, emphasis... + line_height (number): optional. Defines how much vertical space a line of text will occupy + markdown (bool): optional, default to False. Enable markdown interpretation of cells textual content + text_align (str, fpdf.enums.Align): optional, default to JUSTIFY. Control text alignment inside cells. + width (number): optional. Sets the table width + """ + self._fpdf = fpdf + self._align = align + self._borders_layout = TableBordersLayout.coerce(borders_layout) + self._cell_fill_color = cell_fill_color + self._cell_fill_mode = TableCellFillMode.coerce(cell_fill_mode) + self._col_widths = col_widths + self._first_row_as_headings = first_row_as_headings + self._headings_style = headings_style + self._line_height = 2 * fpdf.font_size if line_height is None else line_height + self._markdown = markdown + self._text_align = text_align + self._width = fpdf.epw if width is None else width + self.rows = [] + for row in rows: + self.row(row) + + def row(self, cells=()): + "Adds a row to the table. Yields a `Row` object." + row = Row() + self.rows.append(row) + for cell in cells: + row.cell(cell) + return row + + def render(self): + "This is an internal method called by `fpdf.FPDF.table()` once the table is finished" + if self._width > self._fpdf.epw: + raise ValueError( + f"Invalid value provided .width={self._width}: effective page width is {self._fpdf.epw}" + ) + table_align = Align.coerce(self._align) + if table_align == Align.J: + raise ValueError("JUSTIFY is an invalid value for table .align") + prev_l_margin = self._fpdf.l_margin + if table_align == Align.C: + self._fpdf.l_margin = (self._fpdf.w - self._width) / 2 + self._fpdf.x = self._fpdf.l_margin + elif table_align == Align.R: + self._fpdf.l_margin = self._fpdf.w - self._width + self._fpdf.x = self._fpdf.l_margin + elif self._fpdf.x != self._fpdf.l_margin: + self._fpdf.l_margin = self._fpdf.x + for i in range(len(self.rows)): + with self._fpdf.offset_rendering() as test: + self._render_table_row(i) + if test.page_break_triggered: + # pylint: disable=protected-access + self._fpdf._perform_page_break() + if self._first_row_as_headings: # repeat headings on top: + self._render_table_row(0) + self._render_table_row(i) + self._fpdf.l_margin = prev_l_margin + self._fpdf.x = self._fpdf.l_margin + + def get_cell_border(self, i, j): + """ + Defines which cell borders should be drawn. + Returns a string containing some or all of the letters L/R/T/B, + to be passed to `fpdf.FPDF.multi_cell()`. + Can be overriden to customize this logic + """ + if self._borders_layout == TableBordersLayout.ALL: + return 1 + if self._borders_layout == TableBordersLayout.NONE: + return 0 + columns_count = max(row.cols_count for row in self.rows) + rows_count = len(self.rows) + border = list("LRTB") + if self._borders_layout == TableBordersLayout.INTERNAL: + if i == 0 and "T" in border: + border.remove("T") + if i == rows_count - 1 and "B" in border: + border.remove("B") + if j == 0 and "L" in border: + border.remove("L") + if j == columns_count - 1 and "R" in border: + border.remove("R") + if self._borders_layout == TableBordersLayout.MINIMAL: + if (i != 1 or rows_count == 1) and "T" in border: + border.remove("T") + if i != 0 and "B" in border: + border.remove("B") + if j == 0 and "L" in border: + border.remove("L") + if j == columns_count - 1 and "R" in border: + border.remove("R") + if self._borders_layout == TableBordersLayout.NO_HORIZONTAL_LINES: + if i not in (0, 1) and "T" in border: + border.remove("T") + if i not in (0, rows_count - 1) and "B" in border: + border.remove("B") + if self._borders_layout == TableBordersLayout.HORIZONTAL_LINES: + if rows_count == 1: + return 0 + border = list("TB") + if i == 0 and "T" in border: + border.remove("T") + if i == rows_count - 1 and "B" in border: + border.remove("B") + if self._borders_layout == TableBordersLayout.SINGLE_TOP_LINE: + if rows_count == 1: + return 0 + border = list("TB") + if i != 1 and "T" in border: + border.remove("T") + if i != 0 and "B" in border: + border.remove("B") + return "".join(border) + + 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) + j = 0 + while j < len(row.cells): + cell_line_height = row_height / len(lines_heights_per_cell[j]) + self._render_table_cell( + i, + j, + cell_line_height=cell_line_height, + row_height=row_height, + fill=fill, + **kwargs, + ) + j += row.cells[j].colspan + self._fpdf.ln(row_height) + + # pylint: disable=inconsistent-return-statements + def _render_table_cell( + self, + i, + j, + cell_line_height, + row_height, + fill=False, + lines_heights_only=False, + **kwargs, + ): + """ + If `lines_heights_only` is True, returns a list of lines (subcells) heights. + """ + row = self.rows[i] + cell = row.cells[j] + col_width = self._get_col_width(i, j, cell.colspan) + lines_heights = [] + if cell.img: + if lines_heights_only: + info = self._fpdf.preload_image(cell.img)[2] + img_ratio = info.width / info.height + if cell.img_fill_width or row_height * img_ratio > col_width: + img_height = col_width / img_ratio + else: + img_height = row_height + lines_heights += [img_height] + else: + x, y = self._fpdf.x, self._fpdf.y + self._fpdf.image( + cell.img, + w=col_width, + h=0 if cell.img_fill_width else row_height, + keep_aspect_ratio=True, + ) + self._fpdf.set_xy(x, y) + text_align = cell.align or self._text_align + if not isinstance(text_align, (Align, str)): + text_align = text_align[j] + style = cell.style + if not style and i == 0 and self._first_row_as_headings: + style = self._headings_style + if lines_heights_only and style: + style = style.replace(emphasis=None) + if style and style.fill_color: + fill = True + elif ( + not fill + and self._cell_fill_color + and self._cell_fill_mode != TableCellFillMode.NONE + ): + if self._cell_fill_mode == TableCellFillMode.ALL: + fill = True + elif self._cell_fill_mode == TableCellFillMode.ROWS: + fill = bool(i % 2) + elif self._cell_fill_mode == TableCellFillMode.COLUMNS: + fill = bool(j % 2) + if fill and self._cell_fill_color and not (style and style.fill_color): + style = ( + style.replace(fill_color=self._cell_fill_color) + if style + else FontStyle(fill_color=self._cell_fill_color) + ) + with self._fpdf.use_font_style(style): + lines = self._fpdf.multi_cell( + w=col_width, + h=row_height, + txt=cell.text, + max_line_height=cell_line_height, + border=self.get_cell_border(i, j), + align=text_align, + new_x="RIGHT", + new_y="TOP", + fill=fill, + split_only=lines_heights_only, + markdown=self._markdown, + **kwargs, + ) + if lines_heights_only and not cell.img: + lines_heights += (len(lines) or 1) * [self._line_height] + if lines_heights_only: + return lines_heights + + def _get_col_width(self, i, j, colspan=1): + if not self._col_widths: + cols_count = self.rows[i].cols_count + return colspan * (self._width / cols_count) + if isinstance(self._col_widths, Number): + return colspan * self._col_widths + if j >= len(self._col_widths): + raise ValueError( + f"Invalid .col_widths specified: missing width for table() column {j + 1} on row {i + 1}" + ) + # pylint: disable=unsubscriptable-object + col_width = 0 + for k in range(j, j + colspan): + col_ratio = self._col_widths[k] / sum(self._col_widths) + col_width += col_ratio * self._width + return col_width + + def _get_lines_heights_per_cell(self, i) -> List[List[int]]: + row = self.rows[i] + lines_heights = [] + for j in range(len(row.cells)): + lines_heights.append( + self._render_table_cell( + i, + j, + cell_line_height=self._line_height, + row_height=self._line_height, + lines_heights_only=True, + ) + ) + return lines_heights + + +class Row: + "Object that `Table.row()` yields, used to build a row in a table" + + def __init__(self): + self.cells = [] + + @property + def cols_count(self): + return sum(cell.colspan for cell in self.cells) + + def cell( + self, text="", align=None, style=None, img=None, img_fill_width=False, colspan=1 + ): + """ + Adds a cell to the row. + + Args: + text (str): string content, can contain several lines. + In that case, the row height will grow proportionally. + align (str, fpdf.enums.Align): optional text alignment. + style (fpdf.fonts.FontStyle): optional text style. + img: optional. Either a string representing a file path to an image, + an URL to an image, an io.BytesIO, or a instance of `PIL.Image.Image`. + img_fill_width (bool): optional, defaults to False. Indicates to render the image + using the full width of the current table column. + colspan (int): optional number of columns this cell should span. + """ + if text and img: + raise NotImplementedError( + "fpdf2 currently does not support inserting text with an image in the same table cell." + "Pull Requests are welcome to implement this 😊" + ) + cell = Cell(text, align, style, img, img_fill_width, colspan) + self.cells.append(cell) + return cell + + +@dataclass +class Cell: + "Internal representation of a table cell" + text: str + align: Union[str, Align] + style: FontStyle + img: str + img_fill_width: bool + colspan: int + + def write(self, text, align=None): + raise NotImplementedError("Not implemented yet") diff --git a/fpdf/util.py b/fpdf/util.py index d5aca6e3d..7f916e02b 100644 --- a/fpdf/util.py +++ b/fpdf/util.py @@ -97,11 +97,11 @@ def get_mem_usage(prefix) -> str: # heap_size, stack_size = get_process_heap_and_stack_sizes() # objs_size_sum = get_gc_managed_objs_total_size() pillow = get_pillow_allocated_memory() + # malloc_stats = "Malloc stats: " + get_pymalloc_allocated_over_total_size() + malloc_stats = "" if is_tracing(): - malloc_stats = get_tracemalloc_traced_memory() - else: - malloc_stats = get_pymalloc_allocated_over_total_size() - return f"{prefix:<40} Malloc stats: {malloc_stats} | Pillow: {pillow} | Process RSS: {rss}" + malloc_stats = "Malloc stats: " + get_tracemalloc_traced_memory() + return f"{prefix:<40} {malloc_stats} | Pillow: {pillow} | Process RSS: {rss}" def get_process_rss() -> str: @@ -122,7 +122,7 @@ def get_process_rss_as_mib() -> Union[Number, None]: / 1024 / 1024 ) - except FileNotFoundError: # This file only exists under Linux + except FileNotFoundError: # /proc files only exist under Linux return None diff --git a/setup.cfg b/setup.cfg index 2a552e6fb..81bb971fb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -16,3 +16,5 @@ ignore = E203, E221, E241, E251, E701, E731, W503 [tool:pytest] addopts = --cov=fpdf --cov-report=xml +log_cli = 1 +log_cli_level= WARN diff --git a/test/conftest.py b/test/conftest.py index 7166bbcc7..89d78ca84 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -21,7 +21,6 @@ from fpdf.util import get_process_rss_as_mib, print_mem_usage from fpdf.template import Template - QPDF_AVAILABLE = bool(shutil.which("qpdf")) if not QPDF_AVAILABLE: warnings.warn( @@ -262,13 +261,20 @@ def handler(_, __): def ensure_rss_memory_below(max_in_mib): + """ + Enure there is no unexpected / significant increase between + the process RSS memory BEFORE executing the test, and AFTER. + """ + def actual_decorator(test_func): @functools.wraps(test_func) def wrapper(*args, **kwargs): + start_rss_in_mib = get_process_rss_as_mib() test_func(*args, **kwargs) - rss_in_mib = get_process_rss_as_mib() - if rss_in_mib: - assert rss_in_mib < max_in_mib + if not start_rss_in_mib: + return # not available under Windows + end_rss_in_mib = get_process_rss_as_mib() + assert (end_rss_in_mib - start_rss_in_mib) < max_in_mib return wrapper @@ -279,9 +285,9 @@ def wrapper(*args, **kwargs): # so we require an opt-in through a CLI argument: def pytest_addoption(parser): parser.addoption( - "--final-memory-usage", + "--trace-memory-usage", action="store_true", - help="At the end of the tests execution, display the current memory usage", + help="Trace the memory usage during tests execution", ) parser.addoption( "--pympler-summary", @@ -295,15 +301,26 @@ def pytest_addoption(parser): ) +@pytest.fixture(scope="module", autouse=True) +def module_memory_usage(request): + if request.config.getoption("trace_memory_usage"): + gc.collect() + capmanager = request.config.pluginmanager.getplugin("capturemanager") + with capmanager.global_and_fixture_disabled(): + print("\n") + print_mem_usage("Memory usage:") + yield + + @pytest.fixture(scope="session", autouse=True) def final_memory_usage(request): yield - if request.config.getoption("final_memory_usage"): + if request.config.getoption("trace_memory_usage"): gc.collect() capmanager = request.config.pluginmanager.getplugin("capturemanager") with capmanager.global_and_fixture_disabled(): print("\n") - print_mem_usage("Final memory usage:") + print_mem_usage("Memory usage:") @pytest.fixture(scope="session", autouse=True) diff --git a/test/embed_file_all_optionals.pdf b/test/embed_file_all_optionals.pdf index fe49a5dda583724214c9a87deb7c8f4d560beb04..07cb03370d252f8a0fffc98d9524bd0a04c438a6 100644 GIT binary patch delta 413 zcmbQmwVHcFB9pk0fhCuIKw?p1Zn1)mjec-uRjPuCq0!`x%$k$uGwCT9n3$MaBw3mp z8YP)prluJinOPVZnI$Er7+M$_CYzZ~e#@j%zjeaiJZ43Kmg;#)OIM#ik*Rdo_zCYK zkw0trOAaKJ9engQS$w&O=j^Oy61B!s*~7IOS`{QJ>;9lFbsae|=X>i*M$@Bo>ua6s4wd85)`xaH*=g`nz!f00Q)wU;qFB delta 267 zcmZ3@J&S8YB9o|@IhTGwVo_plv4V|_esE@0s)D)sWJeaw$qSkE6wK0$P0UgZlamZA zOcD)~EfSMb(~=BRO)U(~ER0MOjV8ZmQgJjr=E&Dzz`=6By8dIJZVu1J)~F4g`>%WZ z8*iPF5tQ4i-^A%8p0USQw_a$Y<&EokS?%_o-&4c`7R(oJwo9ENb7}J)IvcyXS~yxbnVCAexS1N77+RWIx>-8f h*$`9_%VlTBRa}x-R8motn#N^mX~w0h>gw;t1pvd?PZ9tC diff --git a/test/embed_file_self.pdf b/test/embed_file_self.pdf index 58cf94515af6c2306b76a484fb0481c0fe44f94e..f8cc77914e383d1f8218764f5a998e0665c1046f 100644 GIT binary patch delta 513 zcmbu4%}T>S6ooNvbbJ8C)rHb!JDIjINi79y+m%qkrF1b#Zky01GiGk85y6M(iwJ!W z-@>A47oAbn& z0u2{}eReaV^QGJx;6$=B`w=B@86Z*qY^=kr17UYuuwMlkus351 zAv)`)?c=FGXrH>a>x_i&`(E1{+JloL-x-`ZEpI5=<9_eYiz(~(nIW0eO^!1rgzK<+ IeKZ-f7s_s@IsgCw delta 173 zcmX@d{fA?NA(N=NIhTGwVo_plv4V|_esE@0s)D)sWDh1ij?}!A)Z)yt)X9gLEjF{V zNHR(om>U`>7=VC6o&pz`VPIemRBpy<9pmh3XzJo`4ogG(kNn%k+MNw)RmxZwfm#V6(zZ(|-lCdlw diff --git a/test/file_attachment_annotation.pdf b/test/file_attachment_annotation.pdf index 171f910cbd4bd4cfa13a981f976ee516fd7eef6a..10cde01011da2489faaddf854831623166ac3cb4 100644 GIT binary patch delta 513 zcmbu4%}T>S6os+6ad5A=x=;#k+UZPVo7Pf@ZCwc!TuPBia@&M9nQ>+kjT@gq`V{U2 zpU0PQ>B=aI_yaCHtHa@PzI*P-^Va=iW!qt#&=a9WVxZrrr|~sHnXR5GjhiY2BEhA! zbyb}C!r&Bo5K1(VN(+}#FCfeitc1u~WqOp(V;g0DBajKr<5U!4QBN?kf~s(4rAp^C zHYP(u86%(F1k(^roFkb>(pVGdSXqFQukj*_HHP39KYr=`M*S!aF{kgI`b+84L>P;j z8nl^esG@qzJ47l>gS;GPBbfqx$4$O&|2J>7x9)CQ;b%)xG9S*@ch`0pXI*H%3Q{0% zrpdV5UfpgSOqu7njyv{7Ubo%$`2KJ_WS%?Xp3A+~;fN3Ve_l+rqY`KRLm delta 174 zcmeyxvyyAWT_#a;b1waW#G=I9Vg(x;{ou^1R0VVM$zPcCI8yUcQj0UoQYYuLSZvuH q25u(Kj;6+THUw3~a@pB&6_+Fyl~fd^rg0e>7#eV?s=E5SaRC6}FD^#_ diff --git a/test/fonts/test_set_font.py b/test/fonts/test_set_font.py index 7044bdc4e..fa9d34834 100644 --- a/test/fonts/test_set_font.py +++ b/test/fonts/test_set_font.py @@ -5,7 +5,7 @@ from fpdf import FPDF from fpdf.errors import FPDFException -from fpdf.fonts import fpdf_charwidths +from fpdf.fonts import CORE_FONTS_CHARWIDTHS from test.conftest import assert_pdf_equal HERE = Path(__file__).resolve().parent @@ -105,7 +105,7 @@ def test_set_font_core_font_attributes(): "name": "Courier", "up": -100, "ut": 50, - "cw": fpdf_charwidths["courier"], + "cw": CORE_FONTS_CHARWIDTHS["courier"], "fontkey": "courier", "emphasis": 0, } @@ -115,7 +115,7 @@ def test_set_font_core_font_attributes(): "name": "Times-Roman", "up": -100, "ut": 50, - "cw": fpdf_charwidths["times"], + "cw": CORE_FONTS_CHARWIDTHS["times"], "fontkey": "times", "emphasis": 0, } diff --git a/test/html/bgcolor_in_table.pdf b/test/html/bgcolor_in_table.pdf deleted file mode 100644 index 2c061fbea44931dce9a16b009a95abb2eb3feb5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 zcmY!laBHDUpWF|W0 zS13dq07XnKP4$c{6f8^(^(-ubvLTfPsS5f5iRr1uTy}O`sd*_NmCPSDKRpGytU4C$TcWv_wJQKQGleKc_S|4pMZCcK4bS9|pWk-N`7-BTd6MYFbTejtb=~(k^&f`aEvG(O z{Em6_c)LWQ(jt!3*4afjyyEizE?<$Nx5UZLzr|;x+Z@$J8ho$Cwm&eg)Z1kFKGkWd zMtH?{*K(J;)loJ(j?xR0Hg?=Bl zW?!vi3ganZ+@QncV(|UstFrgMyR9rc=DXXkx-VpCASZp+!snR56Eoe!m2X4&{abFm zIl&%qMYiz9xt2>ECpAu=)YzZ1DdeHhoK(L{5A1gQdaBdOK;@3WmJ)YcUtyX@!jP-R@NZal8AJy-~gshX^Rr_A-{D*qR-S(QlKuH%Gq0mHZ zij*3h5{pya@`33|KO{3ZwOBVOKQ|GWN?r4S=^`^PT|qxQGtV)vI1?tor5{|HR07T$ zpd13sRFI4UG6N~Wnc=a*DL*HLavRL?*x(7wPnpS-+X2c_@N5GLBpVxjH$w$b_yIGo zn~?&@n;@340?0W*z^tPmP?Vn>oLZs~tq&}UfT5aN0SsHuTws25g3``V+A|g@z$}rh zat7u;P_g0y%%BPyE>?z?W|oFV#)gKL20##HXsK>spstCexuPgFjmtp6(0~i100I=u zOihhV719(CVn91UKp_tyW(o8GnwX&_raB{YOfd@sU^t-ZwKM>hG^k>R1_r=F6HUwz zia%*@Hc)xyx(!ou9#$#;FaS9Gk0X#Dv4FokWtK8HY;LEBB+ zIp?=+XAv;kag;+zas`j_(Zp>H{bD|x{-t&CSC?kas$ul~x7%@keZsc~p>2oGHwa#y z!c-RDF^TDwDoduTzi({FXv%y~`}N)NRg|Q+RuCsPyzLzMWZoZ?f3W(|fl0_pZHm z;l{EP-&IULNXnks_S411a$VPMolnPZJW4%3$HdvE;lhrk(;bZN*1cTE{p02=7X#Or zowJ!H=Juc7{C9ExZk|+cfuL;@rM4wbQaty_%zW9M=NAn(=lhCyDQ~>`#nL)U?UB-| z`jj*OgKkvXgj_#x_TEo_acYg@9%{r{%JmYvSU(V+p50^SfGQSI2@BZ5+OY4;C zB$H?T-*1)|wC3!(Fi-x%L#Jx9!)uRE?)~w?*!*-L%=;bOi zKBea=H3-(^KG&YCUgy*jl%K5BDp-?z*14&FX}O``VUB&eZ)TeYv&#AI>Frcu`|>R{ z@0DgO=ldk3cE-Q+^rzoDwEtGrgE^B8*n8?t3{kR3>jYnaCP$vO_kX(No(82^&EG3! zIPg>P&Inj2L}xUvIVjLx&TRZc^3oea0TZ)$JXy&f9GrH=>(2fJ5FtEosytYv8_Jd zyy<|YNqVCg3+r;d{3X0R$rjum0wQyE-7V7RIKkJhtjxhx7hV75wx7WYi#wfbfSUGY z{L+!Ix%{-}-S<KJU?-Z^7_Rbhhi}2OI`G^_B*v3I-sckf*=}W*8V+T9~1W85vnx zVu%@A7-EQ-8e!@+!y;yG1h%&x*fr+Vs5t1N8%nZ{K6LVu^%@B1KrWhe;Vrg!SZl0-uC5B^64Vf&ACijck#+o|2 z8Jikgy16)-nL0U|m>D{nI6AwUo0^!qI=LCTn%dbAR1phF&51=N6-B9OT&6}QCS0nj IuKsRZ02P^OL;wH) delta 1565 zcmdm_w^DC|J4?N>5tp4ES8+*EYGN)|#hkriw}WmQh}1mSK9~G^(JQ^z6SKLE4K8Qa z9XQg)@kXL&;Zx^d`=<(@o-|o_(o3J&%WqVd74O;Yb?D)%4x!Ws&o7?j*%xDwFeiX( zv$e(iwfUL}IYr(Ehl~s)RoxD)Y4GR!BsK5Wr*)aH_q;yEwChv2d%fM^H;ExLx$K!$ z4;ArU*`Mg9o$+4LOWN&8R8?SDDD(DE9aN@~tilM^rBopndR_j~5Cg*7)zx;Ncj@2$HrX?~u}ssp8|d&9$`{dV+i>NyY+ zk>4kq)MPeELpt;)-&KpU6}I)WA! z#s}TQ%a}hJZS0O{c5&kOLYIDRR4Yd zp4&`1lMmL<&52fU)W22JS#f>~@4E<~0qb-7O51<#H)*!#(Tr!R*N%NCz?gXKlj2+N z2dB+-?2c7_=m4=-Uwedm8^t{~^>CQqK1@hXnv! zU=LUl@ItC0=hqa@y5LOSD%Nw+CdVZ+S94wx)4lp}OZNU-%XUp-Rp(p%hpSJ}%jR#4 z88fp)^DCALHjR(LQR~Zj7BKA+7LZtQdN0`Sa|4P+PaGd zPMyy)gXKOlpX%JdbMs3M1D<*dQws$H5Kzcd-~uxY3@wc<(Z!66EDbQkjLnTO#7qs% zF~rQUh?yIjfz(ZYA<9#4WPwG2rJ*UhLB%*4bH!&4?Emc~Hy z>QQ`eVuopniMbJ`W(yOr50FF7#L~<`pLa-EN3AePJ$7P3f@(g) zQ~xQ9iXVTuG+o%moa^ph{{3lRg0=Ap#<-f_g_6OW_hHz{02k(xX8-^I delta 383 zcmaFDd7g8FJ!8G0r74%49anKlQEFl?SH+yY6L#}4DGIn&?|(GyR*%5}hP9ny+di@H z+V?0b$L!Mq*$Hxe#Xcqi`I=yXcyt-)TC-*s&zbrM&)#I6~9+|F$6AEdPO=(e5Te5dNUMv780}@=|F8byW>uzFjCLkw3I-sckf*=}W*8WlnV4dTnVT46 zh*_8zO!j55j&X6burRkYGj?<~a5i%?HFI_}H!`zyHg$EhurxF=cD1u1s3H~;wuwb0 T6-B9OT$TogT&k+B{%%|VMOBSD diff --git a/test/html/html_table_line_separators_issue_137.pdf b/test/html/html_table_line_separators_issue_137.pdf index d278ad893969eecb0c994dc5c198cfd9f8fafd4a..647fe738a93cf4e598cc27402ff94efc821eb366 100644 GIT binary patch delta 402 zcmX@k`G|9aJ!8F*p$V6r9anKlQEFl?SH+yE6Zi5RGT>?XZrAD_;q&OvdJlsQlf+kC zQEEBW#InaO*O@s}E6Oe2&aync$@yS_WQABX|7=@!zY`Kagx}Om(3p5)Q9!~@2i1pM zi6-Y3OuleH@YwsH1sf0FVeS;_%sCo8gDEO{j`kED9pxuNHLR;si(|vS_O3q|zv$~v zlh0{xEtjO`{@|OUHSt9G5f{sgQNm%1$|{w98DCtn#~{jSU?onp(QLxEZ)O8JidxI$5|l mxfq+d85)^7+Sw3P5eo_K#G;alqSQ1lOCtj=RaIAiH!c8^CX}!M delta 375 zcmaFFd7N{DJ!8G0g*lg<9anKlQEFl?SH+yE{g!-(9C%!R&v`UGAR+BdWVDJ##!PM( zC60v`T$tARJDE8~xTN0P^#5~mjpvjZfuGnW?^hJ*_*{W z#?Zjn#l_gf(9zh^%-qP)(!kZy#l_Ot*~Hk{+||k4)y{^XidaaPCKi=c6s4wdSy&o# Lsj9mAyKw;k!G4D+ diff --git a/test/html/html_table_with_border.pdf b/test/html/html_table_with_border.pdf index 89a8d12f46933e92a5bb9b98839c0fafc47b35b6..ad7cbe0dcb655aa23b5a10ced0f875da79f7c265 100644 GIT binary patch delta 499 zcmbQsb%<+&J!8GGfhCun9anKlQEFl?SH+yEllBHN8}hXLwrTasXsJ()Kg}bu<&N}$ z*7=?qMl&CNEmTv#y-Aqo>8oqsmfto0uqE&Xb4~uc^c~e#5=6CFKa0sd`+TBfVrPb} zOYTMM8;2v?9{3fppTAIZJ*8k)#C)EjNwRlEUq6_nn5Zf^S-mQxp6^-sj+?r-AM2i( zFIm0gq{Na^i|h*>sZUg_e_4Mr+pD}#QhvgUxaX-qt@PUe>zcG>%Fg3ZkJeXFzj^Wg zMDbU$oM!_Mcz!AVQBnPW?Sf@rLZkjapTCHAR_RWqy;-KOX4J_g>74a={P?lj?TiR+ z7GJr=YbAM%d(QVCo<8}J0FR!lW^NYSX&$ADca3UU!3l>~X}4PxoeZc7XuMyZ%YXg- z^p#JhR2}QNV7*F?t2w`V$G;{Y)8%)9)7tI@ehrZ5kgQ|q|D}0;a~#tvMmsYD1p^RJ z$W!0~GYkyOO)W9REKJQY#4JrsCbzLz$2vQk7#f8Q|nmDiU8JKEV0R1ph_&cvdUilWpsE<*!DQ!Z6iSARDy0Qm63<^TWy delta 462 zcmX@aHJ59HJ!8F*xiOcW9anKlQEFl?SH+yYfxG>V7zn)iEE?@}Fsb@&=^Z6U$L{|O zMK&ewf^(0&Pu9M7#H?IX^Z3l;=Z+lsyx>CR4@o(tJNB6htzM2c2a;pvow>ifK6R$x z$;R(ub6I`GZXT3v^_ihw(Wv5i|Cr0ho>NXW&9fhuSloB|bE@iWJ)5%t^I=Bc7rZ^6 zPsCX7@w@*#Q;gqRZFO1yhBt;L;b-Q*mwzoOerj6UlT9x<#ZELD+o%QajNxDn?@95J z`pOYk>3OyG;|L2sSkE_mVJ4va@)n%Y32&A2YHKH>m2R=F#V0b zSh~51=@p}$k%@u<2q@$!aDf>H2IfY_7-AMih8SX&h8B}ou~^3#I61poI2&0wxfnW| xnHe}68W=dbni`uMm>3utnYozS*$`9_3yG@4qLPZD)HE(jb4xB&RabvEE&!8cusQ$$ diff --git a/test/html/html_table_with_empty_cell_contents.pdf b/test/html/html_table_with_empty_cell_contents.pdf index efe61273cd75a7e5709690b3d803c034f4bea690..c15be1ba688365756966393f10bd7af01cc78eae 100644 GIT binary patch delta 454 zcmZqRn##4ofwA7ql*`VJtGJ{nH8Gc~V$RY@zIn`wJgwg?Tc^K0#@fuAqpjMVcbfN> zXZ@6yN?li8moI7T^qe(C%RBi^|MvN$gss-J)k5N>*(G zHk;Z7*9a^Nc`a*m*u+@0aF?)TZ~Gsv^4*EmJKF#3eDg>6@;ll3gVs(~PX*XTE-sk< z@U_94|Ls}f{Rfn0+~GXsec(#Qt@=HC|W(w%avuC95JJUw)~o?Y3}!dKfp3VV8km*y!Q)x0aSvNc#I%ThIntHgPU zSV-Z1*Qp+wA@NJrNt^zc>Xz6kvhwsV>-o0-*DCG!9Aj{EbIc!xa-&bRn;n^6GTNIN znkg87fI^-E7nosSU~XuNA!cD{j3H)eXfQdG#X82s*vQz#z{T9e+}P2=%-O}<)WFQu p$<^4*#LU&g#N5)(hMW7%*1(|7NY4D#^yFZp^=#Q67=7_HB*C)S+O zvu!^6Nyv-8Y~{Cv=~16M|37RwcEKX>e6O(AM|Slvr`UY&6@C^+mI-SwvAXEAN|^6c zwz|sYX~LzJdQa;%D&5ij#%;}ZP}TADgL8913+n!1{s7#f+o8km_o8`;?qR1ph_j>Mvp TilWpsE=yAbE>%@me>W}w%O;>6 diff --git a/test/html/test_html_whitespace_handling.pdf b/test/html/html_whitespace_handling.pdf similarity index 100% rename from test/html/test_html_whitespace_handling.pdf rename to test/html/html_whitespace_handling.pdf diff --git a/test/html/test_html.py b/test/html/test_html.py index fb4fac153..062897613 100644 --- a/test/html/test_html.py +++ b/test/html/test_html.py @@ -26,7 +26,7 @@ def test_html_images(tmp_path): f"
" ) # Unable to text position of the image as write html moves to a new line after - # adding the image but it can be seen in the produce test.pdf file. + # adding the image but it can be seen in the resulting html_images.pdf file. assert round(pdf.get_x()) == 10 assert pdf.get_y() == pytest.approx(mm_after_image, abs=0.01) @@ -83,8 +83,8 @@ def test_html_features(tmp_path): "
idnameidname
" @@ -110,8 +110,8 @@ def test_html_features(tmp_path): " " " " " " - ' id' - ' name' + " id" + " name" " " " " "" @@ -160,7 +160,7 @@ def getrow(i): " " " " " " - ' Alice' + ' Alice' " " ) + "".join(getrow(i) for i in range(26)) @@ -175,73 +175,6 @@ def getrow(i): assert_pdf_equal(pdf, HERE / "html_features.pdf", tmp_path) -def test_html_simple_table(tmp_path): - pdf = FPDF() - pdf.set_font_size(30) - pdf.add_page() - pdf.write_html( - """ - - - - - -
leftcenterright
123
456
""" - ) - assert_pdf_equal(pdf, HERE / "html_simple_table.pdf", tmp_path) - - -def test_html_table_line_separators(tmp_path): - pdf = FPDF() - pdf.set_font_size(30) - pdf.add_page() - pdf.write_html( - """ - - - - - -
leftcenterright
123
456
""", - table_line_separators=True, - ) - assert_pdf_equal(pdf, HERE / "html_table_line_separators.pdf", tmp_path) - - -def test_html_table_th_inside_tr_issue_137(tmp_path): - pdf = FPDF() - pdf.add_page() - pdf.write_html( - """ - - - - - - - - -
header1header2
value1value2
""" - ) - assert_pdf_equal(pdf, HERE / "html_table_line_separators_issue_137.pdf", tmp_path) - - -def test_html_table_with_border(tmp_path): - pdf = FPDF() - pdf.set_font_size(30) - pdf.add_page() - pdf.write_html( - """ - - - - - -
leftcenterright
123
456
""" - ) - assert_pdf_equal(pdf, HERE / "html_table_with_border.pdf", tmp_path) - - def test_html_bold_italic_underline(tmp_path): pdf = FPDF() pdf.set_font_size(30) @@ -255,7 +188,7 @@ def test_html_bold_italic_underline(tmp_path): assert_pdf_equal(pdf, HERE / "html_bold_italic_underline.pdf", tmp_path) -def test_customize_ul(tmp_path): +def test_html_customize_ul(tmp_path): html = """