Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-fpdf2 for openSUSE:Factory checked in at 2026-11-02 16:37:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-fpdf2 (Old) and /work/SRC/openSUSE:Factory/.python-fpdf2.new.1255 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-fpdf2" Mon Nov 2 16:37:57 2026 rev:8 rq:1394339 version:2.9.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-fpdf2/python-fpdf2.changes 2026-10-26 10:05:25.501357452 +0100 +++ /work/SRC/openSUSE:Factory/.python-fpdf2.new.1255/python-fpdf2.changes 2026-11-02 16:38:24.838340241 +0100 @@ -1,0 +2,264 @@ +Fri Oct 30 19:26:22 UTC 2026 - Martin Hauke <[email protected]> + +- Update to version 2.9.0 + Added + * support for transform, style, opacity, and + preserveAspectRatio="none" on SVG <image> tags. + * support for colored and uncolored tiling patterns with + FPDF.create_pattern() and FPDF.use_pattern(), including SVG + <pattern> elements and pattern fills and strokes on referenced + <use> shapes. + * support for unordered lists in multi_cell(markdown=True), using + *, - or + as bullet markers. + * documentation on generating rMQR Codes. + * Python 3.15 is now officially supported. + * Unicode font detection and enhanced error handling: when text + cannot be encoded with the current font, the + FPDFUnicodeEncodingException message now identifies the Unicode + script (Cyrillic, Arabic, Chinese, etc.) and suggests a suitable + font available on the system, via the new internal + UnicodeFontManager. + Fixed + * None values in PDF dictionaries are serialized as null instead + of an invalid Python literal. + * Homogeneous arrays of PDF string and name objects use their PDF + serialization, including encryption when applicable. + * PDF dates pad years below 1000 to four digits. + * FPDF.set_display_mode() rejects infinite numeric zoom values + instead of writing invalid PDF numbers. + * Page-count aliases honor center and right alignment with core + fonts when text shaping is enabled. + * 16-bit grayscale images, like 16-bit grayscale PNG files, are + scaled down to 8 bits instead of being converted to RGBA, which + made every value above 255 white, and keep the transparency of + their tRNS color key. + * Tables inside FPDF.unbreakable() are replayed with their rows + and cells intact when the block is moved to a new page. + * FPDF.table() raises a clear ValueError naming the column when + text_align is a tuple with fewer values than the table has + columns, like it does for col_widths, instead of an IndexError. + * FPDF.table(): a cell with a colspan below 1 spans one column, + like a rowspan below 1 already spans one row, instead of raising + ZeroDivisionError or FPDFException or breaking the column layout + * Synchronize font_style and emphasis setters with font selection + and state tracking - cf. issue #1223. + * FPDF.table() raises ValueError: ... is not a valid + TableBordersLayout for an unknown borders_layout name, like it + does for cell_fill_mode and v_align, instead of a bare + AttributeError. + * FPDF.set_font() and FPDF.add_font() treat a repeated style + letter as the same style: style="BB" is bold, instead of raising + FPDFException: Undefined font: helveticaBB. + * Document outlines count all visible descendants and link + siblings by parent, retaining bookmarks when the hierarchy + starts below the top level. + * Annotation colors and border widths are serialized as PDF + numbers without exponent notation. + * Checksums for compressed embedded files are calculated from the + original file bytes, as required by the PDF specification. + * Repeated annotation flags no longer change unrelated flag bits; + annotation flags are combined with bitwise OR. + * FPDF.ink_annotation() raises a clear ValueError for an empty + coords sequence, instead of ValueError: min() iterable argument + is empty. + * SVG images with a zero width or height disable rendering instead + of using viewport dimensions. + * FPDF.write_html() uses the first available font of a <font face> + list, like browsers, as in face="Arial, Helvetica, sans-serif", + with the generic serif, sans-serif and monospace families + rendered by the core fonts, instead of raising FPDFException: + Undefined font. + * SVG gradient stop-opacity accepts percentages, clamps + out-of-range values to 0-1, and combines with the color's alpha + channel instead of replacing it. + * SVG basic-shape coordinates and corner radii now accept absolute + length units. + * SVG transforms accept numbers written in scientific notation, + such as scale(1e-3), instead of silently ignoring the transform. + * SVG gradient stops honor inline style declarations of + stop-opacity over the corresponding presentation attribute. + * SVG length and angle attributes accept scientific notation, such + as width="1e2pt", instead of raising ValueError. + * Floating-point numbers in PDF arrays, dictionaries and + destinations are written without exponent notation, preserving + their values and allowing very small numeric zoom factors to be + read correctly. + * SVG byte strings and BytesIO inputs accept a UTF-8 BOM and XML + whitespace after <svg or <?xml, instead of being sent to the + raster image loader. + * SVG import: a <polygon> or <polyline> whose points has an error + (an invalid coordinate or an odd number of them) is drawn up to + the last complete point before it, and one with empty points + draws nothing, as the SVG specification says, instead of + raising IndexError. + * FPDF.write_html() ignores an unsupported align value on <td>, + <th> and <tr>, such as middle, like it already does for <p>, + instead of raising ValueError. + * FPDF.regular_polygon() raises ValueError: 'numSides' parameter + must be equal or greater than 1 for numSides below 1, instead of + silently writing a path with no points (a bare h S, which closes + a path that was never started). + * Bulleted text-column paragraphs now honor their top margins, + indented paragraphs retain the column's right boundary, and HTML + list items honor their TextStyle.t_margin - based on PR #1218. + * FPDF.text_columns() raises a clear ValueError for ncols below + 1, like insert_toc_placeholder() does for pages, instead of a + ZeroDivisionError or an unrelated Not enough horizontal space + error when rendering. + * FPDF() and FPDF.add_page() raise FPDFPageFormatException: Width + and height must be positive numbers for a page format whose + width or height is zero or negative, such as (0, 0), instead of + writing a page with an empty or inverted /MediaBox. + * FPDF.write_html() now supports CSS length units (px, pt) and + surrounding whitespace in dimension attributes for <table>, + <td>, <th>, <hr>, and <img> elements without raising ValueError. + * FPDF.write_html() reads a CSS font-size on <font> with its unit, + like browsers, as in style="font-size: 14pt" or "12px", instead + of silently ignoring it; a number without a unit is still in + points. + * FPDF.write_html() supports <ul type="square">, the third + standard HTML bullet type, instead of raising + NotImplementedError: Unicode fonts use ▪ and core fonts fall + back to the bullet. + * FPDF.write_html() accepts the <ul type> keywords in any case, + like browsers: <ul type="CIRCLE"> and <ul type="Square"> no + longer raise NotImplementedError. + * FPDF.write_html() supports <ul type="none">, rendering the list + items without a marker like browsers do, instead of raising + NotImplementedError. + * FPDF.write_html() keeps the default bullet for an empty or + unknown <ul type>, such as type="" or a misspelled type="disk", + like browsers and like <ol> already does, instead of raising + NotImplementedError. + * SVG import: color keywords are case-insensitive (fill="RED"), + and fill / stroke accept transparent, painting nothing like + none, instead of raising ValueError + * FPDF.write_html() accepts css rgb(R, G, B) colors, and colors + with surrounding spaces, in color and bgcolor attributes + instead of raising ValueError. + * FPDF.write_html() accepts a legacy HTML color of six hex + digits without the leading #, like browsers do, as in + bgcolor="eeeeee" or <font color="ff0000">, instead of raising + ValueError. + * FPDF.write_html() ignores color="transparent" and + bgcolor="transparent" like browsers, keeping the inherited text + or background color, instead of raising ValueError. + * FPDF.write_html() ignores an invalid CSS color on a heading, + like browsers, as in <h1 style="color: nope">, keeping the color + attribute or the heading's default color, instead of raising + ValueError. + * FPDF.write_html() no longer raises IndexError on an + <ol type="a"> or <ol type="A"> list with more than 26 items: + like browsers, letters continue with aa, ab... and a start + below 1 shows as a number. + * FPDF.write_html() numbers an <ol> with an unknown type, such as + type="disc", as 1, 2, 3, like browsers, instead of raising + NotImplementedError. + * FPDF.write_html() supports <li value="N"> in ordered lists: + like browsers, the item is numbered N and the following ones + continue from it. + * FPDF.write_html() no longer raises KeyError: 'href' on an <a> + element without an href attribute, such as a named anchor (<a + name="intro">); its text is rendered as plain text. + * FPDF.set_display_mode() raises FPDFException: Incorrect zoom + display mode for a negative or non-numeric zoom, such as -50 + or None, like it does for an unknown zoom name, instead of + writing an invalid /OpenAction zoom or failing later in + output(). + * FPDF.write_html() no longer warns about a missing end tag for + the HTML void elements <meta>, <link>, <col>, <wbr>, <input>, + <base>, <area>, <embed>, <source> and <track>, which never + have one, as in the <head> of an HTML email. + * FPDF.write_html() treats an invalid colspan or rowspan on <td> + / <th>, or one below 1, as 1 like browsers do, instead of + raising ValueError or ZeroDivisionError. + * FPDF.write_html() stops a rowspan that goes past the last row + of a <table> at the last row, like browsers, instead of + raising FPDFException: Rowspan extends beyond end of table. + * FPDF.write_html() renders a <table> whose width is wider than + the page, such as width="150%", at the page width with a + warning, and ignores a negative width like browsers, instead + of raising ValueError. + * FPDF.write_html() no longer raises ValueError: Invalid + .col_widths specified on a table whose first row gives a width + to only some of its cells, such as + <td width="50%">a</td><td>b</td>: like browsers, the other + cells share the remaining space, after the gaps of cellspacing; + a cell with a colspan gives each column it spans an equal part + of its width. + * warning detection during FPDFRecorder.replay() now correctly + identifies context managers (contextlib.AbstractContextManager, + @contextmanager, custom context managers) within unbreakable() + sections. + * SVG import: opacity, fill-opacity and stroke-opacity accept + percentages (50%), and an out-of-range opacity is clamped to + 0-1 like the other two instead of raising ValueError. + * css rgb() colors accept percentages, as in rgb(100%, 0%, 50%) + (clamped to 0%-100%), in SVG import and FPDF.write_html() + instead of raising ValueError. + * hex color strings, such as in set_fill_color("#..."), must + contain only hexadecimal digits: "#1 2345" and "#+12345" were + silently read as #012345, and "#xyz" raised an unclear invalid + literal for int() error; all now raise ValueError: ... could + not be interpreted as a RGB(A) hex string. + * FPDF.ink_annotation() computes the horizontal position of the + annotation rectangle (/Rect) from the x coordinates of the path + instead of the y coordinates, so the rectangle encloses the + drawn path; it could previously lie outside the page. + * FPDF.set_auto_page_break() and FPDF.set_margin() raise + ValueError: Bottom margin must be zero or a positive number for + a negative margin, instead of placing the page break below the + bottom edge of the page, so that the last lines before each + break were written off the page and lost. + * FPDF.embed_file() accepts empty byte content and rejects + simultaneous path and byte sources even when the bytes are + empty. + * FPDF.set_line_width() raises ValueError: Line width must be + zero or a positive number for a negative width, like + set_dash_pattern() does for a negative dash length, instead of + writing a negative line width that the PDF specification does + not allow. + * FPDF.star() raises ValueError: 'corners' parameter must be + equal or greater than 1 for corners below 1, instead of a bare + ZeroDivisionError for corners=0 and silently drawing nothing + for a negative value. + * set_text_color(), set_fill_color() and set_draw_color() report + a component outside 0-255 as given: set_text_color(300) now + raises ValueError: color component 300 not in range [0, 255] + instead of 1.1764705882352942 not in range [0.0, 1.0]. + * An internal link with an index that FPDF.add_link() did not + return now raises a clear ValueError, like a link without a + page number, instead of a bare AssertionError (or a KeyError + with python -O). + * FPDF.write_html() no longer writes the content of <style> and + <script> elements into the document as text, like browsers, so + an HTML page or email with a <style> block no longer shows its + CSS. + * FPDF.add_page() and FPDF.set_page_label() raise ValueError: + 'label_start' parameter must be equal or greater than 1 for a + label_start below 1, instead of writing an invalid /St value + that the PDF specification requires to be 1 or greater. + * FPDF.set_stretching() raises ValueError: Stretching must be a + positive number for a stretching of zero or below, instead of + laying out text with no width: justified text was all put on a + single line, and other text raised an unrelated Not enough + horizontal space to render a single character error. + * FPDF.write_html() raises NotImplementedError: Unsupported + nested HTML tags inside <td> element: <table> for a <table> + nested in a table cell, like for the other unsupported nested + tags, instead of a bare AssertionError with no message. + Changed + * Updated the Portuguese tutorial, including tutorials 4 and 5 + and the new PDF/A tutorial 7 - cf. PR #2038. + * Modernized type annotations for Python 3.11+, using union + syntax, standard collection types, and typing.Self + * Removed redundant trailing zeros from numbers in PDF + dictionaries and arrays outside content streams, preserving + existing numeric precision. + Removed + * Removed the defusedxml dependency: SVG parsing now relies on + the standard-library ElementTree parser and Expat amplification + limits; bounded internal entities are accepted, cf. issue #1793 + * support for Python 3.10, that reached end-of-life. + +------------------------------------------------------------------- Old: ---- fpdf2-2.8.9.obscpio New: ---- fpdf2-2.9.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-fpdf2.spec ++++++ --- /var/tmp/diff_new_pack.o9N3q4/_old 2026-11-02 16:38:26.077392160 +0100 +++ /var/tmp/diff_new_pack.o9N3q4/_new 2026-11-02 16:38:26.080392286 +0100 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-fpdf2 -Version: 2.8.9 +Version: 2.9.0 Release: 0 Summary: Simple & fast PDF generation for Python License: LGPL-3.0-or-later @@ -27,7 +27,6 @@ # that has non-commercial license. boo#1232452 Source: fpdf2-%{version}.tar.xz BuildRequires: %{python_module Pillow >= 8.3.2} -BuildRequires: %{python_module defusedxml} BuildRequires: %{python_module fonttools >= 4.59.2} BuildRequires: %{python_module numpy} BuildRequires: %{python_module pip} @@ -52,7 +51,6 @@ # /SECTION BuildRequires: fdupes Requires: python-Pillow >= 8.3.2 -Requires: python-defusedxml # uses features from newer version than is documented upstream Requires: python-fonttools >= 4.59.2 BuildArch: noarch @@ -76,9 +74,11 @@ # Requires non-commercial licensed file SBL_Hbrw.ttf donttest+=" or test_bidi_paragraph_direction or test_hebrew_diacritics or test_text_with_parentheses or test_alias_in_rtl_text or test_alias_and_literal_side_by_side_in_rtl" # Exclude tests that fail due to SVG/fontTools floating-point rendering diffs on modern Python toolchains: -donttest+=" or test_twitter_emoji_shaping or test_twitter_emoji_text" +donttest+=" or test_twitter_emoji_shaping or test_twitter_emoji_text " # Fails due to QPDF fun and games donttest+=" or test_image_with_explicit_dimensions" +# Fails due to Python3.14 logging changes +donttest+=" or test_svg_image_preserve_aspect_ratio_unsupported_mode_warning" %pytest -s -k "not ($donttest)" %files %{python_files} ++++++ _service ++++++ --- /var/tmp/diff_new_pack.o9N3q4/_old 2026-11-02 16:38:26.111393585 +0100 +++ /var/tmp/diff_new_pack.o9N3q4/_new 2026-11-02 16:38:26.114393711 +0100 @@ -3,8 +3,8 @@ <param name="url">https://github.com/py-pdf/fpdf2</param> <param name="scm">git</param> <param name="exclude">test/text_shaping/SBL_Hbrw.ttf</param> - <param name="version">2.8.9</param> - <param name="revision">2.8.9</param> + <param name="version">2.9.0</param> + <param name="revision">2.9.0</param> </service> <service mode="manual" name="set_version" /> <service mode="buildtime" name="tar" /> ++++++ fpdf2-2.8.9.obscpio -> fpdf2-2.9.0.obscpio ++++++ /work/SRC/openSUSE:Factory/python-fpdf2/fpdf2-2.8.9.obscpio /work/SRC/openSUSE:Factory/.python-fpdf2.new.1255/fpdf2-2.9.0.obscpio differ: char 49, line 1 ++++++ fpdf2.obsinfo ++++++ --- /var/tmp/diff_new_pack.o9N3q4/_old 2026-11-02 16:38:26.147395094 +0100 +++ /var/tmp/diff_new_pack.o9N3q4/_new 2026-11-02 16:38:26.150395219 +0100 @@ -1,5 +1,5 @@ name: fpdf2 -version: 2.8.9 -mtime: 1790687408 -commit: f6e67a42eddb112b4c31401388babf0daf6d1c5b +version: 2.9.0 +mtime: 1793315488 +commit: c6e7fe021511db5d770b3a8a2e8d7d818ed40222
