diff --git a/CHANGELOG.md b/CHANGELOG.md index 547611cf9..d9e2ace6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ This can also be enabled programmatically with `warnings.simplefilter('default', - [`FPDF.image()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.image): allowing images path starting with `data` to be passed as input - text overflow is better handled by `FPDF.write()` & `FPDF.write_html()` - _cf._ [issue #847](https://github.com/PyFPDF/fpdf2/issues/847) - the initial text color is preserved when using `FPDF.write_html()` - _cf._ [issue #846](https://github.com/PyFPDF/fpdf2/issues/846) +- handle superscript and subscript correctly when rendering `TextLine`- [Pull Request #862](https://github.com/PyFPDF/fpdf2/pull/862) ### Deprecated - the `center` optional parameter of [`FPDF.cell()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.cell) is **no more** deprecated, as it allows for horizontal positioning, which is different from text alignment control with `align="C"` diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index ff3ef803b..c1851c458 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -2845,6 +2845,7 @@ def _render_styled_text_line( s_width, underlines = 0, [] # We try to avoid modifying global settings for temporary changes. current_ws = frag_ws = 0.0 + current_lift = 0.0 current_char_vpos = CharVPos.LINE current_font = self.current_font current_text_mode = self.text_mode @@ -2894,9 +2895,10 @@ def _render_styled_text_line( current_font = frag.font sl.append(f"/F{frag.font.i} {frag.font_size_pt:.2f} Tf") lift = frag.lift - if lift != 0.0: + if lift != current_lift: # Use text rise operator: sl.append(f"{lift:.2f} Ts") + current_lift = lift if ( frag.text_mode != TextMode.FILL or frag.text_mode != current_text_mode @@ -2983,6 +2985,7 @@ def _render_styled_text_line( # pylint: disable=too-many-boolean-expressions if ( current_ws != 0.0 + or current_lift != 0.0 or current_char_vpos != CharVPos.LINE or current_font != self.current_font or current_text_mode != self.text_mode diff --git a/test/text/test_varied_fragments.py b/test/text/test_varied_fragments.py index 8f1423089..1b96af5c0 100644 --- a/test/text/test_varied_fragments.py +++ b/test/text/test_varied_fragments.py @@ -192,3 +192,35 @@ def test_varfrags_text_mode(tmp_path): pdf.ln() pdf.write_fragments(frags, align=Align.C) assert_pdf_equal(pdf, HERE / "varfrags_text_mode.pdf", tmp_path) + + +def test_varfrags_char_vpos(tmp_path): + pdf = FxFPDF() + pdf.add_page() + pdf.line(pdf.l_margin, pdf.t_margin, pdf.l_margin, pdf.h - pdf.b_margin) + pdf.line( + pdf.l_margin + pdf.epw, + pdf.t_margin, + pdf.l_margin + pdf.epw, + pdf.h - pdf.b_margin, + ) + pdf.set_font("helvetica", "", 14) + f1 = Fragment(TEXT_1, pdf._get_current_graphics_state(), pdf.k) + pdf.char_vpos = "SUB" + f2 = Fragment(TEXT_2, pdf._get_current_graphics_state(), pdf.k) + f3 = Fragment(TEXT_3, f1.graphics_state, pdf.k) + pdf.char_vpos = "SUP" + f4 = Fragment(TEXT_4, pdf._get_current_graphics_state(), pdf.k) + f5 = Fragment(TEXT_5, f1.graphics_state, pdf.k) + frags = [f1, f2, f3, f4, f5] + pdf.write_fragments(frags) + pdf.ln() + pdf.ln() + pdf.write_fragments(frags, align=Align.J) + pdf.ln() + pdf.ln() + pdf.write_fragments(frags, align=Align.R) + pdf.ln() + pdf.ln() + pdf.write_fragments(frags, align=Align.C) + assert_pdf_equal(pdf, HERE / "varfrags_char_vpos.pdf", tmp_path) diff --git a/test/text/varfrags_char_vpos.pdf b/test/text/varfrags_char_vpos.pdf new file mode 100644 index 000000000..c3def4c49 Binary files /dev/null and b/test/text/varfrags_char_vpos.pdf differ