diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fbe6638d..3d0957a8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,33 @@ follow semantic versioning; release dates are ISO 8601. ### Public API +- **A DOCX export no longer stands what follows a width anchor, or a paragraph Word sets taller, + lower than the page.** Both reached past the block in Word, and neither was taken out of the + space below or named. Each now hangs below its block, as a line held to its icon does: the + space below takes it, and what it cannot take is named (`space above`). + - **A spacer shorter than its line** — a width anchor of no height, as `Panel`'s and + `PanelLetter`'s cards open with — is written as a paragraph a tenth of a point tall, as a + spacer in the flow is; the rest of that tenth stood every card that much taller in Word. + - **A paragraph whose lines Word sets taller than the page.** Word sets every line of a + paragraph at one height, which for a paragraph of lines in more than one size the export + writes as its tallest line's; the page sets each at its own, so a wrapped line after a large + first one stands closer on the page. Lines rounded up to the twip, over enough of them, pass + the page too and hang the same way: `OrangeOps`' achievement lines, a 0.08pt gap between + them written as a tenth (measured). What rounding takes from a paragraph written at its + tallest line is not owed: owed, it stood `ModernInvoice`'s lines a step or two of Word's grid + lower (measured). A tenth of a point or less is left either way: Word sets lines on a grid + 0.12pt apart. + - A paragraph the layout opens a page with, with no top edge of its own to hold there, leaves + what the block above leaves below itself on the page above, as one with an edge does. + + In the DOCX fidelity corpus 9 of the 62 documents change, and the report names nothing more. + In Word all nine stand nearer the page in median — `cv-panel`'s median line from 0.83pt to + 0.46pt, `cv-compact_mono`'s ninetieth percentile from 0.91pt to 0.36pt, the foot of its sidebar a + point higher, where the page sets it — and in LibreOffice on Windows seven do. `letter-panel`'s + text now starts where the page sets its card, and stands as far off its baseline as both + editors seat it in an exact line: its ninetieth percentile from 0.21pt to 0.29pt in Word, its + median 0.06pt further in LibreOffice. + - **A DOCX export sets what follows a panel where the page sets it, and names what Word sets lower.** Word sets a panel's content below its whole top border and its margin inside the table's row, and ends the row its margin and its whole bottom border past the content; the diff --git a/docs/recipes/docx-export.md b/docs/recipes/docx-export.md index 6115d8639..7e4eec2a1 100644 --- a/docs/recipes/docx-export.md +++ b/docs/recipes/docx-export.md @@ -76,7 +76,7 @@ creation date is real metadata. | Links and anchors | A `linkTarget` becomes a `w:hyperlink` — a relationship for an address, `w:anchor` for one of the document's own anchors — and a run's own link wins over the paragraph's — in a list item as much as in a paragraph. An `anchor(...)` becomes a bookmark wrapping that paragraph's text, named as Word requires; on a section, container, table or image it wraps everything the block wrote, from the start of its first paragraph to the end of its last, so a link to a block lands on its first line. A `bookmark(...)` outline level becomes Word's own `HeadingN` style, which is what puts the paragraph in the Navigation Pane, the outline view and a generated table of contents. The style states the outline level and nothing else, so the paragraph keeps its own formatting. The role comes from what the document declared, never from how big the text is | | Rows | A one-row table spanning the content width — or only its columns, where fixed columns leave part of the row empty — so editors keep the side-by-side layout. The row's slots become the column grid when they are weights, an even split or fixed columns; fixed columns that add up to less than the row leave the rest of it empty, the last one at its own width and the table no wider than its columns, so its text wraps where the page wraps it; the gap and the row's padding ride in the neighbouring column and come back out as that cell's margin; a cell holds whatever its child is, written as it is anywhere else. The row's `verticalAlign` is every cell's `w:vAlign`, so a child shorter than the row sits at its middle or bottom as on the page — a table of contents' leader on its entry's baseline. The row is kept whole across a page break, as the layout keeps it. A row is held at least as tall as the page makes it inside a painted panel, and anywhere its tallest child is a drawing Word holds nothing of in its cell — a badge beside a heading. A section or other container in any cell — a row's, a table's, a panel's — that pulls its first line up with a negative top edge writes that one-line paragraph as much shorter, its text seated where the page sets it — no more than the room above its letters, as Word draws an exact line's text only inside the line. A row that paints its box — `fillColor`, `stroke`, `borders` — is a panel holding its columns (see "What a panel keeps and loses" below): a table of one cell carrying the fill and borders, its margins the row's padding as a panel's are, and in it the columns as a table of their own, without the padding; a corner radius squares, and is named (`corner radius`), and what of its borders above and below Word draws past its box is taken, or named, as a panel's is. A row composed in a table cell, in a page zone's line, in a band of overlapping layers or where a stack's column measures the space round it to its text, with a padding below zero or a column hanging into it, or with a margin below zero above or below it or at a side in a cell, is written as its columns alone, its paint in the report (`row paint`); in the body a row bleeding past the margin is its panel | | Sections / containers | Children written in order. A timeline with its markers on the rail (`markerOnRail()`) lays each entry's body out in the header row's content column, below the row; the body is written in the flow, indented to that column where the page puts it. A container with a fill, per-side borders or a uniform stroke is a one-cell table carrying them, its padding as the cell's margins, so a card keeps its panel — see "What a panel keeps and loses" below. A `keepTogether()` or `keepWithNext()` block the layout placed on one page stays on one page in Word too (`w:keepLines` + `w:keepNext`, and a row that may not split for a panel). A box with no paint is only its contents, so a `fixedWidth` narrower than the column is not written: its paragraphs and lists run the column's width, as a panel's in a table cell do, and the report names it. Under an alignment wrapper, or as a layer of a band, the box is held in to where the page placed it. A painted section's bleed is not written: its fill and borders stop at its box, and where the page bleeds it — in the flow it lays out page by page, the body and the panels in it — the report names it. A line drawn as a shape holds no keep: its drawing is anchored in a paragraph near it, a page can end between it and the next block, and in that same flow the report names the keep it loses | -| Spacers | An empty paragraph a tenth of a point tall, which Word keeps (a shorter spacer stands that tenth); the rest of the spacer's height is the space above the next block, or below this paragraph when a table follows. A spacer in the body the layout moves to a new page with the gap before it, because the gap did not fit at the foot of the page above, holds the space the layout leaves above it there — that gap, and the edges of any containers opening with it — in its line, which Word keeps at the top of a page where it drops the space above. A spacer's own margin and padding are not written, and the report names them — except below the lowest block of a band, or of a layer another resumes after in its column, where the space is measured from the page, the block's own margin and padding included | +| Spacers | An empty paragraph a tenth of a point tall, which Word keeps; the rest of the spacer's height is the space above the next block, or below this paragraph when a table follows. A spacer shorter than that tenth — a width anchor of no height, as `Panel`'s and `PanelLetter`'s cards open with — has its line reach past it by the rest, which the space below takes, as it takes a line hanging below a block, and what it cannot take is named (`space above`): taken nowhere, the line stood every card a tenth of a point taller in Word. A spacer in the body the layout moves to a new page with the gap before it, because the gap did not fit at the foot of the page above, holds the space the layout leaves above it there — that gap, and the edges of any containers opening with it — in its line, which Word keeps at the top of a page where it drops the space above. A spacer's own margin and padding are not written, and the report names them — except below the lowest block of a band, or of a layer another resumes after in its column, where the space is measured from the page, the block's own margin and padding included | | Page breaks | Explicit Word page breaks | Page geometry (size, margins and orientation — a page wider than it is tall is stated as @@ -185,7 +185,7 @@ it cannot work out for itself: | What | Where it lands | |---|---| -| Line height | `w:spacing w:lineRule="exact"` on every paragraph, cells and list items included — the height the engine measured, not a multiple Word would measure again against a substituted font. Word has one height for a paragraph's lines: it is the tallest line's text, or, where the page sets lines of different heights further apart than that, the page's mean distance between their baselines, with what a paragraph on one page then falls short of the page owed below it (not yet a list item's, or text set over the flow). In a paragraph of more than one line on one page, the spaces a `bulletOffset` sets before a line, written as an indent, do not count towards that line's text. A paragraph of lines as tall as their text, on one page, opening a table cell takes the gap above its first line from the cell's top padding, no more than steps its lines the page's distance apart — not in a row beside a merged cell or a cell opening with a table, whose margin Word would set the whole row at, nor in a panel. One with no room above it for the gap (opening a column, or a cell padded less) shares the gaps out over all its lines, so its lines stand a little closer than on the page. A paragraph the layout did not measure — one in a composed table cell — is left to the editor, and a line holding a picture above its text is written "at least" that height — except a paragraph of one line of text with room above for its pictures' reach, held exact at the page's height (see "Inline pictures"); in both the paragraph mark is set in the text's size and face, since the mark counts towards the last line's height. A line holding pictures and no text, where they fill the page's line, has its mark and its pictures' runs set at a point instead, so Word makes the line as tall as the pictures and no taller: in the paragraph's own size the mark's depth went under the picture (measured: `SlateOrange`'s skills, a 12.4pt icon beside each label, stood 0.2pt taller each in Word). A smaller picture in a line the page sets at its font's height keeps its mark, and so does a line holding a letter, a break, a tab, a field or a link's text. A paragraph's own line of drawn shapes and no text written at least their reach, which Word grows to the pictures and the transparent frame each keeps around its ink, has that frame taken from the space above the line and above what follows, where it passes the height written: the ink stands where the page draws it, and what follows where the page sets it. Both editors stand the baseline of an exact line four fifths of the way down it whatever the face (measured in Word and LibreOffice), and the page sets it the face's ascent below the line's top: where the two are half a point or more apart — a face with a deep descent, as Spectral's is — a paragraph's text is raised or lowered to the page's baseline by `w:position`, matched at its middle line; a list item's and a table text cell's are not yet. A picture among such text moves with it in Word; LibreOffice keeps a picture on its own baseline, where it stood before. Lines a container stacks tighter than their face — a title's lines a pitch apart — each end halfway between their letters and the next line's, since Word draws an exact line's text on screen only inside the line, and the last layer of a shape container, where its line runs past the foot, ends at the foot or below its letters | +| Line height | `w:spacing w:lineRule="exact"` on every paragraph, cells and list items included — the height the engine measured, not a multiple Word would measure again against a substituted font. Word has one height for a paragraph's lines: it is the tallest line's text, or, where the page sets lines of different heights further apart than that, the page's mean distance between their baselines, with what a paragraph on one page then falls short of the page owed below it, and what it passes the page by — written at its tallest line, a wrapped line after a large first one, which the page sets at its own height — hung below it, as a line held to its icon is: the space below takes it, and what it cannot take is named (`space above`) (not yet a list item's, or text set over the flow; measured: `CompactMono`'s sidebar, whose skills are two lines a paragraph and each written 0.12pt taller than the page, ended a point low in Word). Lines rounded up to the twip, over enough of them, hang the same way; what rounding takes from a paragraph written at its tallest line is not owed (measured: owed, it stood `ModernInvoice`'s lines lower in Word). A tenth of a point or less is left either way: Word sets lines on a grid of its own, 0.12pt apart (measured). In a paragraph of more than one line on one page, the spaces a `bulletOffset` sets before a line, written as an indent, do not count towards that line's text. A paragraph of lines as tall as their text, on one page, opening a table cell takes the gap above its first line from the cell's top padding, no more than steps its lines the page's distance apart — not in a row beside a merged cell or a cell opening with a table, whose margin Word would set the whole row at, nor in a panel. One with no room above it for the gap (opening a column, or a cell padded less) shares the gaps out over all its lines, so its lines stand a little closer than on the page. A paragraph the layout did not measure — one in a composed table cell — is left to the editor, and a line holding a picture above its text is written "at least" that height — except a paragraph of one line of text with room above for its pictures' reach, held exact at the page's height (see "Inline pictures"); in both the paragraph mark is set in the text's size and face, since the mark counts towards the last line's height. A line holding pictures and no text, where they fill the page's line, has its mark and its pictures' runs set at a point instead, so Word makes the line as tall as the pictures and no taller: in the paragraph's own size the mark's depth went under the picture (measured: `SlateOrange`'s skills, a 12.4pt icon beside each label, stood 0.2pt taller each in Word). A smaller picture in a line the page sets at its font's height keeps its mark, and so does a line holding a letter, a break, a tab, a field or a link's text. A paragraph's own line of drawn shapes and no text written at least their reach, which Word grows to the pictures and the transparent frame each keeps around its ink, has that frame taken from the space above the line and above what follows, where it passes the height written: the ink stands where the page draws it, and what follows where the page sets it. Both editors stand the baseline of an exact line four fifths of the way down it whatever the face (measured in Word and LibreOffice), and the page sets it the face's ascent below the line's top: where the two are half a point or more apart — a face with a deep descent, as Spectral's is — a paragraph's text is raised or lowered to the page's baseline by `w:position`, matched at its middle line; a list item's and a table text cell's are not yet. A picture among such text moves with it in Word; LibreOffice keeps a picture on its own baseline, where it stood before. Lines a container stacks tighter than their face — a title's lines a pitch apart — each end halfway between their letters and the next line's, since Word draws an exact line's text on screen only inside the line, and the last layer of a shape container, where its line runs past the foot, ends at the foot or below its letters | | Table columns | the resolved cell widths as `w:gridCol`, with `w:tblLayout` fixed so Word does not re-fit them | | Row columns | where the layout placed each child, with the row's gap and padding folded into the neighbouring column and taken back out as that cell's margin — in a painted row's panel the padding is the panel cell's margins instead, and the columns are without it. A column sized to its content (`DocumentRowColumn.auto()`) gets a point more, taken from the row's weight columns so the row keeps its width, for the reason a table's does: the editor's substitute font would wrap it — a table of contents' labels broke mid-word ("Intr" / "o") in LibreOffice without it. A row with no auto column, no weight column, or no stated columns (weights, an even split) is written as placed | @@ -208,7 +208,8 @@ centred or a right-to-left one. A section's or a container's `spacing` is the gap between each two of its children, owed below one and written above the next; before a page break there is none, as the page ends there, and after one the next page starts that far down, as the layout starts it. A spacer is its height alone: its empty -paragraph is held to a tenth of a point, so it adds no line of text to the gap it carries. +paragraph is held to a tenth of a point, so it adds no line of text to the gap it carries; the +space below a spacer shorter than that takes the rest of the tenth. A table holds its own space the same way. Word has no space above a table and none below one, so a table's or a row's `margin` and `padding` travel to the paragraphs around it — @@ -240,8 +241,9 @@ comes out of the space above the table the same way; before a page break or the out of the space owed below instead. Layers that overlap on the page take none of it from one another, as the space between them is measured from their boxes. Text that runs past the foot of the block it stands in — a stack's or a shape container's last line, a row cell's -icon line — comes out of the space above what follows the same way, a stack written as a band -included, and what that space cannot give is named (`space above`); a painted panel's last +icon line, a paragraph's last line Word sets taller than the page (see "Line height") — +comes out of the space above what follows the same way, a stack written as a band included, +and what that space cannot give is named (`space above`); a painted panel's last line comes out of its padding below first, and a shape container keeps its last line inside its outline. diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv index a970fd4ab..94db40d87 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv @@ -47,10 +47,10 @@ cv-blue_banner 0:33c35e9d236d 0.00 0.10 speaking:jvmsummit2024,devoxxuk2 cv-blue_banner 0:2577c0f557b2 0.01 0.34 projects cv-blue_banner 0:47f6c54ae700 -0.30 0.10 graphcompose(java21,pdfbox,maven cv-blue_banner 0:7fea658a4957 0.00 0.10 productioncv/invoice/proposalpip -cv-blue_banner 0:b56776d153e9 0.06 0.10 templatestudio(kotlin,composedes -cv-blue_banner 0:88b226d51fe1 0.36 0.10 pngdiffing,side-by-sidelayout,ba -cv-blue_banner 0:339245d63103 0.42 0.10 layoutlint(java21,javaparser,spo -cv-blue_banner 0:8c87b84946f3 0.72 0.10 beforetheyshiptoproduction. +cv-blue_banner 0:b56776d153e9 -0.29 0.10 templatestudio(kotlin,composedes +cv-blue_banner 0:88b226d51fe1 0.01 0.10 pngdiffing,side-by-sidelayout,ba +cv-blue_banner 0:339245d63103 -0.28 0.10 layoutlint(java21,javaparser,spo +cv-blue_banner 0:8c87b84946f3 0.02 0.10 beforetheyshiptoproduction. cv-boxed_sections 0:8f1010120ed6 0.46 2.20 jordanrivera cv-boxed_sections 0:8d7a2cca3060 0.23 0.12 +442055551000|jordan.rivera@exam cv-boxed_sections 0:b944906ed84c 0.28 6.44 professionalsummary @@ -308,30 +308,30 @@ cv-compact_mono 0:32c1cf49a2fe 0.24 0.10 skills cv-compact_mono 0:551282493299 -0.11 0.10 languagesjava21,kotlin,groovy,py cv-compact_mono 0:8f5cfd05d621 -0.32 0.10 document&printpdfbox,apachepoi cv-compact_mono 0:148ff6990529 -0.21 0.10 (docx/xlsx),itext,postscript -cv-compact_mono 0:862bd50bcc32 -0.20 0.10 layoutenginescustomdsldesign,sem -cv-compact_mono 0:ec4f3e745260 -0.09 0.10 layouttrees,pagination,snapshott -cv-compact_mono 0:55a8b2742c06 -0.08 0.10 build&infrastructuremaven,gradle -cv-compact_mono 0:1649ba79bc7a 0.03 0.10 actions,jitpack -cv-compact_mono 0:d4ac2ee01f81 0.04 0.10 testingjunit5,assertj,pdfbox-bas -cv-compact_mono 0:b04e6ebfb02b 0.15 0.10 diff,layout-graphsnapshots -cv-compact_mono 0:93c9f742ef14 0.16 0.10 distributionmavencentral,sonatyp -cv-compact_mono 0:8f21bd149ad7 0.27 0.10 gpgsigning,jitpack -cv-compact_mono 0:68bf0109c6f8 0.83 0.10 education -cv-compact_mono 0:9ad8d9ef1711 0.33 0.10 msccomputerscience/universityof -cv-compact_mono 0:594f6dd11e20 0.40 0.10 manchester/2019-2021 -cv-compact_mono 0:387dc0387824 0.43 0.10 bscsoftwareengineering/imperialc -cv-compact_mono 0:453806946a88 0.50 0.10 london/2015-2019 -cv-compact_mono 0:7816e7a28b71 0.53 0.10 oraclejavacertification/professi -cv-compact_mono 0:d40b22f00acb 0.75 0.10 2023-2024 -cv-compact_mono 0:7b476727faf3 1.31 0.10 additional -cv-compact_mono 0:ecc25e73b19b 0.80 0.10 languages:english(fluent),german -cv-compact_mono 0:ac7f0ee6a49e 0.81 0.10 (intermediate),spanish(basic) -cv-compact_mono 0:970ca9d789c2 0.82 0.10 workeligibility:eligibletoworkin -cv-compact_mono 0:0735680e2596 0.83 0.10 theeu -cv-compact_mono 0:8051a4b5e34f 0.84 0.10 opensource:maintainerofgraphcomp -cv-compact_mono 0:08c2e869a75b 0.85 0.10 regularcontributortopdfboxissuet -cv-compact_mono 0:12dcd1343975 0.86 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-compact_mono 0:3aea7f90f8ed 0.87 0.10 —bothondeclarativedocumentlayout +cv-compact_mono 0:862bd50bcc32 -0.30 0.10 layoutenginescustomdsldesign,sem +cv-compact_mono 0:ec4f3e745260 -0.19 0.10 layouttrees,pagination,snapshott +cv-compact_mono 0:55a8b2742c06 -0.28 0.10 build&infrastructuremaven,gradle +cv-compact_mono 0:1649ba79bc7a -0.17 0.10 actions,jitpack +cv-compact_mono 0:d4ac2ee01f81 -0.26 0.10 testingjunit5,assertj,pdfbox-bas +cv-compact_mono 0:b04e6ebfb02b -0.15 0.10 diff,layout-graphsnapshots +cv-compact_mono 0:93c9f742ef14 -0.24 0.10 distributionmavencentral,sonatyp +cv-compact_mono 0:8f21bd149ad7 -0.13 0.10 gpgsigning,jitpack +cv-compact_mono 0:68bf0109c6f8 0.33 0.10 education +cv-compact_mono 0:9ad8d9ef1711 -0.17 0.10 msccomputerscience/universityof +cv-compact_mono 0:594f6dd11e20 -0.10 0.10 manchester/2019-2021 +cv-compact_mono 0:387dc0387824 -0.17 0.10 bscsoftwareengineering/imperialc +cv-compact_mono 0:453806946a88 -0.10 0.10 london/2015-2019 +cv-compact_mono 0:7816e7a28b71 -0.17 0.10 oraclejavacertification/professi +cv-compact_mono 0:d40b22f00acb 0.05 0.10 2023-2024 +cv-compact_mono 0:7b476727faf3 0.31 0.10 additional +cv-compact_mono 0:ecc25e73b19b -0.20 0.10 languages:english(fluent),german +cv-compact_mono 0:ac7f0ee6a49e -0.19 0.10 (intermediate),spanish(basic) +cv-compact_mono 0:970ca9d789c2 -0.18 0.10 workeligibility:eligibletoworkin +cv-compact_mono 0:0735680e2596 -0.17 0.10 theeu +cv-compact_mono 0:8051a4b5e34f -0.16 0.10 opensource:maintainerofgraphcomp +cv-compact_mono 0:08c2e869a75b -0.15 0.10 regularcontributortopdfboxissuet +cv-compact_mono 0:12dcd1343975 -0.14 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-compact_mono 0:3aea7f90f8ed -0.13 0.10 —bothondeclarativedocumentlayout cv-compact_mono 0:1900eab6c028 0.24 0.09 profile cv-compact_mono 0:3828b9718a0d -0.35 0.09 platformengineerwith10+yearsbuil cv-compact_mono 0:f6b5e93ccadd -0.34 0.09 engines,anddeveloper-facingtempl @@ -493,12 +493,12 @@ cv-engineering_resume 0:8b5abdc8c0d7 -0.23 0.10 technicalevidence cv-engineering_resume 0:e2fbf67cb588 0.41 0.05 graphcompose(java21,pdfbox,maven cv-engineering_resume 0:eb5950729749 0.27 0.05 templates,snapshottesting.powers cv-engineering_resume 0:81c8132f9792 0.19 0.05 systems.(opensource) -cv-engineering_resume 0:643428f0ebf8 0.68 0.05 templatestudio(kotlin,composedes -cv-engineering_resume 0:c259a0e7581e 0.39 0.05 invoiceoutputacross14designprese -cv-engineering_resume 0:c944ee08a5bf 0.88 0.05 layoutlint(java21,javaparser,spo -cv-engineering_resume 0:2d80d05697ad 0.59 0.05 untypedoffsets,implicitpagebreak -cv-engineering_resume 0:6793d28e9783 1.08 0.05 chromeforge(java,graphcompose,pa -cv-engineering_resume 0:e3cfea265b3b 0.79 0.05 graphcompose:cinematiccovers,pul +cv-engineering_resume 0:643428f0ebf8 0.18 0.05 templatestudio(kotlin,composedes +cv-engineering_resume 0:c259a0e7581e -0.11 0.05 invoiceoutputacross14designprese +cv-engineering_resume 0:c944ee08a5bf 0.08 0.05 layoutlint(java21,javaparser,spo +cv-engineering_resume 0:2d80d05697ad -0.21 0.05 untypedoffsets,implicitpagebreak +cv-engineering_resume 0:6793d28e9783 -0.02 0.05 chromeforge(java,graphcompose,pa +cv-engineering_resume 0:e3cfea265b3b -0.31 0.05 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 -0.50 0.10 jordanrivera cv-executive 0:89ff05847e96 -0.28 0.10 london,uk|+442055551000 cv-executive 0:8817bf9310b6 -0.30 0.10 jordan.rivera@example.com|linked @@ -862,14 +862,14 @@ cv-monogram_sidebar 0:e77e909f6ff5 -0.41 0.06 builtbackendservicesandproductio cv-monogram_sidebar 0:97c59b2fdb55 -0.41 0.06 drovethemigrationfromitexttoacus cv-monogram_sidebar 0:2c2b19cf214d -0.41 0.06 latencyfrom1.4sto380ms. cv-monogram_sidebar 0:2577c0f557b2 -0.19 0.06 projects -cv-monogram_sidebar 0:abdcacccefe1 0.28 0.06 templatestudio(kotlin,composedes -cv-monogram_sidebar 0:041a43f9a663 0.57 0.06 andinvoiceoutputacross14designpr -cv-monogram_sidebar 0:f87e2f0c02dc 0.62 0.06 layoutlint(java21,javaparser,spo -cv-monogram_sidebar 0:a646f74483b1 0.91 0.06 rows,untypedoffsets,implicitpage -cv-monogram_sidebar 0:676dfdd56ad2 1.18 0.06 additionalinformation -cv-monogram_sidebar 0:f20997652453 1.21 0.06 languages:english(fluent),german -cv-monogram_sidebar 0:ec9d3622395e 1.20 0.06 workeligibility:eligibletoworkin -cv-monogram_sidebar 0:dd20ae01c3cf 1.19 0.06 opensource:maintainerofgraphcomp +cv-monogram_sidebar 0:abdcacccefe1 -0.42 0.06 templatestudio(kotlin,composedes +cv-monogram_sidebar 0:041a43f9a663 -0.13 0.06 andinvoiceoutputacross14designpr +cv-monogram_sidebar 0:f87e2f0c02dc -0.43 0.06 layoutlint(java21,javaparser,spo +cv-monogram_sidebar 0:a646f74483b1 -0.14 0.06 rows,untypedoffsets,implicitpage +cv-monogram_sidebar 0:676dfdd56ad2 -0.22 0.06 additionalinformation +cv-monogram_sidebar 0:f20997652453 -0.19 0.06 languages:english(fluent),german +cv-monogram_sidebar 0:ec9d3622395e -0.20 0.06 workeligibility:eligibletoworkin +cv-monogram_sidebar 0:dd20ae01c3cf -0.21 0.06 opensource:maintainerofgraphcomp cv-navy_sidebar 0:9fdaa20e32a0 0.24 0.10 oliviamartinez cv-navy_sidebar 0:093e7d5fdbaa -0.29 0.10 contact cv-navy_sidebar 0:01dcad830244 -0.08 0.10 +1(555)123-4567 @@ -967,16 +967,16 @@ cv-nordic_clean 0:43ad67a4e3f5 -0.17 0.10 signing,jitpack,semanticversioni cv-nordic_clean 0:68bf0109c6f8 -0.09 0.10 education cv-nordic_clean 0:904a600c3869 -0.17 0.10 msccomputerscience/universityofm cv-nordic_clean 0:3fa772117260 0.02 0.10 2019-2021 -cv-nordic_clean 0:78a380e4d1f0 0.05 0.10 bscsoftwareengineering/imperialc -cv-nordic_clean 0:30f9262640a0 0.24 0.10 2015-2019 -cv-nordic_clean 0:7b476727faf3 0.55 0.10 additional -cv-nordic_clean 0:3b0f5db9217f 0.42 0.10 languages:english(fluent),german -cv-nordic_clean 0:d8a971cea795 0.40 0.10 spanish(basic) -cv-nordic_clean 0:ec9d3622395e 0.63 0.10 workeligibility:eligibletoworkin -cv-nordic_clean 0:d05b8b335e96 0.36 0.10 opensource:maintainerofgraphcomp -cv-nordic_clean 0:2f3b4176123d 0.34 0.10 contributortopdfboxissuetriage. -cv-nordic_clean 0:b6b5a250cb72 0.32 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-nordic_clean 0:7ead14c50085 0.30 0.10 ondeclarativedocumentlayout. +cv-nordic_clean 0:78a380e4d1f0 -0.15 0.10 bscsoftwareengineering/imperialc +cv-nordic_clean 0:30f9262640a0 0.04 0.10 2015-2019 +cv-nordic_clean 0:7b476727faf3 -0.05 0.10 additional +cv-nordic_clean 0:3b0f5db9217f -0.18 0.10 languages:english(fluent),german +cv-nordic_clean 0:d8a971cea795 -0.20 0.10 spanish(basic) +cv-nordic_clean 0:ec9d3622395e 0.03 0.10 workeligibility:eligibletoworkin +cv-nordic_clean 0:d05b8b335e96 -0.24 0.10 opensource:maintainerofgraphcomp +cv-nordic_clean 0:2f3b4176123d -0.26 0.10 contributortopdfboxissuetriage. +cv-nordic_clean 0:b6b5a250cb72 -0.28 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-nordic_clean 0:7ead14c50085 -0.30 0.10 ondeclarativedocumentlayout. cv-nordic_clean 0:53e5e7c5a884 -0.31 0.11 experience cv-nordic_clean 0:4977534824cc -0.23 0.11 seniorplatformengineer/2024-pres cv-nordic_clean 0:f890faef907f -0.19 0.11 northwindsystems @@ -993,15 +993,15 @@ cv-nordic_clean 0:ef148f221e31 -0.19 0.11 helixprintco cv-nordic_clean 0:41d451f465c2 -0.42 0.11 maintainedahigh-volumeinvoice-pr cv-nordic_clean 0:6859fed08b66 -0.43 0.11 harnessthatgatedeverytemplatecha cv-nordic_clean 0:d94eccbb1fbe -0.32 0.11 selectedprojects -cv-nordic_clean 0:643428f0ebf8 -0.10 0.11 templatestudio(kotlin,composedes -cv-nordic_clean 0:c259a0e7581e 0.04 0.11 invoiceoutputacross14designprese -cv-nordic_clean 0:f87e2f0c02dc 0.06 0.11 layoutlint(java21,javaparser,spo -cv-nordic_clean 0:a646f74483b1 0.20 0.11 rows,untypedoffsets,implicitpage -cv-nordic_clean 0:6793d28e9783 0.22 0.11 chromeforge(java,graphcompose,pa -cv-nordic_clean 0:e3cfea265b3b 0.36 0.11 graphcompose:cinematiccovers,pul +cv-nordic_clean 0:643428f0ebf8 -0.45 0.11 templatestudio(kotlin,composedes +cv-nordic_clean 0:c259a0e7581e -0.31 0.11 invoiceoutputacross14designprese +cv-nordic_clean 0:f87e2f0c02dc -0.44 0.11 layoutlint(java21,javaparser,spo +cv-nordic_clean 0:a646f74483b1 -0.30 0.11 rows,untypedoffsets,implicitpage +cv-nordic_clean 0:6793d28e9783 -0.43 0.11 chromeforge(java,graphcompose,pa +cv-nordic_clean 0:e3cfea265b3b -0.29 0.11 graphcompose:cinematiccovers,pul cv-orange_ops 0:a6c9a7bc3a1d -0.41 0.12 marcusbennett cv-orange_ops 0:8157f110feec -0.29 0.12 warehouseoperationssupervisor -cv-orange_ops 0:8157f110feec#1 0.24 0.17 warehouseoperationssupervisor +cv-orange_ops 0:8157f110feec#1 0.09 0.17 warehouseoperationssupervisor cv-orange_ops 0:a8acc3a90a7b -0.18 0.02 +447700900123 cv-orange_ops 0:e6da1125d5d5 -0.18 -0.37 marcus.bennett@email.com cv-orange_ops 0:6a3bd39f358d -0.18 -0.74 birmingham,westmidlands,uk @@ -1058,127 +1058,127 @@ cv-orange_ops 0:41fad67acd21 0.30 0.17 environments.proventrackrecordof cv-orange_ops 0:08fe5844eac2 0.33 0.17 accuracy,anddeliveringexcellents cv-orange_ops 0:b1f2a388d597 0.35 0.17 andsafety.adeptatusingdatatodriv cv-orange_ops 0:0ef62989056c 0.38 0.17 measurableresults. -cv-orange_ops 0:360626c9f718 0.27 0.17 workexperience -cv-orange_ops 0:03f6d636aa6b 0.28 0.20 mar2021–present -cv-orange_ops 0:24c0d4863b50 0.27 0.17 expresslinkdistributionltd|birmi -cv-orange_ops 0:873c40886362 0.20 0.17 •overseedailywarehouseoperations -cv-orange_ops 0:e789c025e038 0.19 0.17 staffacrossinbound,storage,picki -cv-orange_ops 0:005412ac77a3 0.27 0.17 •ensuretimelyandaccurateorderful -cv-orange_ops 0:4e9c4aed8e43 0.24 0.17 •monitorandmaintaininventoryaccu -cv-orange_ops 0:1509c3cbd20f 0.24 0.17 variances. -cv-orange_ops 0:928837818f67 0.31 0.17 •analysekpisandoperationaldatato -cv-orange_ops 0:70ed682534c9 0.28 0.17 •coordinatewithtransportandcusto -cv-orange_ops 0:901159ffc9e3 0.28 0.17 improveservicelevels. -cv-orange_ops 0:947008cdcf98 0.30 0.17 •driveacultureofsafetyandaccount -cv-orange_ops 0:e6b1b813ff0b 0.30 0.17 compliancewithh&sregulations. -cv-orange_ops 0:c8a3bdb04f89 0.32 0.17 •leadcontinuousimprovementinitia -cv-orange_ops 0:e28f5bf00122 0.31 0.17 productivity. -cv-orange_ops 0:bfb9273fea4d 0.32 0.17 warehouseteamleader -cv-orange_ops 0:9a8c213939be 0.36 0.20 may2017–feb2021 -cv-orange_ops 0:df1f256d362d 0.35 0.17 midlandgatelogistics|coventry,uk -cv-orange_ops 0:92d5e6992bc1 0.33 0.17 •ledateamof25warehouseoperatives -cv-orange_ops 0:ec21a3e83856 0.35 0.17 •managedinboundreceipts,putaway, -cv-orange_ops 0:ac1fa66fcf19 0.38 0.17 •maintainedaccuratestockrecordsa -cv-orange_ops 0:195624e8565f 0.40 0.17 •supportedtheimplementationofane -cv-orange_ops 0:dd2458930e31 0.43 0.17 •reducedpickingerrorsby23%throug -cv-orange_ops 0:81219b44ff52 0.38 0.17 warehousecoordinator -cv-orange_ops 0:eb5e95e8b64c 0.42 0.23 jun2015–apr2017 -cv-orange_ops 0:95f3c676853f 0.41 0.17 totalsupplysolutions|northampton -cv-orange_ops 0:3e147aae9ba8 0.39 0.17 •coordinateddailyoperationsandal -cv-orange_ops 0:b786faa44990 0.41 0.17 •monitoredstocklevelsandinitiate -cv-orange_ops 0:9806038f6123 0.44 0.17 •assistedwithkpireportingandperf -cv-orange_ops 0:c2ec5b8c794d 0.46 0.17 •ensuredcompliancewithcompanypol -cv-orange_ops 0:a691a9aab3fc 0.53 0.17 keykpisnapshot(recent12months) -cv-orange_ops 0:b5f6dbae04bd 0.32 0.29 15% -cv-orange_ops 0:e918ea42a538 0.32 0.32 99.2% -cv-orange_ops 0:16906b6f3827 0.32 0.29 98.4% -cv-orange_ops 0:bd1b16004d22 0.53 0.39 productivity -cv-orange_ops 0:b11a85b296a9 0.53 0.33 inventory -cv-orange_ops 0:b1e25044bf23 0.53 0.33 on-time -cv-orange_ops 0:05595e942a13 0.53 0.36 losttime -cv-orange_ops 0:e20a548f23fa 0.51 0.37 increase -cv-orange_ops 0:5879092f86c5 0.51 0.37 accuracy -cv-orange_ops 0:b4af39d5b65a 0.51 0.31 delivery -cv-orange_ops 0:a6d1765ab64d 0.51 0.35 incidents -cv-orange_ops 0:676dfdd56ad2 0.63 0.17 additionalinformation -cv-orange_ops 0:0945b35c95a8 0.84 0.02 systems:sapewm,manhattanwms,micr -cv-orange_ops 0:44aaa523dc2c 0.84 0.02 languages:english(native) -cv-orange_ops 0:724cc536a24c 0.85 0.02 drivinglicence:fullukdrivinglice -cv-orange_ops 0:9f0e43069d3f 0.86 0.02 interests:strengthtraining,motor -cv-panel 0:8f1010120ed6 -0.65 8.57 jordanrivera -cv-panel 0:2d58f0cadc2d -0.13 8.27 platformengineer -cv-panel 0:89ff05847e96 -0.06 8.54 london,uk|+442055551000 -cv-panel 0:8817bf9310b6 -0.04 8.55 jordan.rivera@example.com|linked -cv-panel 0:1900eab6c028 0.39 8.35 profile -cv-panel 0:80cc87fdc4c4 -0.03 8.35 platformengineerwith10+yearsbuil -cv-panel 0:c323ef4c385f -0.01 8.35 systems.specialisedinhigh-throug -cv-panel 0:3ff1933dba9a 0.01 8.35 typed,snapshot-testedlibrariesth -cv-panel 0:32c1cf49a2fe 0.69 0.15 skills -cv-panel 0:eea537278f83 0.47 0.15 •languages:java21,kotlin,groovy, -cv-panel 0:7e941e729572 0.29 0.15 •document&print:pdfbox,apachepoi -cv-panel 0:9e3166ce2413 0.31 0.15 itext,postscript,icccolourprofil -cv-panel 0:ebc70ed9b71b 0.33 0.15 •layoutengines:customdsldesign,s -cv-panel 0:dd4f24d85605 0.35 0.15 pagination,snapshottesting,visua -cv-panel 0:f5f76d479ec8 0.37 0.15 •build&infrastructure:maven,grad -cv-panel 0:656a2a3e57e0 0.39 0.15 jitpack,docker,jmhbenchmarking -cv-panel 0:9a6921f79b7d 0.45 0.15 •distribution:mavencentral,sonat -cv-panel 0:77a74982066f 0.47 0.15 jitpack,semanticversioningdiscip -cv-panel 0:68bf0109c6f8 1.15 0.15 education -cv-panel 0:871923f4f0f2 0.93 0.15 msccomputerscience-2019-2021 -cv-panel 0:47ce0218bbea 0.95 0.15 universityofmanchester -cv-panel 0:51e1ec7daa5a 0.75 0.15 distinction.thesis:composablelay -cv-panel 0:d10553cd7368 0.77 0.15 deterministicdocumentrendering. -cv-panel 0:ba6d361079f4 0.99 0.15 bscsoftwareengineering-2015-2019 -cv-panel 0:89ad9656f393 1.01 0.15 imperialcollegelondon -cv-panel 0:4c58bcad7242 0.81 0.15 first-classhonours.specialisatio -cv-panel 0:2189b9b3b549 0.83 0.15 analysis. -cv-panel 0:8971b01c36bb 1.05 0.15 oraclejavacertification-2023-202 -cv-panel 0:2669e1f6d55c 1.07 0.15 professionaltrack -cv-panel 0:4f17e3d7d6f4 0.87 0.15 java17platformdeep-dive:records, -cv-panel 0:9e6154a3b625 0.89 0.15 matching,virtualthreads. -cv-panel 0:7b476727faf3 1.57 0.15 additional -cv-panel 0:3f88eb4c530c 1.15 0.15 languages:english(fluent),german -cv-panel 0:5d276fee8c17 1.17 0.15 (basic) -cv-panel 0:ec9d3622395e 1.39 0.15 workeligibility:eligibletoworkin -cv-panel 0:d05b8b335e96 1.21 0.15 opensource:maintainerofgraphcomp -cv-panel 0:2f3b4176123d 1.23 0.15 contributortopdfboxissuetriage. -cv-panel 0:1ae173b42166 1.25 0.15 speaking:jvmsummit2024,devoxxuk2 -cv-panel 0:309255ca6a36 1.27 0.15 declarativedocumentlayout. -cv-panel 0:53e5e7c5a884 0.69 0.16 experience -cv-panel 0:99b44abc1b3e 0.47 0.16 seniorplatformengineer-2024-pres -cv-panel 0:f890faef907f 0.49 0.16 northwindsystems -cv-panel 0:e32ca827bfd5 0.29 0.16 ledthereusabledocument-generatio -cv-panel 0:675f8862fdda 0.31 0.16 hiring,andreportingflowsacross8p -cv-panel 0:93d48fc85054 0.33 0.16 templatemaintenancetimeby70%byre -cv-panel 0:e7f09e2ba7d2 0.35 0.16 scriptsinfavourofonecanonicaleng -cv-panel 0:ded138c59d03 0.57 0.16 softwareengineer-2021-2024 -cv-panel 0:998c1a985022 0.59 0.16 brightleaflabs -cv-panel 0:0ed66ac9265d 0.39 0.16 builtbackendservicesandproductio -cv-panel 0:17c4ef49d4e6 0.41 0.16 pipelinesprocessing2m+documentsp -cv-panel 0:a7dd3c5be76b 0.43 0.16 migrationfromitexttoacustomlayou -cv-panel 0:a35401d8bcad 0.45 0.16 licensingriskandcuttingp99render -cv-panel 0:649d2d9d10d0 0.47 0.16 380ms. -cv-panel 0:019bbdc8d0bb 0.69 0.16 backendengineer-2019-2021 -cv-panel 0:ef148f221e31 0.71 0.16 helixprintco -cv-panel 0:09cc06a649eb 0.51 0.16 maintainedahigh-volumeinvoice-pr -cv-panel 0:090e2184c17b 0.53 0.16 pdfs/year)andauthoredthecomplian -cv-panel 0:6f071fdf7529 0.55 0.16 gatedeverytemplatechange. -cv-panel 0:2577c0f557b2 1.23 0.16 projects -cv-panel 0:b2b029995203 1.01 0.16 •graphcompose(java21,pdfbox,mave -cv-panel 0:81c8132f9792 0.89 0.16 systems.(opensource) -cv-panel 0:753f46e4e01b 0.91 0.16 •templatestudio(kotlin,composede -cv-panel 0:6eb35b5b9a91 0.93 0.16 diff) -cv-panel 0:d919bd2d50b6 0.95 0.16 internaltoolforevaluatingcv,prop -cv-panel 0:245b9e56b9de 0.97 0.16 across14designpresets.pngdiffing -cv-panel 0:6bc2807453c6 0.99 0.16 baselinefreezing. -cv-panel 0:25cdca2beb8b 1.21 0.16 •layoutlint(java21,javaparser,sp -cv-panel 0:30e034b9c7b2 1.03 0.16 staticanalyserthatflagsfragileau -cv-panel 0:e7ad19d64668 1.05 0.16 nestedrows,untypedoffsets,implic -cv-panel 0:95ac1a62c76f 1.07 0.16 theyshiptoproduction. -cv-panel 0:fb1927f88597 1.29 0.16 •chromeforge(java,graphcompose,p -cv-panel 0:bb865a4ccac1 1.11 0.16 editorial-magazinedocumenttoolki -cv-panel 0:8a31ccd889ee 1.13 0.16 cinematiccovers,pullquotes,multi -cv-panel 0:fe63fe18585a 1.15 0.16 callouts. +cv-orange_ops 0:360626c9f718 0.12 0.17 workexperience +cv-orange_ops 0:03f6d636aa6b 0.13 0.20 mar2021–present +cv-orange_ops 0:24c0d4863b50 0.12 0.17 expresslinkdistributionltd|birmi +cv-orange_ops 0:873c40886362 0.05 0.17 •overseedailywarehouseoperations +cv-orange_ops 0:e789c025e038 0.04 0.17 staffacrossinbound,storage,picki +cv-orange_ops 0:005412ac77a3 0.12 0.17 •ensuretimelyandaccurateorderful +cv-orange_ops 0:4e9c4aed8e43 0.09 0.17 •monitorandmaintaininventoryaccu +cv-orange_ops 0:1509c3cbd20f 0.09 0.17 variances. +cv-orange_ops 0:928837818f67 0.16 0.17 •analysekpisandoperationaldatato +cv-orange_ops 0:70ed682534c9 0.13 0.17 •coordinatewithtransportandcusto +cv-orange_ops 0:901159ffc9e3 0.13 0.17 improveservicelevels. +cv-orange_ops 0:947008cdcf98 0.15 0.17 •driveacultureofsafetyandaccount +cv-orange_ops 0:e6b1b813ff0b 0.15 0.17 compliancewithh&sregulations. +cv-orange_ops 0:c8a3bdb04f89 0.17 0.17 •leadcontinuousimprovementinitia +cv-orange_ops 0:e28f5bf00122 0.16 0.17 productivity. +cv-orange_ops 0:bfb9273fea4d 0.17 0.17 warehouseteamleader +cv-orange_ops 0:9a8c213939be 0.21 0.20 may2017–feb2021 +cv-orange_ops 0:df1f256d362d 0.20 0.17 midlandgatelogistics|coventry,uk +cv-orange_ops 0:92d5e6992bc1 0.18 0.17 •ledateamof25warehouseoperatives +cv-orange_ops 0:ec21a3e83856 0.20 0.17 •managedinboundreceipts,putaway, +cv-orange_ops 0:ac1fa66fcf19 0.23 0.17 •maintainedaccuratestockrecordsa +cv-orange_ops 0:195624e8565f 0.25 0.17 •supportedtheimplementationofane +cv-orange_ops 0:dd2458930e31 0.28 0.17 •reducedpickingerrorsby23%throug +cv-orange_ops 0:81219b44ff52 0.23 0.17 warehousecoordinator +cv-orange_ops 0:eb5e95e8b64c 0.27 0.23 jun2015–apr2017 +cv-orange_ops 0:95f3c676853f 0.26 0.17 totalsupplysolutions|northampton +cv-orange_ops 0:3e147aae9ba8 0.24 0.17 •coordinateddailyoperationsandal +cv-orange_ops 0:b786faa44990 0.26 0.17 •monitoredstocklevelsandinitiate +cv-orange_ops 0:9806038f6123 0.29 0.17 •assistedwithkpireportingandperf +cv-orange_ops 0:c2ec5b8c794d 0.31 0.17 •ensuredcompliancewithcompanypol +cv-orange_ops 0:a691a9aab3fc 0.38 0.17 keykpisnapshot(recent12months) +cv-orange_ops 0:b5f6dbae04bd 0.17 0.29 15% +cv-orange_ops 0:e918ea42a538 0.17 0.32 99.2% +cv-orange_ops 0:16906b6f3827 0.17 0.29 98.4% +cv-orange_ops 0:bd1b16004d22 0.38 0.39 productivity +cv-orange_ops 0:b11a85b296a9 0.38 0.33 inventory +cv-orange_ops 0:b1e25044bf23 0.38 0.33 on-time +cv-orange_ops 0:05595e942a13 0.38 0.36 losttime +cv-orange_ops 0:e20a548f23fa 0.36 0.37 increase +cv-orange_ops 0:5879092f86c5 0.36 0.37 accuracy +cv-orange_ops 0:b4af39d5b65a 0.36 0.31 delivery +cv-orange_ops 0:a6d1765ab64d 0.36 0.35 incidents +cv-orange_ops 0:676dfdd56ad2 0.48 0.17 additionalinformation +cv-orange_ops 0:0945b35c95a8 0.69 0.02 systems:sapewm,manhattanwms,micr +cv-orange_ops 0:44aaa523dc2c 0.69 0.02 languages:english(native) +cv-orange_ops 0:724cc536a24c 0.70 0.02 drivinglicence:fullukdrivinglice +cv-orange_ops 0:9f0e43069d3f 0.71 0.02 interests:strengthtraining,motor +cv-panel 0:8f1010120ed6 -0.75 8.57 jordanrivera +cv-panel 0:2d58f0cadc2d -0.23 8.27 platformengineer +cv-panel 0:89ff05847e96 -0.16 8.54 london,uk|+442055551000 +cv-panel 0:8817bf9310b6 -0.14 8.55 jordan.rivera@example.com|linked +cv-panel 0:1900eab6c028 0.19 8.35 profile +cv-panel 0:80cc87fdc4c4 -0.23 8.35 platformengineerwith10+yearsbuil +cv-panel 0:c323ef4c385f -0.21 8.35 systems.specialisedinhigh-throug +cv-panel 0:3ff1933dba9a -0.19 8.35 typed,snapshot-testedlibrariesth +cv-panel 0:32c1cf49a2fe 0.39 0.15 skills +cv-panel 0:eea537278f83 0.17 0.15 •languages:java21,kotlin,groovy, +cv-panel 0:7e941e729572 -0.01 0.15 •document&print:pdfbox,apachepoi +cv-panel 0:9e3166ce2413 0.01 0.15 itext,postscript,icccolourprofil +cv-panel 0:ebc70ed9b71b 0.03 0.15 •layoutengines:customdsldesign,s +cv-panel 0:dd4f24d85605 0.05 0.15 pagination,snapshottesting,visua +cv-panel 0:f5f76d479ec8 0.07 0.15 •build&infrastructure:maven,grad +cv-panel 0:656a2a3e57e0 0.09 0.15 jitpack,docker,jmhbenchmarking +cv-panel 0:9a6921f79b7d 0.15 0.15 •distribution:mavencentral,sonat +cv-panel 0:77a74982066f 0.17 0.15 jitpack,semanticversioningdiscip +cv-panel 0:68bf0109c6f8 0.75 0.15 education +cv-panel 0:871923f4f0f2 0.53 0.15 msccomputerscience-2019-2021 +cv-panel 0:47ce0218bbea 0.55 0.15 universityofmanchester +cv-panel 0:51e1ec7daa5a 0.35 0.15 distinction.thesis:composablelay +cv-panel 0:d10553cd7368 0.37 0.15 deterministicdocumentrendering. +cv-panel 0:ba6d361079f4 0.59 0.15 bscsoftwareengineering-2015-2019 +cv-panel 0:89ad9656f393 0.61 0.15 imperialcollegelondon +cv-panel 0:4c58bcad7242 0.41 0.15 first-classhonours.specialisatio +cv-panel 0:2189b9b3b549 0.43 0.15 analysis. +cv-panel 0:8971b01c36bb 0.65 0.15 oraclejavacertification-2023-202 +cv-panel 0:2669e1f6d55c 0.67 0.15 professionaltrack +cv-panel 0:4f17e3d7d6f4 0.47 0.15 java17platformdeep-dive:records, +cv-panel 0:9e6154a3b625 0.49 0.15 matching,virtualthreads. +cv-panel 0:7b476727faf3 1.07 0.15 additional +cv-panel 0:3f88eb4c530c 0.65 0.15 languages:english(fluent),german +cv-panel 0:5d276fee8c17 0.67 0.15 (basic) +cv-panel 0:ec9d3622395e 0.89 0.15 workeligibility:eligibletoworkin +cv-panel 0:d05b8b335e96 0.71 0.15 opensource:maintainerofgraphcomp +cv-panel 0:2f3b4176123d 0.73 0.15 contributortopdfboxissuetriage. +cv-panel 0:1ae173b42166 0.75 0.15 speaking:jvmsummit2024,devoxxuk2 +cv-panel 0:309255ca6a36 0.77 0.15 declarativedocumentlayout. +cv-panel 0:53e5e7c5a884 0.39 0.16 experience +cv-panel 0:99b44abc1b3e 0.17 0.16 seniorplatformengineer-2024-pres +cv-panel 0:f890faef907f 0.19 0.16 northwindsystems +cv-panel 0:e32ca827bfd5 -0.01 0.16 ledthereusabledocument-generatio +cv-panel 0:675f8862fdda 0.01 0.16 hiring,andreportingflowsacross8p +cv-panel 0:93d48fc85054 0.03 0.16 templatemaintenancetimeby70%byre +cv-panel 0:e7f09e2ba7d2 0.05 0.16 scriptsinfavourofonecanonicaleng +cv-panel 0:ded138c59d03 0.27 0.16 softwareengineer-2021-2024 +cv-panel 0:998c1a985022 0.29 0.16 brightleaflabs +cv-panel 0:0ed66ac9265d 0.09 0.16 builtbackendservicesandproductio +cv-panel 0:17c4ef49d4e6 0.11 0.16 pipelinesprocessing2m+documentsp +cv-panel 0:a7dd3c5be76b 0.13 0.16 migrationfromitexttoacustomlayou +cv-panel 0:a35401d8bcad 0.15 0.16 licensingriskandcuttingp99render +cv-panel 0:649d2d9d10d0 0.17 0.16 380ms. +cv-panel 0:019bbdc8d0bb 0.29 0.16 backendengineer-2019-2021 +cv-panel 0:ef148f221e31 0.31 0.16 helixprintco +cv-panel 0:09cc06a649eb 0.11 0.16 maintainedahigh-volumeinvoice-pr +cv-panel 0:090e2184c17b 0.13 0.16 pdfs/year)andauthoredthecomplian +cv-panel 0:6f071fdf7529 0.15 0.16 gatedeverytemplatechange. +cv-panel 0:2577c0f557b2 0.73 0.16 projects +cv-panel 0:b2b029995203 0.51 0.16 •graphcompose(java21,pdfbox,mave +cv-panel 0:81c8132f9792 0.39 0.16 systems.(opensource) +cv-panel 0:753f46e4e01b 0.41 0.16 •templatestudio(kotlin,composede +cv-panel 0:6eb35b5b9a91 0.43 0.16 diff) +cv-panel 0:d919bd2d50b6 0.45 0.16 internaltoolforevaluatingcv,prop +cv-panel 0:245b9e56b9de 0.47 0.16 across14designpresets.pngdiffing +cv-panel 0:6bc2807453c6 0.49 0.16 baselinefreezing. +cv-panel 0:25cdca2beb8b 0.71 0.16 •layoutlint(java21,javaparser,sp +cv-panel 0:30e034b9c7b2 0.53 0.16 staticanalyserthatflagsfragileau +cv-panel 0:e7ad19d64668 0.55 0.16 nestedrows,untypedoffsets,implic +cv-panel 0:95ac1a62c76f 0.57 0.16 theyshiptoproduction. +cv-panel 0:fb1927f88597 0.79 0.16 •chromeforge(java,graphcompose,p +cv-panel 0:bb865a4ccac1 0.61 0.16 editorial-magazinedocumenttoolki +cv-panel 0:8a31ccd889ee 0.63 0.16 cinematiccovers,pullquotes,multi +cv-panel 0:fe63fe18585a 0.65 0.16 callouts. cv-professional_sidebar 0:093e7d5fdbaa -0.23 0.10 contact cv-professional_sidebar 0:7f459725e1f6 -0.03 0.00 +12345678900 cv-professional_sidebar 0:52bf11c1afe0 -0.08 0.00 your.email@example.com @@ -1442,45 +1442,45 @@ cv-slate_orange 0:f4e999c08086 -0.04 0.07 customerservice,sales,andproject cv-slate_orange 0:41221430e3f8 -0.02 0.07 organizationalskills,andtheabili cv-slate_orange 0:324c4509a3e4 0.00 0.07 managingpriorities,buildingrelat cv-slate_orange 0:57271827af78 0.02 0.07 customersatisfaction,andbusiness -cv-slate_orange 0:c2f296ef30a3 0.10 0.07 professionalexperience -cv-slate_orange 0:da2ea6509bec 0.57 0.07 operationscoordinator -cv-slate_orange 0:e7227bbe0c40 0.53 0.86 jan2022–present -cv-slate_orange 0:9f7cecddf317 0.52 0.07 brightstartlogistics,austin,tx -cv-slate_orange 0:e0bbd6c9782e 0.50 0.07 •coordinatedailyoperationsandsch -cv-slate_orange 0:dc9a542f8db9 0.49 0.07 •developandmaintaindashboardsand -cv-slate_orange 0:66acc2e5b891 0.48 0.07 •streamlinecommunicationbetweend -cv-slate_orange 0:8bd3fd672f95 0.47 0.07 •managevendorrelationshipsandass -cv-slate_orange 0:dd7872236383 0.49 0.07 customersupportspecialist -cv-slate_orange 0:1734c189cfe2 0.45 0.94 jun2020–dec2021 -cv-slate_orange 0:b9dfc8902d16 0.44 0.07 techwavesolutions,remote -cv-slate_orange 0:56391e23e83a 0.42 0.07 •providedtechnicalsupporttocusto -cv-slate_orange 0:7eb50a39cf50 0.41 0.07 •resolvedanaverageof40+inquiries -cv-slate_orange 0:46f632748ba8 0.40 0.07 •createdknowledgebasearticlesand -cv-slate_orange 0:02b44f46125c 0.39 0.07 •collaboratedwithproductandengin -cv-slate_orange 0:a1707ef6164e 0.41 0.07 salesassociate -cv-slate_orange 0:2bc613d4e516 0.37 0.96 mar2019–may2020 -cv-slate_orange 0:bb7253ff7002 0.36 0.07 urbanoutfitters,austin,tx -cv-slate_orange 0:aaa52372c317 -0.06 0.07 •consistentlyexceededsalestarget -cv-slate_orange 0:198e638fe8f3 -0.05 0.09 personalizedcustomerservice. -cv-slate_orange 0:dabead95ee7e 0.34 0.07 •builtandmaintainedstrongcustome -cv-slate_orange 0:ff3f5f9ca7a0 0.33 0.07 •merchandisedfloordisplaysandcon -cv-slate_orange 0:05a39f2908ba 0.32 0.07 •recognizedas“topperformer”forq4 -cv-slate_orange 0:832235539465 0.34 0.07 administrativeassistant/projecta -cv-slate_orange 0:2ccfc04a3ae7 0.30 0.98 may2018–feb2019 -cv-slate_orange 0:cfc5fd80ae80 0.29 0.07 greenfieldnonprofitinitiative,au -cv-slate_orange 0:b8aecb03e7ed 0.27 0.07 •supportedprojectmanagerswithsch -cv-slate_orange 0:77f797d4d64c 0.26 0.07 •managedcalendars,travelarrangem -cv-slate_orange 0:80a7a6cdc723 0.25 0.07 •maintaineddonorrecordsandprepar -cv-slate_orange 0:51539a61bb62 0.24 0.07 •assistedwitheventplanningandcom -cv-slate_orange 0:68bf0109c6f8 -0.15 0.07 education -cv-slate_orange 0:84ba6b88f439 -0.15 0.07 certifications&training -cv-slate_orange 0:9d7190053be6 0.25 0.07 bachelorofartsincommunications -cv-slate_orange 0:f592b4ba6aa4 0.22 0.07 universityoftexasataustin -cv-slate_orange 0:3f84d2e470fe 0.22 0.07 austin,tx•graduatedmay2018 -cv-slate_orange 0:99b337b1faf4 0.25 0.07 •googleprojectmanagementcertific -cv-slate_orange 0:4d1b69dc33a1 0.55 0.07 •hubspotcustomerservicecertifica -cv-slate_orange 0:01a1e16912b7 0.85 0.07 •microsoftexcel:advancedformulas -cv-slate_orange 0:07ef0ade6bb2 1.15 0.07 •servsafefoodhandlercertificatio +cv-slate_orange 0:c2f296ef30a3 0.00 0.07 professionalexperience +cv-slate_orange 0:da2ea6509bec 0.47 0.07 operationscoordinator +cv-slate_orange 0:e7227bbe0c40 0.43 0.86 jan2022–present +cv-slate_orange 0:9f7cecddf317 0.42 0.07 brightstartlogistics,austin,tx +cv-slate_orange 0:e0bbd6c9782e 0.40 0.07 •coordinatedailyoperationsandsch +cv-slate_orange 0:dc9a542f8db9 0.39 0.07 •developandmaintaindashboardsand +cv-slate_orange 0:66acc2e5b891 0.38 0.07 •streamlinecommunicationbetweend +cv-slate_orange 0:8bd3fd672f95 0.37 0.07 •managevendorrelationshipsandass +cv-slate_orange 0:dd7872236383 0.39 0.07 customersupportspecialist +cv-slate_orange 0:1734c189cfe2 0.35 0.94 jun2020–dec2021 +cv-slate_orange 0:b9dfc8902d16 0.34 0.07 techwavesolutions,remote +cv-slate_orange 0:56391e23e83a 0.32 0.07 •providedtechnicalsupporttocusto +cv-slate_orange 0:7eb50a39cf50 0.31 0.07 •resolvedanaverageof40+inquiries +cv-slate_orange 0:46f632748ba8 0.30 0.07 •createdknowledgebasearticlesand +cv-slate_orange 0:02b44f46125c 0.29 0.07 •collaboratedwithproductandengin +cv-slate_orange 0:a1707ef6164e 0.31 0.07 salesassociate +cv-slate_orange 0:2bc613d4e516 0.27 0.96 mar2019–may2020 +cv-slate_orange 0:bb7253ff7002 0.26 0.07 urbanoutfitters,austin,tx +cv-slate_orange 0:aaa52372c317 -0.16 0.07 •consistentlyexceededsalestarget +cv-slate_orange 0:198e638fe8f3 -0.15 0.09 personalizedcustomerservice. +cv-slate_orange 0:dabead95ee7e 0.24 0.07 •builtandmaintainedstrongcustome +cv-slate_orange 0:ff3f5f9ca7a0 0.23 0.07 •merchandisedfloordisplaysandcon +cv-slate_orange 0:05a39f2908ba 0.22 0.07 •recognizedas“topperformer”forq4 +cv-slate_orange 0:832235539465 0.24 0.07 administrativeassistant/projecta +cv-slate_orange 0:2ccfc04a3ae7 0.20 0.98 may2018–feb2019 +cv-slate_orange 0:cfc5fd80ae80 0.19 0.07 greenfieldnonprofitinitiative,au +cv-slate_orange 0:b8aecb03e7ed 0.17 0.07 •supportedprojectmanagerswithsch +cv-slate_orange 0:77f797d4d64c 0.16 0.07 •managedcalendars,travelarrangem +cv-slate_orange 0:80a7a6cdc723 0.15 0.07 •maintaineddonorrecordsandprepar +cv-slate_orange 0:51539a61bb62 0.14 0.07 •assistedwitheventplanningandcom +cv-slate_orange 0:68bf0109c6f8 -0.25 0.07 education +cv-slate_orange 0:84ba6b88f439 -0.25 0.07 certifications&training +cv-slate_orange 0:9d7190053be6 0.15 0.07 bachelorofartsincommunications +cv-slate_orange 0:f592b4ba6aa4 0.12 0.07 universityoftexasataustin +cv-slate_orange 0:3f84d2e470fe 0.12 0.07 austin,tx•graduatedmay2018 +cv-slate_orange 0:99b337b1faf4 0.15 0.07 •googleprojectmanagementcertific +cv-slate_orange 0:4d1b69dc33a1 0.45 0.07 •hubspotcustomerservicecertifica +cv-slate_orange 0:01a1e16912b7 0.75 0.07 •microsoftexcel:advancedformulas +cv-slate_orange 0:07ef0ade6bb2 1.05 0.07 •servsafefoodhandlercertificatio cv-teal_pulse 0:a5800de7a5df -1.87 0.06 isabellamoore cv-teal_pulse 0:aea71faf1482 -0.38 0.06 registerednurse cv-teal_pulse 0:613c7b77c405 1.08 0.17 manchester,unitedkingdom @@ -3657,19 +3657,19 @@ letter-nordic_clean 0:26e89af4523d -0.38 0.10 ienjoytranslatingfuzzyworkflowre letter-nordic_clean 0:27c5581ffbbc -0.39 0.10 restoftheteam. letter-nordic_clean 0:a71e98216baa -0.14 0.10 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.14 0.10 sincerely, -letter-panel 0:8f1010120ed6 -0.65 8.57 jordanrivera -letter-panel 0:8f1010120ed6#1 0.16 0.10 jordanrivera -letter-panel 0:2d58f0cadc2d -0.13 8.27 platformengineer -letter-panel 0:89ff05847e96 -0.06 8.54 london,uk|+442055551000 -letter-panel 0:8817bf9310b6 -0.04 8.55 jordan.rivera@example.com|linked -letter-panel 0:bef81b541365 0.01 0.10 dearhiringteamatnorthwindsystems -letter-panel 0:ab54410ead82 -0.17 0.10 iamexcitedtosharemyinterestinthe -letter-panel 0:9185168d2cf8 -0.15 0.10 document-generationsystemsthatba -letter-panel 0:0c42fe9f3491 -0.13 0.10 ienjoytranslatingfuzzyworkflowre -letter-panel 0:dda41d31bb3c -0.11 0.10 thatmakeadoptioneasierfortherest -letter-panel 0:7c5a9817c868 -0.09 0.10 iwouldwelcometheopportunitytobri -letter-panel 0:4012eb4b05db -0.07 0.10 group. -letter-panel 0:80a6a628ad52 0.15 0.10 sincerely, +letter-panel 0:8f1010120ed6 -0.75 8.57 jordanrivera +letter-panel 0:8f1010120ed6#1 0.06 0.10 jordanrivera +letter-panel 0:2d58f0cadc2d -0.23 8.27 platformengineer +letter-panel 0:89ff05847e96 -0.16 8.54 london,uk|+442055551000 +letter-panel 0:8817bf9310b6 -0.14 8.55 jordan.rivera@example.com|linked +letter-panel 0:bef81b541365 -0.09 0.10 dearhiringteamatnorthwindsystems +letter-panel 0:ab54410ead82 -0.27 0.10 iamexcitedtosharemyinterestinthe +letter-panel 0:9185168d2cf8 -0.25 0.10 document-generationsystemsthatba +letter-panel 0:0c42fe9f3491 -0.23 0.10 ienjoytranslatingfuzzyworkflowre +letter-panel 0:dda41d31bb3c -0.21 0.10 thatmakeadoptioneasierfortherest +letter-panel 0:7c5a9817c868 -0.19 0.10 iwouldwelcometheopportunitytobri +letter-panel 0:4012eb4b05db -0.17 0.10 group. +letter-panel 0:80a6a628ad52 0.05 0.10 sincerely, letter-sidebar_portrait 0:8f1010120ed6 -0.73 0.14 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.13 0.10 jordanrivera letter-sidebar_portrait 0:2d58f0cadc2d -0.23 0.49 platformengineer diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv index 6fe4a1044..939b8b05f 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv @@ -1,27 +1,27 @@ # libreoffice build 420(Build:2) on linux document engine_pages editor_pages lines matched median p90 over2 -cv-blue_banner 2 2 54 52 0.14 0.46 0 +cv-blue_banner 2 2 54 52 0.13 0.45 0 cv-boxed_sections 2 2 58 58 0.26 0.37 0 cv-centered_headline 2 2 58 56 0.14 0.32 0 cv-charcoal_gold 1 1 85 83 0.17 0.24 0 cv-classic_serif 2 2 57 54 0.26 0.31 0 -cv-compact_mono 1 1 58 58 0.24 0.83 0 +cv-compact_mono 1 1 58 58 0.17 0.32 0 cv-editorial_blue 2 2 82 82 0.08 0.30 0 -cv-engineering_resume 1 1 57 57 0.28 0.41 0 +cv-engineering_resume 1 1 57 57 0.26 0.38 0 cv-executive 2 2 60 60 0.26 0.50 0 cv-midnight_navy 1 1 86 84 0.28 0.87 0 cv-minimal_underlined 2 2 59 59 0.35 0.64 0 cv-mint_editorial 2 2 59 59 0.27 0.60 0 cv-modern_professional 2 2 61 59 0.23 0.25 0 -cv-monogram_sidebar 1 1 53 50 0.25 0.62 0 +cv-monogram_sidebar 1 1 53 50 0.22 0.44 0 cv-navy_sidebar 1 1 71 71 0.20 0.45 0 cv-nordic_clean 1 1 63 58 0.25 0.43 0 -cv-orange_ops 1 1 108 106 0.26 0.53 0 -cv-panel 1 1 79 74 0.75 1.21 0 +cv-orange_ops 1 1 108 106 0.18 0.38 0 +cv-panel 1 1 79 74 0.39 0.73 0 cv-professional_sidebar 1 1 68 64 0.36 0.58 0 cv-serif_headline 1 1 103 103 0.44 0.88 0 cv-sidebar_portrait 1 1 49 49 0.17 0.31 0 -cv-slate_orange 1 1 87 86 0.42 1.02 0 +cv-slate_orange 1 1 87 86 0.32 1.02 0 cv-teal_pulse 1 1 57 57 0.22 0.63 0 cv-terracotta_rail 1 1 102 102 0.44 0.94 0 cv-timeline_minimal 2 2 89 87 0.45 0.49 0 @@ -53,7 +53,7 @@ letter-mint-editorial-letter 1 1 10 10 0.29 0.29 0 letter-modern_professional 1 1 12 12 0.08 0.22 0 letter-monogram_sidebar 1 1 12 12 0.23 0.37 0 letter-nordic_clean 1 1 15 15 0.16 0.38 0 -letter-panel 1 1 13 13 0.13 0.17 0 +letter-panel 1 1 13 13 0.19 0.27 0 letter-sidebar_portrait 1 1 12 12 0.43 0.51 0 letter-timeline_minimal 1 1 15 15 0.33 0.53 0 proposal-editorial 2 2 132 129 44.49 45.38 72 diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv index fad338999..e3c6e035c 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv @@ -47,10 +47,10 @@ cv-blue_banner 0:33c35e9d236d 0.00 0.10 speaking:jvmsummit2024,devoxxuk2 cv-blue_banner 0:2577c0f557b2 0.01 0.34 projects cv-blue_banner 0:47f6c54ae700 -0.30 0.10 graphcompose(java21,pdfbox,maven cv-blue_banner 0:7fea658a4957 0.00 0.10 productioncv/invoice/proposalpip -cv-blue_banner 0:b56776d153e9 0.06 0.10 templatestudio(kotlin,composedes -cv-blue_banner 0:88b226d51fe1 0.36 0.10 pngdiffing,side-by-sidelayout,ba -cv-blue_banner 0:339245d63103 0.42 0.10 layoutlint(java21,javaparser,spo -cv-blue_banner 0:8c87b84946f3 0.72 0.10 beforetheyshiptoproduction. +cv-blue_banner 0:b56776d153e9 -0.29 0.10 templatestudio(kotlin,composedes +cv-blue_banner 0:88b226d51fe1 0.01 0.10 pngdiffing,side-by-sidelayout,ba +cv-blue_banner 0:339245d63103 -0.28 0.10 layoutlint(java21,javaparser,spo +cv-blue_banner 0:8c87b84946f3 0.02 0.10 beforetheyshiptoproduction. cv-boxed_sections 0:8f1010120ed6 0.46 2.20 jordanrivera cv-boxed_sections 0:8d7a2cca3060 0.23 0.22 +442055551000|jordan.rivera@exam cv-boxed_sections 0:b944906ed84c 0.28 1.49 professionalsummary @@ -308,30 +308,30 @@ cv-compact_mono 0:32c1cf49a2fe 0.24 0.10 skills cv-compact_mono 0:551282493299 -0.11 0.10 languagesjava21,kotlin,groovy,py cv-compact_mono 0:8f5cfd05d621 -0.32 0.10 document&printpdfbox,apachepoi cv-compact_mono 0:148ff6990529 -0.21 0.10 (docx/xlsx),itext,postscript -cv-compact_mono 0:862bd50bcc32 -0.20 0.10 layoutenginescustomdsldesign,sem -cv-compact_mono 0:ec4f3e745260 -0.09 0.10 layouttrees,pagination,snapshott -cv-compact_mono 0:55a8b2742c06 -0.08 0.10 build&infrastructuremaven,gradle -cv-compact_mono 0:1649ba79bc7a 0.03 0.10 actions,jitpack -cv-compact_mono 0:d4ac2ee01f81 0.04 0.10 testingjunit5,assertj,pdfbox-bas -cv-compact_mono 0:b04e6ebfb02b 0.15 0.10 diff,layout-graphsnapshots -cv-compact_mono 0:93c9f742ef14 0.16 0.10 distributionmavencentral,sonatyp -cv-compact_mono 0:8f21bd149ad7 0.27 0.10 gpgsigning,jitpack -cv-compact_mono 0:68bf0109c6f8 0.83 0.10 education -cv-compact_mono 0:9ad8d9ef1711 0.33 0.10 msccomputerscience/universityof -cv-compact_mono 0:594f6dd11e20 0.40 0.10 manchester/2019-2021 -cv-compact_mono 0:387dc0387824 0.43 0.10 bscsoftwareengineering/imperialc -cv-compact_mono 0:453806946a88 0.50 0.10 london/2015-2019 -cv-compact_mono 0:7816e7a28b71 0.53 0.10 oraclejavacertification/professi -cv-compact_mono 0:d40b22f00acb 0.75 0.10 2023-2024 -cv-compact_mono 0:7b476727faf3 1.31 0.10 additional -cv-compact_mono 0:ecc25e73b19b 0.80 0.10 languages:english(fluent),german -cv-compact_mono 0:ac7f0ee6a49e 0.81 0.10 (intermediate),spanish(basic) -cv-compact_mono 0:970ca9d789c2 0.82 0.10 workeligibility:eligibletoworkin -cv-compact_mono 0:0735680e2596 0.83 0.10 theeu -cv-compact_mono 0:8051a4b5e34f 0.84 0.10 opensource:maintainerofgraphcomp -cv-compact_mono 0:08c2e869a75b 0.85 0.10 regularcontributortopdfboxissuet -cv-compact_mono 0:12dcd1343975 0.86 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-compact_mono 0:3aea7f90f8ed 0.87 0.10 —bothondeclarativedocumentlayout +cv-compact_mono 0:862bd50bcc32 -0.30 0.10 layoutenginescustomdsldesign,sem +cv-compact_mono 0:ec4f3e745260 -0.19 0.10 layouttrees,pagination,snapshott +cv-compact_mono 0:55a8b2742c06 -0.28 0.10 build&infrastructuremaven,gradle +cv-compact_mono 0:1649ba79bc7a -0.17 0.10 actions,jitpack +cv-compact_mono 0:d4ac2ee01f81 -0.26 0.10 testingjunit5,assertj,pdfbox-bas +cv-compact_mono 0:b04e6ebfb02b -0.15 0.10 diff,layout-graphsnapshots +cv-compact_mono 0:93c9f742ef14 -0.24 0.10 distributionmavencentral,sonatyp +cv-compact_mono 0:8f21bd149ad7 -0.13 0.10 gpgsigning,jitpack +cv-compact_mono 0:68bf0109c6f8 0.33 0.10 education +cv-compact_mono 0:9ad8d9ef1711 -0.17 0.10 msccomputerscience/universityof +cv-compact_mono 0:594f6dd11e20 -0.10 0.10 manchester/2019-2021 +cv-compact_mono 0:387dc0387824 -0.17 0.10 bscsoftwareengineering/imperialc +cv-compact_mono 0:453806946a88 -0.10 0.10 london/2015-2019 +cv-compact_mono 0:7816e7a28b71 -0.17 0.10 oraclejavacertification/professi +cv-compact_mono 0:d40b22f00acb 0.05 0.10 2023-2024 +cv-compact_mono 0:7b476727faf3 0.31 0.10 additional +cv-compact_mono 0:ecc25e73b19b -0.20 0.10 languages:english(fluent),german +cv-compact_mono 0:ac7f0ee6a49e -0.19 0.10 (intermediate),spanish(basic) +cv-compact_mono 0:970ca9d789c2 -0.18 0.10 workeligibility:eligibletoworkin +cv-compact_mono 0:0735680e2596 -0.17 0.10 theeu +cv-compact_mono 0:8051a4b5e34f -0.16 0.10 opensource:maintainerofgraphcomp +cv-compact_mono 0:08c2e869a75b -0.15 0.10 regularcontributortopdfboxissuet +cv-compact_mono 0:12dcd1343975 -0.14 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-compact_mono 0:3aea7f90f8ed -0.13 0.10 —bothondeclarativedocumentlayout cv-compact_mono 0:1900eab6c028 0.24 0.09 profile cv-compact_mono 0:3828b9718a0d -0.35 0.09 platformengineerwith10+yearsbuil cv-compact_mono 0:f6b5e93ccadd -0.34 0.09 engines,anddeveloper-facingtempl @@ -493,12 +493,12 @@ cv-engineering_resume 0:8b5abdc8c0d7 -0.23 0.10 technicalevidence cv-engineering_resume 0:e2fbf67cb588 0.41 0.05 graphcompose(java21,pdfbox,maven cv-engineering_resume 0:eb5950729749 0.27 0.05 templates,snapshottesting.powers cv-engineering_resume 0:81c8132f9792 0.19 0.05 systems.(opensource) -cv-engineering_resume 0:643428f0ebf8 0.68 0.05 templatestudio(kotlin,composedes -cv-engineering_resume 0:c259a0e7581e 0.39 0.05 invoiceoutputacross14designprese -cv-engineering_resume 0:c944ee08a5bf 0.88 0.05 layoutlint(java21,javaparser,spo -cv-engineering_resume 0:2d80d05697ad 0.59 0.05 untypedoffsets,implicitpagebreak -cv-engineering_resume 0:6793d28e9783 1.08 0.05 chromeforge(java,graphcompose,pa -cv-engineering_resume 0:e3cfea265b3b 0.79 0.05 graphcompose:cinematiccovers,pul +cv-engineering_resume 0:643428f0ebf8 0.18 0.05 templatestudio(kotlin,composedes +cv-engineering_resume 0:c259a0e7581e -0.11 0.05 invoiceoutputacross14designprese +cv-engineering_resume 0:c944ee08a5bf 0.08 0.05 layoutlint(java21,javaparser,spo +cv-engineering_resume 0:2d80d05697ad -0.21 0.05 untypedoffsets,implicitpagebreak +cv-engineering_resume 0:6793d28e9783 -0.02 0.05 chromeforge(java,graphcompose,pa +cv-engineering_resume 0:e3cfea265b3b -0.31 0.05 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 -0.50 0.10 jordanrivera cv-executive 0:89ff05847e96 -0.28 0.10 london,uk|+442055551000 cv-executive 0:8817bf9310b6 -0.30 0.10 jordan.rivera@example.com|linked @@ -862,14 +862,14 @@ cv-monogram_sidebar 0:e77e909f6ff5 -0.41 0.06 builtbackendservicesandproductio cv-monogram_sidebar 0:97c59b2fdb55 -0.41 0.06 drovethemigrationfromitexttoacus cv-monogram_sidebar 0:2c2b19cf214d -0.41 0.06 latencyfrom1.4sto380ms. cv-monogram_sidebar 0:2577c0f557b2 -0.19 0.06 projects -cv-monogram_sidebar 0:abdcacccefe1 0.28 0.06 templatestudio(kotlin,composedes -cv-monogram_sidebar 0:041a43f9a663 0.57 0.06 andinvoiceoutputacross14designpr -cv-monogram_sidebar 0:f87e2f0c02dc 0.62 0.06 layoutlint(java21,javaparser,spo -cv-monogram_sidebar 0:a646f74483b1 0.91 0.06 rows,untypedoffsets,implicitpage -cv-monogram_sidebar 0:676dfdd56ad2 1.18 0.06 additionalinformation -cv-monogram_sidebar 0:f20997652453 1.21 0.06 languages:english(fluent),german -cv-monogram_sidebar 0:ec9d3622395e 1.20 0.06 workeligibility:eligibletoworkin -cv-monogram_sidebar 0:dd20ae01c3cf 1.19 0.06 opensource:maintainerofgraphcomp +cv-monogram_sidebar 0:abdcacccefe1 -0.42 0.06 templatestudio(kotlin,composedes +cv-monogram_sidebar 0:041a43f9a663 -0.13 0.06 andinvoiceoutputacross14designpr +cv-monogram_sidebar 0:f87e2f0c02dc -0.43 0.06 layoutlint(java21,javaparser,spo +cv-monogram_sidebar 0:a646f74483b1 -0.14 0.06 rows,untypedoffsets,implicitpage +cv-monogram_sidebar 0:676dfdd56ad2 -0.22 0.06 additionalinformation +cv-monogram_sidebar 0:f20997652453 -0.19 0.06 languages:english(fluent),german +cv-monogram_sidebar 0:ec9d3622395e -0.20 0.06 workeligibility:eligibletoworkin +cv-monogram_sidebar 0:dd20ae01c3cf -0.21 0.06 opensource:maintainerofgraphcomp cv-navy_sidebar 0:9fdaa20e32a0 0.24 0.10 oliviamartinez cv-navy_sidebar 0:093e7d5fdbaa -0.29 0.10 contact cv-navy_sidebar 0:01dcad830244 -0.08 0.10 +1(555)123-4567 @@ -967,16 +967,16 @@ cv-nordic_clean 0:43ad67a4e3f5 -0.12 0.10 signing,jitpack,semanticversioni cv-nordic_clean 0:68bf0109c6f8 -0.04 0.10 education cv-nordic_clean 0:904a600c3869 -0.12 0.10 msccomputerscience/universityofm cv-nordic_clean 0:3fa772117260 0.07 0.10 2019-2021 -cv-nordic_clean 0:78a380e4d1f0 0.10 0.10 bscsoftwareengineering/imperialc -cv-nordic_clean 0:30f9262640a0 0.29 0.10 2015-2019 -cv-nordic_clean 0:7b476727faf3 0.60 0.10 additional -cv-nordic_clean 0:3b0f5db9217f 0.47 0.10 languages:english(fluent),german -cv-nordic_clean 0:d8a971cea795 0.45 0.10 spanish(basic) -cv-nordic_clean 0:ec9d3622395e 0.68 0.10 workeligibility:eligibletoworkin -cv-nordic_clean 0:d05b8b335e96 0.41 0.10 opensource:maintainerofgraphcomp -cv-nordic_clean 0:2f3b4176123d 0.39 0.10 contributortopdfboxissuetriage. -cv-nordic_clean 0:b6b5a250cb72 0.37 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-nordic_clean 0:7ead14c50085 0.35 0.10 ondeclarativedocumentlayout. +cv-nordic_clean 0:78a380e4d1f0 -0.10 0.10 bscsoftwareengineering/imperialc +cv-nordic_clean 0:30f9262640a0 0.09 0.10 2015-2019 +cv-nordic_clean 0:7b476727faf3 0.00 0.10 additional +cv-nordic_clean 0:3b0f5db9217f -0.13 0.10 languages:english(fluent),german +cv-nordic_clean 0:d8a971cea795 -0.15 0.10 spanish(basic) +cv-nordic_clean 0:ec9d3622395e 0.08 0.10 workeligibility:eligibletoworkin +cv-nordic_clean 0:d05b8b335e96 -0.19 0.10 opensource:maintainerofgraphcomp +cv-nordic_clean 0:2f3b4176123d -0.21 0.10 contributortopdfboxissuetriage. +cv-nordic_clean 0:b6b5a250cb72 -0.23 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-nordic_clean 0:7ead14c50085 -0.25 0.10 ondeclarativedocumentlayout. cv-nordic_clean 0:53e5e7c5a884 -0.26 0.11 experience cv-nordic_clean 0:4977534824cc -0.18 0.11 seniorplatformengineer/2024-pres cv-nordic_clean 0:f890faef907f -0.14 0.11 northwindsystems @@ -993,91 +993,91 @@ cv-nordic_clean 0:ef148f221e31 -0.14 0.11 helixprintco cv-nordic_clean 0:41d451f465c2 -0.37 0.11 maintainedahigh-volumeinvoice-pr cv-nordic_clean 0:6859fed08b66 -0.38 0.11 harnessthatgatedeverytemplatecha cv-nordic_clean 0:d94eccbb1fbe -0.27 0.11 selectedprojects -cv-nordic_clean 0:643428f0ebf8 -0.05 0.11 templatestudio(kotlin,composedes -cv-nordic_clean 0:c259a0e7581e 0.09 0.11 invoiceoutputacross14designprese -cv-nordic_clean 0:f87e2f0c02dc 0.11 0.11 layoutlint(java21,javaparser,spo -cv-nordic_clean 0:a646f74483b1 0.25 0.11 rows,untypedoffsets,implicitpage -cv-nordic_clean 0:6793d28e9783 0.27 0.11 chromeforge(java,graphcompose,pa -cv-nordic_clean 0:e3cfea265b3b 0.41 0.11 graphcompose:cinematiccovers,pul +cv-nordic_clean 0:643428f0ebf8 -0.40 0.11 templatestudio(kotlin,composedes +cv-nordic_clean 0:c259a0e7581e -0.26 0.11 invoiceoutputacross14designprese +cv-nordic_clean 0:f87e2f0c02dc -0.39 0.11 layoutlint(java21,javaparser,spo +cv-nordic_clean 0:a646f74483b1 -0.25 0.11 rows,untypedoffsets,implicitpage +cv-nordic_clean 0:6793d28e9783 -0.38 0.11 chromeforge(java,graphcompose,pa +cv-nordic_clean 0:e3cfea265b3b -0.24 0.11 graphcompose:cinematiccovers,pul cv-orange_ops 0:8157f110feec 77.81 0.12 warehouseoperationssupervisor cv-orange_ops 0:a8acc3a90a7b 77.92 -0.03 +447700900123 cv-orange_ops 0:e6da1125d5d5 77.92 -0.42 marcus.bennett@email.com cv-orange_ops 0:6a3bd39f358d 77.92 -0.78 birmingham,westmidlands,uk cv-orange_ops 0:84308bea4540 77.92 -1.07 linkedin -cv-panel 0:8f1010120ed6 -0.65 0.32 jordanrivera -cv-panel 0:2d58f0cadc2d -0.13 0.07 platformengineer -cv-panel 0:89ff05847e96 -0.06 0.29 london,uk|+442055551000 -cv-panel 0:8817bf9310b6 -0.04 0.35 jordan.rivera@example.com|linked -cv-panel 0:1900eab6c028 0.39 0.10 profile -cv-panel 0:80cc87fdc4c4 -0.03 0.10 platformengineerwith10+yearsbuil -cv-panel 0:c323ef4c385f -0.01 0.10 systems.specialisedinhigh-throug -cv-panel 0:3ff1933dba9a 0.01 0.10 typed,snapshot-testedlibrariesth -cv-panel 0:32c1cf49a2fe 0.69 0.15 skills -cv-panel 0:eea537278f83 0.47 0.15 •languages:java21,kotlin,groovy, -cv-panel 0:7e941e729572 0.29 0.15 •document&print:pdfbox,apachepoi -cv-panel 0:9e3166ce2413 0.31 0.15 itext,postscript,icccolourprofil -cv-panel 0:ebc70ed9b71b 0.33 0.15 •layoutengines:customdsldesign,s -cv-panel 0:dd4f24d85605 0.35 0.15 pagination,snapshottesting,visua -cv-panel 0:f5f76d479ec8 0.37 0.15 •build&infrastructure:maven,grad -cv-panel 0:656a2a3e57e0 0.39 0.15 jitpack,docker,jmhbenchmarking -cv-panel 0:9a6921f79b7d 0.45 0.15 •distribution:mavencentral,sonat -cv-panel 0:77a74982066f 0.47 0.15 jitpack,semanticversioningdiscip -cv-panel 0:68bf0109c6f8 1.15 0.15 education -cv-panel 0:871923f4f0f2 0.93 0.15 msccomputerscience-2019-2021 -cv-panel 0:47ce0218bbea 0.95 0.15 universityofmanchester -cv-panel 0:51e1ec7daa5a 0.75 0.15 distinction.thesis:composablelay -cv-panel 0:d10553cd7368 0.77 0.15 deterministicdocumentrendering. -cv-panel 0:ba6d361079f4 0.99 0.15 bscsoftwareengineering-2015-2019 -cv-panel 0:89ad9656f393 1.01 0.15 imperialcollegelondon -cv-panel 0:4c58bcad7242 0.81 0.15 first-classhonours.specialisatio -cv-panel 0:2189b9b3b549 0.83 0.15 analysis. -cv-panel 0:8971b01c36bb 1.05 0.15 oraclejavacertification-2023-202 -cv-panel 0:2669e1f6d55c 1.07 0.15 professionaltrack -cv-panel 0:4f17e3d7d6f4 0.87 0.15 java17platformdeep-dive:records, -cv-panel 0:9e6154a3b625 0.89 0.15 matching,virtualthreads. -cv-panel 0:7b476727faf3 1.57 0.15 additional -cv-panel 0:3f88eb4c530c 1.15 0.15 languages:english(fluent),german -cv-panel 0:5d276fee8c17 1.17 0.15 (basic) -cv-panel 0:ec9d3622395e 1.39 0.15 workeligibility:eligibletoworkin -cv-panel 0:d05b8b335e96 1.21 0.15 opensource:maintainerofgraphcomp -cv-panel 0:2f3b4176123d 1.23 0.15 contributortopdfboxissuetriage. -cv-panel 0:1ae173b42166 1.25 0.15 speaking:jvmsummit2024,devoxxuk2 -cv-panel 0:309255ca6a36 1.27 0.15 declarativedocumentlayout. -cv-panel 0:53e5e7c5a884 0.69 0.16 experience -cv-panel 0:99b44abc1b3e 0.47 0.16 seniorplatformengineer-2024-pres -cv-panel 0:f890faef907f 0.49 0.16 northwindsystems -cv-panel 0:e32ca827bfd5 0.29 0.16 ledthereusabledocument-generatio -cv-panel 0:675f8862fdda 0.31 0.16 hiring,andreportingflowsacross8p -cv-panel 0:93d48fc85054 0.33 0.16 templatemaintenancetimeby70%byre -cv-panel 0:e7f09e2ba7d2 0.35 0.16 scriptsinfavourofonecanonicaleng -cv-panel 0:ded138c59d03 0.57 0.16 softwareengineer-2021-2024 -cv-panel 0:998c1a985022 0.59 0.16 brightleaflabs -cv-panel 0:0ed66ac9265d 0.39 0.16 builtbackendservicesandproductio -cv-panel 0:17c4ef49d4e6 0.41 0.16 pipelinesprocessing2m+documentsp -cv-panel 0:a7dd3c5be76b 0.43 0.16 migrationfromitexttoacustomlayou -cv-panel 0:a35401d8bcad 0.45 0.16 licensingriskandcuttingp99render -cv-panel 0:649d2d9d10d0 0.47 0.16 380ms. -cv-panel 0:019bbdc8d0bb 0.69 0.16 backendengineer-2019-2021 -cv-panel 0:ef148f221e31 0.71 0.16 helixprintco -cv-panel 0:09cc06a649eb 0.51 0.16 maintainedahigh-volumeinvoice-pr -cv-panel 0:090e2184c17b 0.53 0.16 pdfs/year)andauthoredthecomplian -cv-panel 0:6f071fdf7529 0.55 0.16 gatedeverytemplatechange. -cv-panel 0:2577c0f557b2 1.23 0.16 projects -cv-panel 0:b2b029995203 1.01 0.16 •graphcompose(java21,pdfbox,mave -cv-panel 0:81c8132f9792 0.89 0.16 systems.(opensource) -cv-panel 0:753f46e4e01b 0.91 0.16 •templatestudio(kotlin,composede -cv-panel 0:6eb35b5b9a91 0.93 0.16 diff) -cv-panel 0:d919bd2d50b6 0.95 0.16 internaltoolforevaluatingcv,prop -cv-panel 0:245b9e56b9de 0.97 0.16 across14designpresets.pngdiffing -cv-panel 0:6bc2807453c6 0.99 0.16 baselinefreezing. -cv-panel 0:25cdca2beb8b 1.21 0.16 •layoutlint(java21,javaparser,sp -cv-panel 0:30e034b9c7b2 1.03 0.16 staticanalyserthatflagsfragileau -cv-panel 0:e7ad19d64668 1.05 0.16 nestedrows,untypedoffsets,implic -cv-panel 0:95ac1a62c76f 1.07 0.16 theyshiptoproduction. -cv-panel 0:fb1927f88597 1.29 0.16 •chromeforge(java,graphcompose,p -cv-panel 0:bb865a4ccac1 1.11 0.16 editorial-magazinedocumenttoolki -cv-panel 0:8a31ccd889ee 1.13 0.16 cinematiccovers,pullquotes,multi -cv-panel 0:fe63fe18585a 1.15 0.16 callouts. +cv-panel 0:8f1010120ed6 -0.75 0.32 jordanrivera +cv-panel 0:2d58f0cadc2d -0.23 0.07 platformengineer +cv-panel 0:89ff05847e96 -0.16 0.29 london,uk|+442055551000 +cv-panel 0:8817bf9310b6 -0.14 0.35 jordan.rivera@example.com|linked +cv-panel 0:1900eab6c028 0.19 0.10 profile +cv-panel 0:80cc87fdc4c4 -0.23 0.10 platformengineerwith10+yearsbuil +cv-panel 0:c323ef4c385f -0.21 0.10 systems.specialisedinhigh-throug +cv-panel 0:3ff1933dba9a -0.19 0.10 typed,snapshot-testedlibrariesth +cv-panel 0:32c1cf49a2fe 0.39 0.15 skills +cv-panel 0:eea537278f83 0.17 0.15 •languages:java21,kotlin,groovy, +cv-panel 0:7e941e729572 -0.01 0.15 •document&print:pdfbox,apachepoi +cv-panel 0:9e3166ce2413 0.01 0.15 itext,postscript,icccolourprofil +cv-panel 0:ebc70ed9b71b 0.03 0.15 •layoutengines:customdsldesign,s +cv-panel 0:dd4f24d85605 0.05 0.15 pagination,snapshottesting,visua +cv-panel 0:f5f76d479ec8 0.07 0.15 •build&infrastructure:maven,grad +cv-panel 0:656a2a3e57e0 0.09 0.15 jitpack,docker,jmhbenchmarking +cv-panel 0:9a6921f79b7d 0.15 0.15 •distribution:mavencentral,sonat +cv-panel 0:77a74982066f 0.17 0.15 jitpack,semanticversioningdiscip +cv-panel 0:68bf0109c6f8 0.75 0.15 education +cv-panel 0:871923f4f0f2 0.53 0.15 msccomputerscience-2019-2021 +cv-panel 0:47ce0218bbea 0.55 0.15 universityofmanchester +cv-panel 0:51e1ec7daa5a 0.35 0.15 distinction.thesis:composablelay +cv-panel 0:d10553cd7368 0.37 0.15 deterministicdocumentrendering. +cv-panel 0:ba6d361079f4 0.59 0.15 bscsoftwareengineering-2015-2019 +cv-panel 0:89ad9656f393 0.61 0.15 imperialcollegelondon +cv-panel 0:4c58bcad7242 0.41 0.15 first-classhonours.specialisatio +cv-panel 0:2189b9b3b549 0.43 0.15 analysis. +cv-panel 0:8971b01c36bb 0.65 0.15 oraclejavacertification-2023-202 +cv-panel 0:2669e1f6d55c 0.67 0.15 professionaltrack +cv-panel 0:4f17e3d7d6f4 0.47 0.15 java17platformdeep-dive:records, +cv-panel 0:9e6154a3b625 0.49 0.15 matching,virtualthreads. +cv-panel 0:7b476727faf3 1.07 0.15 additional +cv-panel 0:3f88eb4c530c 0.65 0.15 languages:english(fluent),german +cv-panel 0:5d276fee8c17 0.67 0.15 (basic) +cv-panel 0:ec9d3622395e 0.89 0.15 workeligibility:eligibletoworkin +cv-panel 0:d05b8b335e96 0.71 0.15 opensource:maintainerofgraphcomp +cv-panel 0:2f3b4176123d 0.73 0.15 contributortopdfboxissuetriage. +cv-panel 0:1ae173b42166 0.75 0.15 speaking:jvmsummit2024,devoxxuk2 +cv-panel 0:309255ca6a36 0.77 0.15 declarativedocumentlayout. +cv-panel 0:53e5e7c5a884 0.39 0.16 experience +cv-panel 0:99b44abc1b3e 0.17 0.16 seniorplatformengineer-2024-pres +cv-panel 0:f890faef907f 0.19 0.16 northwindsystems +cv-panel 0:e32ca827bfd5 -0.01 0.16 ledthereusabledocument-generatio +cv-panel 0:675f8862fdda 0.01 0.16 hiring,andreportingflowsacross8p +cv-panel 0:93d48fc85054 0.03 0.16 templatemaintenancetimeby70%byre +cv-panel 0:e7f09e2ba7d2 0.05 0.16 scriptsinfavourofonecanonicaleng +cv-panel 0:ded138c59d03 0.27 0.16 softwareengineer-2021-2024 +cv-panel 0:998c1a985022 0.29 0.16 brightleaflabs +cv-panel 0:0ed66ac9265d 0.09 0.16 builtbackendservicesandproductio +cv-panel 0:17c4ef49d4e6 0.11 0.16 pipelinesprocessing2m+documentsp +cv-panel 0:a7dd3c5be76b 0.13 0.16 migrationfromitexttoacustomlayou +cv-panel 0:a35401d8bcad 0.15 0.16 licensingriskandcuttingp99render +cv-panel 0:649d2d9d10d0 0.17 0.16 380ms. +cv-panel 0:019bbdc8d0bb 0.29 0.16 backendengineer-2019-2021 +cv-panel 0:ef148f221e31 0.31 0.16 helixprintco +cv-panel 0:09cc06a649eb 0.11 0.16 maintainedahigh-volumeinvoice-pr +cv-panel 0:090e2184c17b 0.13 0.16 pdfs/year)andauthoredthecomplian +cv-panel 0:6f071fdf7529 0.15 0.16 gatedeverytemplatechange. +cv-panel 0:2577c0f557b2 0.73 0.16 projects +cv-panel 0:b2b029995203 0.51 0.16 •graphcompose(java21,pdfbox,mave +cv-panel 0:81c8132f9792 0.39 0.16 systems.(opensource) +cv-panel 0:753f46e4e01b 0.41 0.16 •templatestudio(kotlin,composede +cv-panel 0:6eb35b5b9a91 0.43 0.16 diff) +cv-panel 0:d919bd2d50b6 0.45 0.16 internaltoolforevaluatingcv,prop +cv-panel 0:245b9e56b9de 0.47 0.16 across14designpresets.pngdiffing +cv-panel 0:6bc2807453c6 0.49 0.16 baselinefreezing. +cv-panel 0:25cdca2beb8b 0.71 0.16 •layoutlint(java21,javaparser,sp +cv-panel 0:30e034b9c7b2 0.53 0.16 staticanalyserthatflagsfragileau +cv-panel 0:e7ad19d64668 0.55 0.16 nestedrows,untypedoffsets,implic +cv-panel 0:95ac1a62c76f 0.57 0.16 theyshiptoproduction. +cv-panel 0:fb1927f88597 0.79 0.16 •chromeforge(java,graphcompose,p +cv-panel 0:bb865a4ccac1 0.61 0.16 editorial-magazinedocumenttoolki +cv-panel 0:8a31ccd889ee 0.63 0.16 cinematiccovers,pullquotes,multi +cv-panel 0:fe63fe18585a 0.65 0.16 callouts. cv-professional_sidebar 0:093e7d5fdbaa -0.23 0.10 contact cv-professional_sidebar 0:7f459725e1f6 -0.03 -0.04 +12345678900 cv-professional_sidebar 0:52bf11c1afe0 -0.08 -0.04 your.email@example.com @@ -1341,45 +1341,45 @@ cv-slate_orange 0:f4e999c08086 -0.04 0.07 customerservice,sales,andproject cv-slate_orange 0:41221430e3f8 -0.02 0.07 organizationalskills,andtheabili cv-slate_orange 0:324c4509a3e4 0.00 0.07 managingpriorities,buildingrelat cv-slate_orange 0:57271827af78 0.02 0.07 customersatisfaction,andbusiness -cv-slate_orange 0:c2f296ef30a3 0.10 0.07 professionalexperience -cv-slate_orange 0:da2ea6509bec 0.57 0.07 operationscoordinator -cv-slate_orange 0:e7227bbe0c40 0.53 0.91 jan2022–present -cv-slate_orange 0:9f7cecddf317 0.52 0.07 brightstartlogistics,austin,tx -cv-slate_orange 0:e0bbd6c9782e 0.50 0.07 •coordinatedailyoperationsandsch -cv-slate_orange 0:dc9a542f8db9 0.49 0.07 •developandmaintaindashboardsand -cv-slate_orange 0:66acc2e5b891 0.48 0.07 •streamlinecommunicationbetweend -cv-slate_orange 0:8bd3fd672f95 0.47 0.07 •managevendorrelationshipsandass -cv-slate_orange 0:dd7872236383 0.49 0.07 customersupportspecialist -cv-slate_orange 0:1734c189cfe2 0.45 0.94 jun2020–dec2021 -cv-slate_orange 0:b9dfc8902d16 0.44 0.07 techwavesolutions,remote -cv-slate_orange 0:56391e23e83a 0.42 0.07 •providedtechnicalsupporttocusto -cv-slate_orange 0:7eb50a39cf50 0.41 0.07 •resolvedanaverageof40+inquiries -cv-slate_orange 0:46f632748ba8 0.40 0.07 •createdknowledgebasearticlesand -cv-slate_orange 0:02b44f46125c 0.39 0.07 •collaboratedwithproductandengin -cv-slate_orange 0:a1707ef6164e 0.41 0.07 salesassociate -cv-slate_orange 0:2bc613d4e516 0.37 1.01 mar2019–may2020 -cv-slate_orange 0:bb7253ff7002 0.36 0.07 urbanoutfitters,austin,tx -cv-slate_orange 0:aaa52372c317 -0.06 0.07 •consistentlyexceededsalestarget -cv-slate_orange 0:198e638fe8f3 -0.05 0.09 personalizedcustomerservice. -cv-slate_orange 0:dabead95ee7e 0.34 0.07 •builtandmaintainedstrongcustome -cv-slate_orange 0:ff3f5f9ca7a0 0.33 0.07 •merchandisedfloordisplaysandcon -cv-slate_orange 0:05a39f2908ba 0.32 0.07 •recognizedas“topperformer”forq4 -cv-slate_orange 0:832235539465 0.34 0.07 administrativeassistant/projecta -cv-slate_orange 0:2ccfc04a3ae7 0.30 0.98 may2018–feb2019 -cv-slate_orange 0:cfc5fd80ae80 0.29 0.07 greenfieldnonprofitinitiative,au -cv-slate_orange 0:b8aecb03e7ed 0.27 0.07 •supportedprojectmanagerswithsch -cv-slate_orange 0:77f797d4d64c 0.26 0.07 •managedcalendars,travelarrangem -cv-slate_orange 0:80a7a6cdc723 0.25 0.07 •maintaineddonorrecordsandprepar -cv-slate_orange 0:51539a61bb62 0.24 0.07 •assistedwitheventplanningandcom -cv-slate_orange 0:68bf0109c6f8 -0.15 0.07 education -cv-slate_orange 0:84ba6b88f439 -0.15 0.07 certifications&training -cv-slate_orange 0:9d7190053be6 0.25 0.07 bachelorofartsincommunications -cv-slate_orange 0:f592b4ba6aa4 0.22 0.07 universityoftexasataustin -cv-slate_orange 0:3f84d2e470fe 0.22 0.07 austin,tx•graduatedmay2018 -cv-slate_orange 0:99b337b1faf4 0.25 0.07 •googleprojectmanagementcertific -cv-slate_orange 0:4d1b69dc33a1 0.55 0.07 •hubspotcustomerservicecertifica -cv-slate_orange 0:01a1e16912b7 0.85 0.07 •microsoftexcel:advancedformulas -cv-slate_orange 0:07ef0ade6bb2 1.15 0.07 •servsafefoodhandlercertificatio +cv-slate_orange 0:c2f296ef30a3 0.00 0.07 professionalexperience +cv-slate_orange 0:da2ea6509bec 0.47 0.07 operationscoordinator +cv-slate_orange 0:e7227bbe0c40 0.43 0.91 jan2022–present +cv-slate_orange 0:9f7cecddf317 0.42 0.07 brightstartlogistics,austin,tx +cv-slate_orange 0:e0bbd6c9782e 0.40 0.07 •coordinatedailyoperationsandsch +cv-slate_orange 0:dc9a542f8db9 0.39 0.07 •developandmaintaindashboardsand +cv-slate_orange 0:66acc2e5b891 0.38 0.07 •streamlinecommunicationbetweend +cv-slate_orange 0:8bd3fd672f95 0.37 0.07 •managevendorrelationshipsandass +cv-slate_orange 0:dd7872236383 0.39 0.07 customersupportspecialist +cv-slate_orange 0:1734c189cfe2 0.35 0.94 jun2020–dec2021 +cv-slate_orange 0:b9dfc8902d16 0.34 0.07 techwavesolutions,remote +cv-slate_orange 0:56391e23e83a 0.32 0.07 •providedtechnicalsupporttocusto +cv-slate_orange 0:7eb50a39cf50 0.31 0.07 •resolvedanaverageof40+inquiries +cv-slate_orange 0:46f632748ba8 0.30 0.07 •createdknowledgebasearticlesand +cv-slate_orange 0:02b44f46125c 0.29 0.07 •collaboratedwithproductandengin +cv-slate_orange 0:a1707ef6164e 0.31 0.07 salesassociate +cv-slate_orange 0:2bc613d4e516 0.27 1.01 mar2019–may2020 +cv-slate_orange 0:bb7253ff7002 0.26 0.07 urbanoutfitters,austin,tx +cv-slate_orange 0:aaa52372c317 -0.16 0.07 •consistentlyexceededsalestarget +cv-slate_orange 0:198e638fe8f3 -0.15 0.09 personalizedcustomerservice. +cv-slate_orange 0:dabead95ee7e 0.24 0.07 •builtandmaintainedstrongcustome +cv-slate_orange 0:ff3f5f9ca7a0 0.23 0.07 •merchandisedfloordisplaysandcon +cv-slate_orange 0:05a39f2908ba 0.22 0.07 •recognizedas“topperformer”forq4 +cv-slate_orange 0:832235539465 0.24 0.07 administrativeassistant/projecta +cv-slate_orange 0:2ccfc04a3ae7 0.20 0.98 may2018–feb2019 +cv-slate_orange 0:cfc5fd80ae80 0.19 0.07 greenfieldnonprofitinitiative,au +cv-slate_orange 0:b8aecb03e7ed 0.17 0.07 •supportedprojectmanagerswithsch +cv-slate_orange 0:77f797d4d64c 0.16 0.07 •managedcalendars,travelarrangem +cv-slate_orange 0:80a7a6cdc723 0.15 0.07 •maintaineddonorrecordsandprepar +cv-slate_orange 0:51539a61bb62 0.14 0.07 •assistedwitheventplanningandcom +cv-slate_orange 0:68bf0109c6f8 -0.25 0.07 education +cv-slate_orange 0:84ba6b88f439 -0.25 0.07 certifications&training +cv-slate_orange 0:9d7190053be6 0.15 0.07 bachelorofartsincommunications +cv-slate_orange 0:f592b4ba6aa4 0.12 0.07 universityoftexasataustin +cv-slate_orange 0:3f84d2e470fe 0.12 0.07 austin,tx•graduatedmay2018 +cv-slate_orange 0:99b337b1faf4 0.15 0.07 •googleprojectmanagementcertific +cv-slate_orange 0:4d1b69dc33a1 0.45 0.07 •hubspotcustomerservicecertifica +cv-slate_orange 0:01a1e16912b7 0.75 0.07 •microsoftexcel:advancedformulas +cv-slate_orange 0:07ef0ade6bb2 1.05 0.07 •servsafefoodhandlercertificatio cv-teal_pulse 0:a5800de7a5df -1.87 0.06 isabellamoore cv-teal_pulse 0:aea71faf1482 -0.38 0.06 registerednurse cv-teal_pulse 0:613c7b77c405 1.08 0.12 manchester,unitedkingdom @@ -3552,19 +3552,19 @@ letter-nordic_clean 0:26e89af4523d -0.38 0.10 ienjoytranslatingfuzzyworkflowre letter-nordic_clean 0:27c5581ffbbc -0.39 0.10 restoftheteam. letter-nordic_clean 0:a71e98216baa -0.14 0.10 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.14 0.10 sincerely, -letter-panel 0:8f1010120ed6 -0.65 0.32 jordanrivera -letter-panel 0:8f1010120ed6#1 0.16 0.10 jordanrivera -letter-panel 0:2d58f0cadc2d -0.13 0.07 platformengineer -letter-panel 0:89ff05847e96 -0.06 0.29 london,uk|+442055551000 -letter-panel 0:8817bf9310b6 -0.04 0.35 jordan.rivera@example.com|linked -letter-panel 0:bef81b541365 0.01 0.10 dearhiringteamatnorthwindsystems -letter-panel 0:ab54410ead82 -0.17 0.10 iamexcitedtosharemyinterestinthe -letter-panel 0:9185168d2cf8 -0.15 0.10 document-generationsystemsthatba -letter-panel 0:0c42fe9f3491 -0.13 0.10 ienjoytranslatingfuzzyworkflowre -letter-panel 0:dda41d31bb3c -0.11 0.10 thatmakeadoptioneasierfortherest -letter-panel 0:7c5a9817c868 -0.09 0.10 iwouldwelcometheopportunitytobri -letter-panel 0:4012eb4b05db -0.07 0.10 group. -letter-panel 0:80a6a628ad52 0.15 0.10 sincerely, +letter-panel 0:8f1010120ed6 -0.75 0.32 jordanrivera +letter-panel 0:8f1010120ed6#1 0.06 0.10 jordanrivera +letter-panel 0:2d58f0cadc2d -0.23 0.07 platformengineer +letter-panel 0:89ff05847e96 -0.16 0.29 london,uk|+442055551000 +letter-panel 0:8817bf9310b6 -0.14 0.35 jordan.rivera@example.com|linked +letter-panel 0:bef81b541365 -0.09 0.10 dearhiringteamatnorthwindsystems +letter-panel 0:ab54410ead82 -0.27 0.10 iamexcitedtosharemyinterestinthe +letter-panel 0:9185168d2cf8 -0.25 0.10 document-generationsystemsthatba +letter-panel 0:0c42fe9f3491 -0.23 0.10 ienjoytranslatingfuzzyworkflowre +letter-panel 0:dda41d31bb3c -0.21 0.10 thatmakeadoptioneasierfortherest +letter-panel 0:7c5a9817c868 -0.19 0.10 iwouldwelcometheopportunitytobri +letter-panel 0:4012eb4b05db -0.17 0.10 group. +letter-panel 0:80a6a628ad52 0.05 0.10 sincerely, letter-sidebar_portrait 0:8f1010120ed6 -0.73 0.14 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.13 0.10 jordanrivera letter-sidebar_portrait 0:2d58f0cadc2d -0.23 0.49 platformengineer diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv index 2adea2502..b4a81c146 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv @@ -1,27 +1,27 @@ # libreoffice build bce0998afefd on windows document engine_pages editor_pages lines matched median p90 over2 -cv-blue_banner 2 2 54 52 0.14 0.46 0 +cv-blue_banner 2 2 54 52 0.13 0.45 0 cv-boxed_sections 2 2 58 58 0.26 0.37 0 cv-centered_headline 2 2 58 56 0.14 0.32 0 cv-charcoal_gold 1 1 85 83 0.17 0.24 0 cv-classic_serif 2 2 57 54 0.26 0.31 0 -cv-compact_mono 1 1 58 58 0.24 0.83 0 +cv-compact_mono 1 1 58 58 0.17 0.32 0 cv-editorial_blue 2 2 82 82 0.08 0.30 0 -cv-engineering_resume 1 1 57 57 0.28 0.41 0 +cv-engineering_resume 1 1 57 57 0.26 0.38 0 cv-executive 2 2 60 60 0.26 0.50 0 cv-midnight_navy 1 1 86 84 0.28 0.87 0 cv-minimal_underlined 2 2 59 59 0.35 0.64 0 cv-mint_editorial 2 2 59 59 0.27 0.60 0 cv-modern_professional 2 2 61 59 0.28 0.30 0 -cv-monogram_sidebar 1 1 53 50 0.25 0.62 0 +cv-monogram_sidebar 1 1 53 50 0.22 0.44 0 cv-navy_sidebar 1 1 71 71 0.20 0.45 0 -cv-nordic_clean 1 1 63 58 0.25 0.41 0 +cv-nordic_clean 1 1 63 58 0.21 0.38 0 cv-orange_ops 1 2 108 5 77.92 77.92 5 -cv-panel 1 1 79 74 0.75 1.21 0 +cv-panel 1 1 79 74 0.39 0.73 0 cv-professional_sidebar 1 1 68 64 0.36 0.58 0 cv-serif_headline 1 1 103 103 0.44 0.88 0 cv-sidebar_portrait 1 1 49 49 0.17 0.31 0 -cv-slate_orange 1 1 87 86 0.42 1.02 0 +cv-slate_orange 1 1 87 86 0.32 1.02 0 cv-teal_pulse 1 1 57 57 0.22 0.64 0 cv-terracotta_rail 1 1 102 102 0.44 0.94 0 cv-timeline_minimal 2 2 89 87 0.45 0.49 0 @@ -53,7 +53,7 @@ letter-mint-editorial-letter 1 1 10 10 0.29 0.29 0 letter-modern_professional 1 1 12 12 0.03 0.27 0 letter-monogram_sidebar 1 1 12 12 0.23 0.37 0 letter-nordic_clean 1 1 15 15 0.16 0.38 0 -letter-panel 1 1 13 13 0.13 0.17 0 +letter-panel 1 1 13 13 0.19 0.27 0 letter-sidebar_portrait 1 1 12 12 0.43 0.51 0 letter-timeline_minimal 1 1 15 15 0.33 0.53 0 proposal-editorial 2 2 132 129 44.49 45.38 72 diff --git a/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv b/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv index 15448d0be..2a7b8e859 100644 --- a/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv @@ -47,10 +47,10 @@ cv-blue_banner 0:33c35e9d236d 0.18 -0.08 speaking:jvmsummit2024,devoxxuk2 cv-blue_banner 0:2577c0f557b2 0.09 -0.43 projects cv-blue_banner 0:47f6c54ae700 -0.16 -0.08 graphcompose(java21,pdfbox,maven cv-blue_banner 0:7fea658a4957 0.16 -0.08 productioncv/invoice/proposalpip -cv-blue_banner 0:b56776d153e9 0.22 -0.08 templatestudio(kotlin,composedes -cv-blue_banner 0:88b226d51fe1 0.54 -0.08 pngdiffing,side-by-sidelayout,ba -cv-blue_banner 0:339245d63103 0.60 -0.08 layoutlint(java21,javaparser,spo -cv-blue_banner 0:8c87b84946f3 0.82 -0.08 beforetheyshiptoproduction. +cv-blue_banner 0:b56776d153e9 -0.14 -0.08 templatestudio(kotlin,composedes +cv-blue_banner 0:88b226d51fe1 0.18 -0.08 pngdiffing,side-by-sidelayout,ba +cv-blue_banner 0:339245d63103 -0.12 -0.08 layoutlint(java21,javaparser,spo +cv-blue_banner 0:8c87b84946f3 0.22 -0.08 beforetheyshiptoproduction. cv-boxed_sections 0:8f1010120ed6 0.54 0.10 jordanrivera cv-boxed_sections 0:8d7a2cca3060 0.20 -0.05 +442055551000|jordan.rivera@exam cv-boxed_sections 0:b944906ed84c 0.34 0.56 professionalsummary @@ -308,30 +308,30 @@ cv-compact_mono 0:32c1cf49a2fe 0.31 -0.04 skills cv-compact_mono 0:551282493299 -0.10 -0.04 languagesjava21,kotlin,groovy,py cv-compact_mono 0:8f5cfd05d621 -0.36 -0.04 document&printpdfbox,apachepoi cv-compact_mono 0:148ff6990529 -0.22 -0.04 (docx/xlsx),itext,postscript -cv-compact_mono 0:862bd50bcc32 -0.22 -0.04 layoutenginescustomdsldesign,sem -cv-compact_mono 0:ec4f3e745260 -0.08 -0.04 layouttrees,pagination,snapshott -cv-compact_mono 0:55a8b2742c06 -0.08 -0.04 build&infrastructuremaven,gradle -cv-compact_mono 0:1649ba79bc7a 0.06 -0.04 actions,jitpack -cv-compact_mono 0:d4ac2ee01f81 0.06 -0.04 testingjunit5,assertj,pdfbox-bas -cv-compact_mono 0:b04e6ebfb02b 0.20 -0.04 diff,layout-graphsnapshots -cv-compact_mono 0:93c9f742ef14 0.20 -0.04 distributionmavencentral,sonatyp -cv-compact_mono 0:8f21bd149ad7 0.37 -0.04 gpgsigning,jitpack -cv-compact_mono 0:68bf0109c6f8 0.94 -0.04 education -cv-compact_mono 0:9ad8d9ef1711 0.34 -0.04 msccomputerscience/universityof -cv-compact_mono 0:594f6dd11e20 0.44 -0.04 manchester/2019-2021 -cv-compact_mono 0:387dc0387824 0.44 -0.04 bscsoftwareengineering/imperialc -cv-compact_mono 0:453806946a88 0.54 -0.04 london/2015-2019 -cv-compact_mono 0:7816e7a28b71 0.54 -0.04 oraclejavacertification/professi -cv-compact_mono 0:d40b22f00acb 0.79 -0.04 2023-2024 -cv-compact_mono 0:7b476727faf3 1.34 -0.04 additional -cv-compact_mono 0:ecc25e73b19b 0.91 -0.04 languages:english(fluent),german -cv-compact_mono 0:ac7f0ee6a49e 0.94 -0.04 (intermediate),spanish(basic) -cv-compact_mono 0:970ca9d789c2 0.86 -0.04 workeligibility:eligibletoworkin -cv-compact_mono 0:0735680e2596 0.89 -0.04 theeu -cv-compact_mono 0:8051a4b5e34f 0.95 -0.04 opensource:maintainerofgraphcomp -cv-compact_mono 0:08c2e869a75b 0.98 -0.04 regularcontributortopdfboxissuet -cv-compact_mono 0:12dcd1343975 0.90 -0.04 speaking:jvmsummit2024,devoxxuk2 -cv-compact_mono 0:3aea7f90f8ed 0.93 -0.04 —bothondeclarativedocumentlayout +cv-compact_mono 0:862bd50bcc32 -0.34 -0.04 layoutenginescustomdsldesign,sem +cv-compact_mono 0:ec4f3e745260 -0.20 -0.04 layouttrees,pagination,snapshott +cv-compact_mono 0:55a8b2742c06 -0.32 -0.04 build&infrastructuremaven,gradle +cv-compact_mono 0:1649ba79bc7a -0.18 -0.04 actions,jitpack +cv-compact_mono 0:d4ac2ee01f81 -0.30 -0.04 testingjunit5,assertj,pdfbox-bas +cv-compact_mono 0:b04e6ebfb02b -0.16 -0.04 diff,layout-graphsnapshots +cv-compact_mono 0:93c9f742ef14 -0.28 -0.04 distributionmavencentral,sonatyp +cv-compact_mono 0:8f21bd149ad7 -0.11 -0.04 gpgsigning,jitpack +cv-compact_mono 0:68bf0109c6f8 0.46 -0.04 education +cv-compact_mono 0:9ad8d9ef1711 -0.14 -0.04 msccomputerscience/universityof +cv-compact_mono 0:594f6dd11e20 -0.04 -0.04 manchester/2019-2021 +cv-compact_mono 0:387dc0387824 -0.16 -0.04 bscsoftwareengineering/imperialc +cv-compact_mono 0:453806946a88 -0.06 -0.04 london/2015-2019 +cv-compact_mono 0:7816e7a28b71 -0.18 -0.04 oraclejavacertification/professi +cv-compact_mono 0:d40b22f00acb 0.07 -0.04 2023-2024 +cv-compact_mono 0:7b476727faf3 0.38 -0.04 additional +cv-compact_mono 0:ecc25e73b19b -0.17 -0.04 languages:english(fluent),german +cv-compact_mono 0:ac7f0ee6a49e -0.14 -0.04 (intermediate),spanish(basic) +cv-compact_mono 0:970ca9d789c2 -0.10 -0.04 workeligibility:eligibletoworkin +cv-compact_mono 0:0735680e2596 -0.07 -0.04 theeu +cv-compact_mono 0:8051a4b5e34f -0.01 -0.04 opensource:maintainerofgraphcomp +cv-compact_mono 0:08c2e869a75b -0.10 -0.04 regularcontributortopdfboxissuet +cv-compact_mono 0:12dcd1343975 -0.06 -0.04 speaking:jvmsummit2024,devoxxuk2 +cv-compact_mono 0:3aea7f90f8ed -0.03 -0.04 —bothondeclarativedocumentlayout cv-compact_mono 0:1900eab6c028 0.27 0.06 profile cv-compact_mono 0:3828b9718a0d -0.40 0.06 platformengineerwith10+yearsbuil cv-compact_mono 0:f6b5e93ccadd -0.32 0.06 engines,anddeveloper-facingtempl @@ -493,12 +493,12 @@ cv-engineering_resume 0:8b5abdc8c0d7 -0.17 0.09 technicalevidence cv-engineering_resume 0:e2fbf67cb588 0.42 0.01 graphcompose(java21,pdfbox,maven cv-engineering_resume 0:eb5950729749 0.26 0.01 templates,snapshottesting.powers cv-engineering_resume 0:81c8132f9792 0.16 0.01 systems.(opensource) -cv-engineering_resume 0:643428f0ebf8 0.76 0.01 templatestudio(kotlin,composedes -cv-engineering_resume 0:c259a0e7581e 0.48 0.01 invoiceoutputacross14designprese -cv-engineering_resume 0:c944ee08a5bf 0.98 0.01 layoutlint(java21,javaparser,spo -cv-engineering_resume 0:2d80d05697ad 0.70 0.01 untypedoffsets,implicitpagebreak -cv-engineering_resume 0:6793d28e9783 1.18 0.01 chromeforge(java,graphcompose,pa -cv-engineering_resume 0:e3cfea265b3b 0.90 0.01 graphcompose:cinematiccovers,pul +cv-engineering_resume 0:643428f0ebf8 0.16 0.01 templatestudio(kotlin,composedes +cv-engineering_resume 0:c259a0e7581e -0.12 0.01 invoiceoutputacross14designprese +cv-engineering_resume 0:c944ee08a5bf 0.14 0.01 layoutlint(java21,javaparser,spo +cv-engineering_resume 0:2d80d05697ad -0.14 0.01 untypedoffsets,implicitpagebreak +cv-engineering_resume 0:6793d28e9783 -0.02 0.01 chromeforge(java,graphcompose,pa +cv-engineering_resume 0:e3cfea265b3b -0.30 0.01 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 0.08 -0.04 jordanrivera cv-executive 0:89ff05847e96 -0.30 -0.04 london,uk|+442055551000 cv-executive 0:8817bf9310b6 -0.32 -0.04 jordan.rivera@example.com|linked @@ -862,14 +862,14 @@ cv-monogram_sidebar 0:e77e909f6ff5 -0.30 0.05 builtbackendservicesandproductio cv-monogram_sidebar 0:97c59b2fdb55 -0.31 0.05 drovethemigrationfromitexttoacus cv-monogram_sidebar 0:2c2b19cf214d -0.34 0.05 latencyfrom1.4sto380ms. cv-monogram_sidebar 0:2577c0f557b2 -0.10 0.05 projects -cv-monogram_sidebar 0:abdcacccefe1 0.34 0.05 templatestudio(kotlin,composedes -cv-monogram_sidebar 0:041a43f9a663 0.61 0.05 andinvoiceoutputacross14designpr -cv-monogram_sidebar 0:f87e2f0c02dc 0.67 0.05 layoutlint(java21,javaparser,spo -cv-monogram_sidebar 0:a646f74483b1 0.94 0.05 rows,untypedoffsets,implicitpage -cv-monogram_sidebar 0:676dfdd56ad2 1.30 0.05 additionalinformation -cv-monogram_sidebar 0:f20997652453 1.27 0.05 languages:english(fluent),german -cv-monogram_sidebar 0:ec9d3622395e 1.31 0.05 workeligibility:eligibletoworkin -cv-monogram_sidebar 0:dd20ae01c3cf 1.23 0.05 opensource:maintainerofgraphcomp +cv-monogram_sidebar 0:abdcacccefe1 -0.38 0.05 templatestudio(kotlin,composedes +cv-monogram_sidebar 0:041a43f9a663 -0.11 0.05 andinvoiceoutputacross14designpr +cv-monogram_sidebar 0:f87e2f0c02dc -0.41 0.05 layoutlint(java21,javaparser,spo +cv-monogram_sidebar 0:a646f74483b1 -0.14 0.05 rows,untypedoffsets,implicitpage +cv-monogram_sidebar 0:676dfdd56ad2 -0.14 0.05 additionalinformation +cv-monogram_sidebar 0:f20997652453 -0.17 0.05 languages:english(fluent),german +cv-monogram_sidebar 0:ec9d3622395e -0.13 0.05 workeligibility:eligibletoworkin +cv-monogram_sidebar 0:dd20ae01c3cf -0.09 0.05 opensource:maintainerofgraphcomp cv-navy_sidebar 0:9fdaa20e32a0 0.15 0.05 oliviamartinez cv-navy_sidebar 0:093e7d5fdbaa -0.30 0.02 contact cv-navy_sidebar 0:01dcad830244 -0.22 -0.09 +1(555)123-4567 @@ -965,16 +965,16 @@ cv-nordic_clean 0:43ad67a4e3f5 -0.06 0.08 signing,jitpack,semanticversioni cv-nordic_clean 0:68bf0109c6f8 0.04 0.08 education cv-nordic_clean 0:904a600c3869 -0.14 0.08 msccomputerscience/universityofm cv-nordic_clean 0:3fa772117260 0.03 0.08 2019-2021 -cv-nordic_clean 0:78a380e4d1f0 0.17 0.08 bscsoftwareengineering/imperialc -cv-nordic_clean 0:30f9262640a0 0.34 0.08 2015-2019 -cv-nordic_clean 0:7b476727faf3 0.67 0.08 additional -cv-nordic_clean 0:3b0f5db9217f 0.56 0.08 languages:english(fluent),german -cv-nordic_clean 0:d8a971cea795 0.47 0.08 spanish(basic) -cv-nordic_clean 0:ec9d3622395e 0.67 0.08 workeligibility:eligibletoworkin -cv-nordic_clean 0:d05b8b335e96 0.49 0.08 opensource:maintainerofgraphcomp -cv-nordic_clean 0:2f3b4176123d 0.52 0.08 contributortopdfboxissuetriage. -cv-nordic_clean 0:b6b5a250cb72 0.46 0.08 speaking:jvmsummit2024,devoxxuk2 -cv-nordic_clean 0:7ead14c50085 0.49 0.08 ondeclarativedocumentlayout. +cv-nordic_clean 0:78a380e4d1f0 -0.07 0.08 bscsoftwareengineering/imperialc +cv-nordic_clean 0:30f9262640a0 0.10 0.08 2015-2019 +cv-nordic_clean 0:7b476727faf3 0.07 0.08 additional +cv-nordic_clean 0:3b0f5db9217f -0.04 0.08 languages:english(fluent),german +cv-nordic_clean 0:d8a971cea795 -0.13 0.08 spanish(basic) +cv-nordic_clean 0:ec9d3622395e 0.07 0.08 workeligibility:eligibletoworkin +cv-nordic_clean 0:d05b8b335e96 -0.11 0.08 opensource:maintainerofgraphcomp +cv-nordic_clean 0:2f3b4176123d -0.08 0.08 contributortopdfboxissuetriage. +cv-nordic_clean 0:b6b5a250cb72 -0.14 0.08 speaking:jvmsummit2024,devoxxuk2 +cv-nordic_clean 0:7ead14c50085 -0.11 0.08 ondeclarativedocumentlayout. cv-nordic_clean 0:53e5e7c5a884 -0.23 0.07 experience cv-nordic_clean 0:4977534824cc -0.15 0.07 seniorplatformengineer/2024-pres cv-nordic_clean 0:f890faef907f -0.08 0.07 northwindsystems @@ -991,15 +991,15 @@ cv-nordic_clean 0:ef148f221e31 -0.01 0.07 helixprintco cv-nordic_clean 0:41d451f465c2 -0.37 0.07 maintainedahigh-volumeinvoice-pr cv-nordic_clean 0:6859fed08b66 -0.35 0.07 harnessthatgatedeverytemplatecha cv-nordic_clean 0:d94eccbb1fbe -0.14 0.07 selectedprojects -cv-nordic_clean 0:643428f0ebf8 0.05 0.07 templatestudio(kotlin,composedes -cv-nordic_clean 0:c259a0e7581e 0.13 0.07 invoiceoutputacross14designprese -cv-nordic_clean 0:f87e2f0c02dc 0.23 0.07 layoutlint(java21,javaparser,spo -cv-nordic_clean 0:a646f74483b1 0.31 0.07 rows,untypedoffsets,implicitpage -cv-nordic_clean 0:6793d28e9783 0.43 0.07 chromeforge(java,graphcompose,pa -cv-nordic_clean 0:e3cfea265b3b 0.51 0.07 graphcompose:cinematiccovers,pul +cv-nordic_clean 0:643428f0ebf8 -0.31 0.07 templatestudio(kotlin,composedes +cv-nordic_clean 0:c259a0e7581e -0.23 0.07 invoiceoutputacross14designprese +cv-nordic_clean 0:f87e2f0c02dc -0.25 0.07 layoutlint(java21,javaparser,spo +cv-nordic_clean 0:a646f74483b1 -0.17 0.07 rows,untypedoffsets,implicitpage +cv-nordic_clean 0:6793d28e9783 -0.29 0.07 chromeforge(java,graphcompose,pa +cv-nordic_clean 0:e3cfea265b3b -0.21 0.07 graphcompose:cinematiccovers,pul cv-orange_ops 0:a6c9a7bc3a1d -0.34 0.03 marcusbennett cv-orange_ops 0:8157f110feec -0.28 0.03 warehouseoperationssupervisor -cv-orange_ops 0:8157f110feec#1 0.21 0.18 warehouseoperationssupervisor +cv-orange_ops 0:8157f110feec#1 0.09 0.18 warehouseoperationssupervisor cv-orange_ops 0:a8acc3a90a7b -0.01 -0.19 +447700900123 cv-orange_ops 0:e6da1125d5d5 -0.01 -0.62 marcus.bennett@email.com cv-orange_ops 0:6a3bd39f358d -0.01 -0.88 birmingham,westmidlands,uk @@ -1056,127 +1056,127 @@ cv-orange_ops 0:41fad67acd21 0.27 0.18 environments.proventrackrecordof cv-orange_ops 0:08fe5844eac2 0.28 0.18 accuracy,anddeliveringexcellents cv-orange_ops 0:b1f2a388d597 0.42 0.18 andsafety.adeptatusingdatatodriv cv-orange_ops 0:0ef62989056c 0.44 0.18 measurableresults. -cv-orange_ops 0:360626c9f718 0.34 0.18 workexperience -cv-orange_ops 0:03f6d636aa6b 0.40 0.16 mar2021–present -cv-orange_ops 0:24c0d4863b50 0.31 0.18 expresslinkdistributionltd|birmi -cv-orange_ops 0:873c40886362 0.29 0.18 •overseedailywarehouseoperations -cv-orange_ops 0:e789c025e038 0.21 0.18 staffacrossinbound,storage,picki -cv-orange_ops 0:005412ac77a3 0.31 0.18 •ensuretimelyandaccurateorderful -cv-orange_ops 0:4e9c4aed8e43 0.28 0.18 •monitorandmaintaininventoryaccu -cv-orange_ops 0:1509c3cbd20f 0.32 0.18 variances. -cv-orange_ops 0:928837818f67 0.42 0.18 •analysekpisandoperationaldatato -cv-orange_ops 0:70ed682534c9 0.27 0.18 •coordinatewithtransportandcusto -cv-orange_ops 0:901159ffc9e3 0.32 0.18 improveservicelevels. -cv-orange_ops 0:947008cdcf98 0.29 0.18 •driveacultureofsafetyandaccount -cv-orange_ops 0:e6b1b813ff0b 0.34 0.18 compliancewithh&sregulations. -cv-orange_ops 0:c8a3bdb04f89 0.31 0.18 •leadcontinuousimprovementinitia -cv-orange_ops 0:e28f5bf00122 0.47 0.18 productivity. -cv-orange_ops 0:bfb9273fea4d 0.37 0.18 warehouseteamleader -cv-orange_ops 0:9a8c213939be 0.44 0.12 may2017–feb2021 -cv-orange_ops 0:df1f256d362d 0.47 0.18 midlandgatelogistics|coventry,uk -cv-orange_ops 0:92d5e6992bc1 0.45 0.18 •ledateamof25warehouseoperatives -cv-orange_ops 0:ec21a3e83856 0.42 0.18 •managedinboundreceipts,putaway, -cv-orange_ops 0:ac1fa66fcf19 0.52 0.18 •maintainedaccuratestockrecordsa -cv-orange_ops 0:195624e8565f 0.49 0.18 •supportedtheimplementationofane -cv-orange_ops 0:dd2458930e31 0.47 0.18 •reducedpickingerrorsby23%throug -cv-orange_ops 0:81219b44ff52 0.46 0.18 warehousecoordinator -cv-orange_ops 0:eb5e95e8b64c 0.53 0.09 jun2015–apr2017 -cv-orange_ops 0:95f3c676853f 0.44 0.18 totalsupplysolutions|northampton -cv-orange_ops 0:3e147aae9ba8 0.54 0.18 •coordinateddailyoperationsandal -cv-orange_ops 0:b786faa44990 0.51 0.18 •monitoredstocklevelsandinitiate -cv-orange_ops 0:9806038f6123 0.49 0.18 •assistedwithkpireportingandperf -cv-orange_ops 0:c2ec5b8c794d 0.61 0.18 •ensuredcompliancewithcompanypol -cv-orange_ops 0:a691a9aab3fc 0.61 0.18 keykpisnapshot(recent12months) -cv-orange_ops 0:b5f6dbae04bd 0.46 0.07 15% -cv-orange_ops 0:e918ea42a538 0.46 0.21 99.2% -cv-orange_ops 0:16906b6f3827 0.46 0.24 98.4% -cv-orange_ops 0:bd1b16004d22 0.71 0.25 productivity -cv-orange_ops 0:b11a85b296a9 0.71 0.20 inventory -cv-orange_ops 0:b1e25044bf23 0.71 0.25 on-time -cv-orange_ops 0:05595e942a13 0.71 0.46 losttime -cv-orange_ops 0:e20a548f23fa 0.71 0.18 increase -cv-orange_ops 0:5879092f86c5 0.71 0.30 accuracy -cv-orange_ops 0:b4af39d5b65a 0.71 0.24 delivery -cv-orange_ops 0:a6d1765ab64d 0.71 0.42 incidents -cv-orange_ops 0:676dfdd56ad2 0.74 0.18 additionalinformation -cv-orange_ops 0:0945b35c95a8 0.90 -0.02 systems:sapewm,manhattanwms,micr -cv-orange_ops 0:44aaa523dc2c 0.92 -0.02 languages:english(native) -cv-orange_ops 0:724cc536a24c 0.96 -0.02 drivinglicence:fullukdrivinglice -cv-orange_ops 0:9f0e43069d3f 0.98 -0.02 interests:strengthtraining,motor -cv-panel 0:8f1010120ed6 0.18 0.25 jordanrivera +cv-orange_ops 0:360626c9f718 0.10 0.18 workexperience +cv-orange_ops 0:03f6d636aa6b 0.16 0.16 mar2021–present +cv-orange_ops 0:24c0d4863b50 0.19 0.18 expresslinkdistributionltd|birmi +cv-orange_ops 0:873c40886362 0.05 0.18 •overseedailywarehouseoperations +cv-orange_ops 0:e789c025e038 0.09 0.18 staffacrossinbound,storage,picki +cv-orange_ops 0:005412ac77a3 0.19 0.18 •ensuretimelyandaccurateorderful +cv-orange_ops 0:4e9c4aed8e43 0.04 0.18 •monitorandmaintaininventoryaccu +cv-orange_ops 0:1509c3cbd20f 0.08 0.18 variances. +cv-orange_ops 0:928837818f67 0.18 0.18 •analysekpisandoperationaldatato +cv-orange_ops 0:70ed682534c9 0.15 0.18 •coordinatewithtransportandcusto +cv-orange_ops 0:901159ffc9e3 0.20 0.18 improveservicelevels. +cv-orange_ops 0:947008cdcf98 0.17 0.18 •driveacultureofsafetyandaccount +cv-orange_ops 0:e6b1b813ff0b 0.22 0.18 compliancewithh&sregulations. +cv-orange_ops 0:c8a3bdb04f89 0.19 0.18 •leadcontinuousimprovementinitia +cv-orange_ops 0:e28f5bf00122 0.23 0.18 productivity. +cv-orange_ops 0:bfb9273fea4d 0.25 0.18 warehouseteamleader +cv-orange_ops 0:9a8c213939be 0.32 0.12 may2017–feb2021 +cv-orange_ops 0:df1f256d362d 0.23 0.18 midlandgatelogistics|coventry,uk +cv-orange_ops 0:92d5e6992bc1 0.33 0.18 •ledateamof25warehouseoperatives +cv-orange_ops 0:ec21a3e83856 0.30 0.18 •managedinboundreceipts,putaway, +cv-orange_ops 0:ac1fa66fcf19 0.28 0.18 •maintainedaccuratestockrecordsa +cv-orange_ops 0:195624e8565f 0.37 0.18 •supportedtheimplementationofane +cv-orange_ops 0:dd2458930e31 0.35 0.18 •reducedpickingerrorsby23%throug +cv-orange_ops 0:81219b44ff52 0.22 0.18 warehousecoordinator +cv-orange_ops 0:eb5e95e8b64c 0.29 0.09 jun2015–apr2017 +cv-orange_ops 0:95f3c676853f 0.32 0.18 totalsupplysolutions|northampton +cv-orange_ops 0:3e147aae9ba8 0.42 0.18 •coordinateddailyoperationsandal +cv-orange_ops 0:b786faa44990 0.39 0.18 •monitoredstocklevelsandinitiate +cv-orange_ops 0:9806038f6123 0.37 0.18 •assistedwithkpireportingandperf +cv-orange_ops 0:c2ec5b8c794d 0.49 0.18 •ensuredcompliancewithcompanypol +cv-orange_ops 0:a691a9aab3fc 0.49 0.18 keykpisnapshot(recent12months) +cv-orange_ops 0:b5f6dbae04bd 0.22 0.07 15% +cv-orange_ops 0:e918ea42a538 0.22 0.21 99.2% +cv-orange_ops 0:16906b6f3827 0.22 0.24 98.4% +cv-orange_ops 0:bd1b16004d22 0.47 0.25 productivity +cv-orange_ops 0:b11a85b296a9 0.47 0.20 inventory +cv-orange_ops 0:b1e25044bf23 0.47 0.25 on-time +cv-orange_ops 0:05595e942a13 0.47 0.46 losttime +cv-orange_ops 0:e20a548f23fa 0.47 0.18 increase +cv-orange_ops 0:5879092f86c5 0.47 0.30 accuracy +cv-orange_ops 0:b4af39d5b65a 0.47 0.24 delivery +cv-orange_ops 0:a6d1765ab64d 0.47 0.42 incidents +cv-orange_ops 0:676dfdd56ad2 0.62 0.18 additionalinformation +cv-orange_ops 0:0945b35c95a8 0.66 -0.02 systems:sapewm,manhattanwms,micr +cv-orange_ops 0:44aaa523dc2c 0.80 -0.02 languages:english(native) +cv-orange_ops 0:724cc536a24c 0.84 -0.02 drivinglicence:fullukdrivinglice +cv-orange_ops 0:9f0e43069d3f 0.86 -0.02 interests:strengthtraining,motor +cv-panel 0:8f1010120ed6 0.06 0.25 jordanrivera cv-panel 0:2d58f0cadc2d -0.16 -0.05 platformengineer cv-panel 0:89ff05847e96 -0.16 0.30 london,uk|+442055551000 -cv-panel 0:8817bf9310b6 -0.08 0.36 jordan.rivera@example.com|linked -cv-panel 0:1900eab6c028 0.74 0.04 profile -cv-panel 0:80cc87fdc4c4 -0.02 0.04 platformengineerwith10+yearsbuil -cv-panel 0:c323ef4c385f -0.02 0.04 systems.specialisedinhigh-throug -cv-panel 0:3ff1933dba9a -0.02 0.04 typed,snapshot-testedlibrariesth -cv-panel 0:32c1cf49a2fe 1.06 0.04 skills -cv-panel 0:eea537278f83 0.54 0.04 •languages:java21,kotlin,groovy, -cv-panel 0:7e941e729572 0.29 0.04 •document&print:pdfbox,apachepoi -cv-panel 0:9e3166ce2413 0.29 0.04 itext,postscript,icccolourprofil -cv-panel 0:ebc70ed9b71b 0.37 0.04 •layoutengines:customdsldesign,s -cv-panel 0:dd4f24d85605 0.37 0.04 pagination,snapshottesting,visua -cv-panel 0:f5f76d479ec8 0.45 0.04 •build&infrastructure:maven,grad -cv-panel 0:656a2a3e57e0 0.45 0.04 jitpack,docker,jmhbenchmarking -cv-panel 0:9a6921f79b7d 0.49 0.04 •distribution:mavencentral,sonat -cv-panel 0:77a74982066f 0.49 0.04 jitpack,semanticversioningdiscip -cv-panel 0:68bf0109c6f8 1.57 0.04 education -cv-panel 0:871923f4f0f2 0.99 0.04 msccomputerscience-2019-2021 -cv-panel 0:47ce0218bbea 1.03 0.04 universityofmanchester -cv-panel 0:51e1ec7daa5a 0.83 0.04 distinction.thesis:composablelay -cv-panel 0:d10553cd7368 0.83 0.04 deterministicdocumentrendering. -cv-panel 0:ba6d361079f4 1.11 0.04 bscsoftwareengineering-2015-2019 -cv-panel 0:89ad9656f393 1.15 0.04 imperialcollegelondon -cv-panel 0:4c58bcad7242 0.83 0.04 first-classhonours.specialisatio -cv-panel 0:2189b9b3b549 0.83 0.04 analysis. -cv-panel 0:8971b01c36bb 1.11 0.04 oraclejavacertification-2023-202 -cv-panel 0:2669e1f6d55c 1.15 0.04 professionaltrack -cv-panel 0:4f17e3d7d6f4 0.95 0.04 java17platformdeep-dive:records, -cv-panel 0:9e6154a3b625 0.95 0.04 matching,virtualthreads. -cv-panel 0:7b476727faf3 1.94 0.04 additional -cv-panel 0:3f88eb4c530c 1.18 0.04 languages:english(fluent),german -cv-panel 0:5d276fee8c17 1.18 0.04 (basic) -cv-panel 0:ec9d3622395e 1.50 0.04 workeligibility:eligibletoworkin -cv-panel 0:d05b8b335e96 1.34 0.04 opensource:maintainerofgraphcomp -cv-panel 0:2f3b4176123d 1.34 0.04 contributortopdfboxissuetriage. -cv-panel 0:1ae173b42166 1.30 0.04 speaking:jvmsummit2024,devoxxuk2 -cv-panel 0:309255ca6a36 1.30 0.04 declarativedocumentlayout. -cv-panel 0:53e5e7c5a884 1.06 0.05 experience -cv-panel 0:99b44abc1b3e 0.46 0.05 seniorplatformengineer-2024-pres -cv-panel 0:f890faef907f 0.53 0.05 northwindsystems -cv-panel 0:e32ca827bfd5 0.33 0.05 ledthereusabledocument-generatio -cv-panel 0:675f8862fdda 0.33 0.05 hiring,andreportingflowsacross8p -cv-panel 0:93d48fc85054 0.33 0.05 templatemaintenancetimeby70%byre -cv-panel 0:e7f09e2ba7d2 0.33 0.05 scriptsinfavourofonecanonicaleng -cv-panel 0:ded138c59d03 0.61 0.05 softwareengineer-2021-2024 -cv-panel 0:998c1a985022 0.65 0.05 brightleaflabs -cv-panel 0:0ed66ac9265d 0.45 0.05 builtbackendservicesandproductio -cv-panel 0:17c4ef49d4e6 0.45 0.05 pipelinesprocessing2m+documentsp -cv-panel 0:a7dd3c5be76b 0.45 0.05 migrationfromitexttoacustomlayou -cv-panel 0:a35401d8bcad 0.45 0.05 licensingriskandcuttingp99render -cv-panel 0:649d2d9d10d0 0.45 0.05 380ms. -cv-panel 0:019bbdc8d0bb 0.73 0.05 backendengineer-2019-2021 -cv-panel 0:ef148f221e31 0.79 0.05 helixprintco -cv-panel 0:09cc06a649eb 0.59 0.05 maintainedahigh-volumeinvoice-pr -cv-panel 0:090e2184c17b 0.59 0.05 pdfs/year)andauthoredthecomplian -cv-panel 0:6f071fdf7529 0.59 0.05 gatedeverytemplatechange. -cv-panel 0:2577c0f557b2 1.67 0.05 projects -cv-panel 0:b2b029995203 1.15 0.05 •graphcompose(java21,pdfbox,mave -cv-panel 0:81c8132f9792 0.91 0.07 systems.(opensource) -cv-panel 0:753f46e4e01b 0.94 0.05 •templatestudio(kotlin,composede -cv-panel 0:6eb35b5b9a91 0.94 0.07 diff) -cv-panel 0:d919bd2d50b6 1.06 0.07 internaltoolforevaluatingcv,prop -cv-panel 0:245b9e56b9de 1.06 0.07 across14designpresets.pngdiffing -cv-panel 0:6bc2807453c6 1.06 0.07 baselinefreezing. -cv-panel 0:25cdca2beb8b 1.30 0.05 •layoutlint(java21,javaparser,sp -cv-panel 0:30e034b9c7b2 1.06 0.07 staticanalyserthatflagsfragileau -cv-panel 0:e7ad19d64668 1.06 0.07 nestedrows,untypedoffsets,implic -cv-panel 0:95ac1a62c76f 1.18 0.07 theyshiptoproduction. -cv-panel 0:fb1927f88597 1.42 0.05 •chromeforge(java,graphcompose,p -cv-panel 0:bb865a4ccac1 1.18 0.07 editorial-magazinedocumenttoolki -cv-panel 0:8a31ccd889ee 1.18 0.07 cinematiccovers,pullquotes,multi -cv-panel 0:fe63fe18585a 1.18 0.07 callouts. +cv-panel 0:8817bf9310b6 -0.20 0.36 jordan.rivera@example.com|linked +cv-panel 0:1900eab6c028 0.50 0.04 profile +cv-panel 0:80cc87fdc4c4 -0.26 0.04 platformengineerwith10+yearsbuil +cv-panel 0:c323ef4c385f -0.26 0.04 systems.specialisedinhigh-throug +cv-panel 0:3ff1933dba9a -0.26 0.04 typed,snapshot-testedlibrariesth +cv-panel 0:32c1cf49a2fe 0.70 0.04 skills +cv-panel 0:eea537278f83 0.18 0.04 •languages:java21,kotlin,groovy, +cv-panel 0:7e941e729572 0.05 0.04 •document&print:pdfbox,apachepoi +cv-panel 0:9e3166ce2413 0.05 0.04 itext,postscript,icccolourprofil +cv-panel 0:ebc70ed9b71b 0.01 0.04 •layoutengines:customdsldesign,s +cv-panel 0:dd4f24d85605 0.01 0.04 pagination,snapshottesting,visua +cv-panel 0:f5f76d479ec8 0.09 0.04 •build&infrastructure:maven,grad +cv-panel 0:656a2a3e57e0 0.09 0.04 jitpack,docker,jmhbenchmarking +cv-panel 0:9a6921f79b7d 0.13 0.04 •distribution:mavencentral,sonat +cv-panel 0:77a74982066f 0.13 0.04 jitpack,semanticversioningdiscip +cv-panel 0:68bf0109c6f8 1.09 0.04 education +cv-panel 0:871923f4f0f2 0.63 0.04 msccomputerscience-2019-2021 +cv-panel 0:47ce0218bbea 0.67 0.04 universityofmanchester +cv-panel 0:51e1ec7daa5a 0.35 0.04 distinction.thesis:composablelay +cv-panel 0:d10553cd7368 0.35 0.04 deterministicdocumentrendering. +cv-panel 0:ba6d361079f4 0.63 0.04 bscsoftwareengineering-2015-2019 +cv-panel 0:89ad9656f393 0.67 0.04 imperialcollegelondon +cv-panel 0:4c58bcad7242 0.47 0.04 first-classhonours.specialisatio +cv-panel 0:2189b9b3b549 0.47 0.04 analysis. +cv-panel 0:8971b01c36bb 0.75 0.04 oraclejavacertification-2023-202 +cv-panel 0:2669e1f6d55c 0.79 0.04 professionaltrack +cv-panel 0:4f17e3d7d6f4 0.47 0.04 java17platformdeep-dive:records, +cv-panel 0:9e6154a3b625 0.47 0.04 matching,virtualthreads. +cv-panel 0:7b476727faf3 1.46 0.04 additional +cv-panel 0:3f88eb4c530c 0.70 0.04 languages:english(fluent),german +cv-panel 0:5d276fee8c17 0.70 0.04 (basic) +cv-panel 0:ec9d3622395e 1.02 0.04 workeligibility:eligibletoworkin +cv-panel 0:d05b8b335e96 0.74 0.04 opensource:maintainerofgraphcomp +cv-panel 0:2f3b4176123d 0.74 0.04 contributortopdfboxissuetriage. +cv-panel 0:1ae173b42166 0.82 0.04 speaking:jvmsummit2024,devoxxuk2 +cv-panel 0:309255ca6a36 0.82 0.04 declarativedocumentlayout. +cv-panel 0:53e5e7c5a884 0.70 0.05 experience +cv-panel 0:99b44abc1b3e 0.22 0.05 seniorplatformengineer-2024-pres +cv-panel 0:f890faef907f 0.29 0.05 northwindsystems +cv-panel 0:e32ca827bfd5 -0.03 0.05 ledthereusabledocument-generatio +cv-panel 0:675f8862fdda -0.03 0.05 hiring,andreportingflowsacross8p +cv-panel 0:93d48fc85054 0.09 0.05 templatemaintenancetimeby70%byre +cv-panel 0:e7f09e2ba7d2 0.09 0.05 scriptsinfavourofonecanonicaleng +cv-panel 0:ded138c59d03 0.37 0.05 softwareengineer-2021-2024 +cv-panel 0:998c1a985022 0.41 0.05 brightleaflabs +cv-panel 0:0ed66ac9265d 0.09 0.05 builtbackendservicesandproductio +cv-panel 0:17c4ef49d4e6 0.09 0.05 pipelinesprocessing2m+documentsp +cv-panel 0:a7dd3c5be76b 0.09 0.05 migrationfromitexttoacustomlayou +cv-panel 0:a35401d8bcad 0.21 0.05 licensingriskandcuttingp99render +cv-panel 0:649d2d9d10d0 0.21 0.05 380ms. +cv-panel 0:019bbdc8d0bb 0.37 0.05 backendengineer-2019-2021 +cv-panel 0:ef148f221e31 0.43 0.05 helixprintco +cv-panel 0:09cc06a649eb 0.11 0.05 maintainedahigh-volumeinvoice-pr +cv-panel 0:090e2184c17b 0.11 0.05 pdfs/year)andauthoredthecomplian +cv-panel 0:6f071fdf7529 0.23 0.05 gatedeverytemplatechange. +cv-panel 0:2577c0f557b2 1.07 0.05 projects +cv-panel 0:b2b029995203 0.55 0.05 •graphcompose(java21,pdfbox,mave +cv-panel 0:81c8132f9792 0.43 0.07 systems.(opensource) +cv-panel 0:753f46e4e01b 0.46 0.05 •templatestudio(kotlin,composede +cv-panel 0:6eb35b5b9a91 0.46 0.07 diff) +cv-panel 0:d919bd2d50b6 0.46 0.07 internaltoolforevaluatingcv,prop +cv-panel 0:245b9e56b9de 0.58 0.07 across14designpresets.pngdiffing +cv-panel 0:6bc2807453c6 0.58 0.07 baselinefreezing. +cv-panel 0:25cdca2beb8b 0.82 0.05 •layoutlint(java21,javaparser,sp +cv-panel 0:30e034b9c7b2 0.58 0.07 staticanalyserthatflagsfragileau +cv-panel 0:e7ad19d64668 0.58 0.07 nestedrows,untypedoffsets,implic +cv-panel 0:95ac1a62c76f 0.58 0.07 theyshiptoproduction. +cv-panel 0:fb1927f88597 0.82 0.05 •chromeforge(java,graphcompose,p +cv-panel 0:bb865a4ccac1 0.70 0.07 editorial-magazinedocumenttoolki +cv-panel 0:8a31ccd889ee 0.70 0.07 cinematiccovers,pullquotes,multi +cv-panel 0:fe63fe18585a 0.70 0.07 callouts. cv-professional_sidebar 0:093e7d5fdbaa -0.17 -0.04 contact cv-professional_sidebar 0:7f459725e1f6 0.05 -0.15 +12345678900 cv-professional_sidebar 0:52bf11c1afe0 -0.07 -0.19 your.email@example.com @@ -1439,44 +1439,44 @@ cv-slate_orange 0:f4e999c08086 0.00 0.06 customerservice,sales,andproject cv-slate_orange 0:41221430e3f8 -0.03 0.06 organizationalskills,andtheabili cv-slate_orange 0:324c4509a3e4 0.06 0.06 managingpriorities,buildingrelat cv-slate_orange 0:57271827af78 0.03 0.06 customersatisfaction,andbusiness -cv-slate_orange 0:c2f296ef30a3 0.09 0.06 professionalexperience -cv-slate_orange 0:da2ea6509bec 0.74 0.02 operationscoordinator -cv-slate_orange 0:e7227bbe0c40 0.63 0.93 jan2022–present -cv-slate_orange 0:9f7cecddf317 0.57 0.02 brightstartlogistics,austin,tx +cv-slate_orange 0:c2f296ef30a3 -0.03 0.06 professionalexperience +cv-slate_orange 0:da2ea6509bec 0.62 0.02 operationscoordinator +cv-slate_orange 0:e7227bbe0c40 0.51 0.93 jan2022–present +cv-slate_orange 0:9f7cecddf317 0.45 0.02 brightstartlogistics,austin,tx cv-slate_orange 0:e0bbd6c9782e 0.50 0.02 •coordinatedailyoperationsandsch cv-slate_orange 0:dc9a542f8db9 0.54 0.02 •developandmaintaindashboardsand -cv-slate_orange 0:66acc2e5b891 0.58 0.02 •streamlinecommunicationbetweend -cv-slate_orange 0:8bd3fd672f95 0.62 0.02 •managevendorrelationshipsandass -cv-slate_orange 0:dd7872236383 0.62 0.02 customersupportspecialist -cv-slate_orange 0:1734c189cfe2 0.51 1.05 jun2020–dec2021 -cv-slate_orange 0:b9dfc8902d16 0.45 0.02 techwavesolutions,remote -cv-slate_orange 0:56391e23e83a 0.52 0.02 •providedtechnicalsupporttocusto -cv-slate_orange 0:7eb50a39cf50 0.56 0.02 •resolvedanaverageof40+inquiries -cv-slate_orange 0:46f632748ba8 0.48 0.02 •createdknowledgebasearticlesand -cv-slate_orange 0:02b44f46125c 0.52 0.02 •collaboratedwithproductandengin -cv-slate_orange 0:a1707ef6164e 0.52 0.02 salesassociate -cv-slate_orange 0:2bc613d4e516 0.53 1.06 mar2019–may2020 -cv-slate_orange 0:bb7253ff7002 0.47 0.02 urbanoutfitters,austin,tx -cv-slate_orange 0:aaa52372c317 -0.08 0.02 •consistentlyexceededsalestarget +cv-slate_orange 0:66acc2e5b891 0.46 0.02 •streamlinecommunicationbetweend +cv-slate_orange 0:8bd3fd672f95 0.50 0.02 •managevendorrelationshipsandass +cv-slate_orange 0:dd7872236383 0.50 0.02 customersupportspecialist +cv-slate_orange 0:1734c189cfe2 0.39 1.05 jun2020–dec2021 +cv-slate_orange 0:b9dfc8902d16 0.33 0.02 techwavesolutions,remote +cv-slate_orange 0:56391e23e83a 0.40 0.02 •providedtechnicalsupporttocusto +cv-slate_orange 0:7eb50a39cf50 0.44 0.02 •resolvedanaverageof40+inquiries +cv-slate_orange 0:46f632748ba8 0.36 0.02 •createdknowledgebasearticlesand +cv-slate_orange 0:02b44f46125c 0.40 0.02 •collaboratedwithproductandengin +cv-slate_orange 0:a1707ef6164e 0.40 0.02 salesassociate +cv-slate_orange 0:2bc613d4e516 0.41 1.06 mar2019–may2020 +cv-slate_orange 0:bb7253ff7002 0.35 0.02 urbanoutfitters,austin,tx +cv-slate_orange 0:aaa52372c317 -0.20 0.02 •consistentlyexceededsalestarget cv-slate_orange 0:198e638fe8f3 0.01 0.00 personalizedcustomerservice. cv-slate_orange 0:dabead95ee7e 0.41 0.02 •builtandmaintainedstrongcustome -cv-slate_orange 0:ff3f5f9ca7a0 0.45 0.02 •merchandisedfloordisplaysandcon -cv-slate_orange 0:05a39f2908ba 0.52 0.02 •recognizedas“topperformer”forq4 -cv-slate_orange 0:832235539465 0.52 0.02 administrativeassistant/projecta -cv-slate_orange 0:2ccfc04a3ae7 0.41 0.98 may2018–feb2019 -cv-slate_orange 0:cfc5fd80ae80 0.35 0.02 greenfieldnonprofitinitiative,au -cv-slate_orange 0:b8aecb03e7ed 0.40 0.02 •supportedprojectmanagerswithsch -cv-slate_orange 0:77f797d4d64c 0.44 0.02 •managedcalendars,travelarrangem -cv-slate_orange 0:80a7a6cdc723 0.36 0.02 •maintaineddonorrecordsandprepar -cv-slate_orange 0:51539a61bb62 0.40 0.02 •assistedwitheventplanningandcom -cv-slate_orange 0:68bf0109c6f8 -0.08 0.06 education -cv-slate_orange 0:84ba6b88f439 -0.08 0.09 certifications&training +cv-slate_orange 0:ff3f5f9ca7a0 0.33 0.02 •merchandisedfloordisplaysandcon +cv-slate_orange 0:05a39f2908ba 0.40 0.02 •recognizedas“topperformer”forq4 +cv-slate_orange 0:832235539465 0.40 0.02 administrativeassistant/projecta +cv-slate_orange 0:2ccfc04a3ae7 0.29 0.98 may2018–feb2019 +cv-slate_orange 0:cfc5fd80ae80 0.23 0.02 greenfieldnonprofitinitiative,au +cv-slate_orange 0:b8aecb03e7ed 0.28 0.02 •supportedprojectmanagerswithsch +cv-slate_orange 0:77f797d4d64c 0.32 0.02 •managedcalendars,travelarrangem +cv-slate_orange 0:80a7a6cdc723 0.24 0.02 •maintaineddonorrecordsandprepar +cv-slate_orange 0:51539a61bb62 0.28 0.02 •assistedwitheventplanningandcom +cv-slate_orange 0:68bf0109c6f8 -0.20 0.06 education +cv-slate_orange 0:84ba6b88f439 -0.20 0.09 certifications&training cv-slate_orange 0:9d7190053be6 0.34 0.06 bachelorofartsincommunications -cv-slate_orange 0:f592b4ba6aa4 0.39 0.06 universityoftexasataustin -cv-slate_orange 0:3f84d2e470fe 0.38 0.06 austin,tx•graduatedmay2018 +cv-slate_orange 0:f592b4ba6aa4 0.27 0.06 universityoftexasataustin +cv-slate_orange 0:3f84d2e470fe 0.26 0.06 austin,tx•graduatedmay2018 cv-slate_orange 0:99b337b1faf4 0.26 0.09 •googleprojectmanagementcertific -cv-slate_orange 0:4d1b69dc33a1 0.60 0.09 •hubspotcustomerservicecertifica -cv-slate_orange 0:01a1e16912b7 0.96 0.09 •microsoftexcel:advancedformulas +cv-slate_orange 0:4d1b69dc33a1 0.48 0.09 •hubspotcustomerservicecertifica +cv-slate_orange 0:01a1e16912b7 0.84 0.09 •microsoftexcel:advancedformulas cv-slate_orange 0:07ef0ade6bb2 1.18 0.09 •servsafefoodhandlercertificatio cv-teal_pulse 0:a5800de7a5df -0.06 -0.03 isabellamoore cv-teal_pulse 0:aea71faf1482 0.16 -0.03 registerednurse @@ -3654,19 +3654,19 @@ letter-nordic_clean 0:26e89af4523d -0.35 0.00 ienjoytranslatingfuzzyworkflowre letter-nordic_clean 0:27c5581ffbbc -0.33 0.00 restoftheteam. letter-nordic_clean 0:a71e98216baa -0.10 0.00 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.11 0.00 sincerely, -letter-panel 0:8f1010120ed6 0.18 0.25 jordanrivera -letter-panel 0:8f1010120ed6#1 0.21 0.00 jordanrivera +letter-panel 0:8f1010120ed6 0.06 0.25 jordanrivera +letter-panel 0:8f1010120ed6#1 0.09 0.00 jordanrivera letter-panel 0:2d58f0cadc2d -0.14 -0.05 platformengineer letter-panel 0:89ff05847e96 -0.16 0.30 london,uk|+442055551000 -letter-panel 0:8817bf9310b6 -0.08 0.36 jordan.rivera@example.com|linked -letter-panel 0:bef81b541365 0.06 0.00 dearhiringteamatnorthwindsystems -letter-panel 0:ab54410ead82 -0.17 0.00 iamexcitedtosharemyinterestinthe -letter-panel 0:9185168d2cf8 -0.17 0.00 document-generationsystemsthatba -letter-panel 0:0c42fe9f3491 -0.16 0.00 ienjoytranslatingfuzzyworkflowre -letter-panel 0:dda41d31bb3c -0.16 0.00 thatmakeadoptioneasierfortherest +letter-panel 0:8817bf9310b6 -0.20 0.36 jordan.rivera@example.com|linked +letter-panel 0:bef81b541365 -0.06 0.00 dearhiringteamatnorthwindsystems +letter-panel 0:ab54410ead82 -0.29 0.00 iamexcitedtosharemyinterestinthe +letter-panel 0:9185168d2cf8 -0.29 0.00 document-generationsystemsthatba +letter-panel 0:0c42fe9f3491 -0.28 0.00 ienjoytranslatingfuzzyworkflowre +letter-panel 0:dda41d31bb3c -0.28 0.00 thatmakeadoptioneasierfortherest letter-panel 0:7c5a9817c868 -0.12 0.00 iwouldwelcometheopportunitytobri -letter-panel 0:4012eb4b05db 0.00 0.00 group. -letter-panel 0:80a6a628ad52 0.25 0.00 sincerely, +letter-panel 0:4012eb4b05db -0.12 0.00 group. +letter-panel 0:80a6a628ad52 0.13 0.00 sincerely, letter-sidebar_portrait 0:8f1010120ed6 0.04 -0.01 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.11 0.00 jordanrivera letter-sidebar_portrait 0:2d58f0cadc2d -0.19 -0.33 platformengineer diff --git a/qa/src/test/resources/docx-fidelity/word-windows.tsv b/qa/src/test/resources/docx-fidelity/word-windows.tsv index 0dae72d37..6cda589cd 100644 --- a/qa/src/test/resources/docx-fidelity/word-windows.tsv +++ b/qa/src/test/resources/docx-fidelity/word-windows.tsv @@ -1,27 +1,27 @@ # word 16.0 (16.0.20430) on windows document engine_pages editor_pages lines matched median p90 over2 -cv-blue_banner 2 2 54 52 0.14 0.49 0 +cv-blue_banner 2 2 54 52 0.12 0.46 0 cv-boxed_sections 2 2 58 58 0.28 0.45 0 cv-centered_headline 2 2 58 56 0.11 0.26 0 cv-charcoal_gold 1 1 85 83 0.18 0.27 0 cv-classic_serif 2 2 57 54 0.31 0.44 0 -cv-compact_mono 1 1 58 58 0.24 0.91 0 +cv-compact_mono 1 1 58 58 0.16 0.36 0 cv-editorial_blue 2 2 82 82 0.14 0.27 0 -cv-engineering_resume 1 1 57 57 0.24 0.42 0 +cv-engineering_resume 1 1 57 57 0.22 0.34 0 cv-executive 2 2 60 60 0.21 0.43 0 cv-midnight_navy 1 1 86 84 0.22 0.82 0 cv-minimal_underlined 2 2 59 59 0.44 0.70 0 cv-mint_editorial 2 2 59 59 0.13 0.31 0 cv-modern_professional 2 2 61 59 0.32 0.44 0 -cv-monogram_sidebar 1 1 53 50 0.28 0.67 0 +cv-monogram_sidebar 1 1 53 50 0.20 0.39 0 cv-navy_sidebar 1 1 71 69 0.13 0.36 0 -cv-nordic_clean 1 1 63 58 0.23 0.49 0 -cv-orange_ops 1 1 108 106 0.29 0.71 0 -cv-panel 1 1 79 74 0.83 1.30 0 +cv-nordic_clean 1 1 63 58 0.16 0.35 0 +cv-orange_ops 1 1 108 106 0.22 0.47 0 +cv-panel 1 1 79 74 0.46 0.82 0 cv-professional_sidebar 1 1 68 64 0.30 0.49 0 cv-serif_headline 1 1 103 103 0.50 1.03 0 cv-sidebar_portrait 1 1 49 49 0.15 0.29 0 -cv-slate_orange 1 1 87 85 0.48 1.17 0 +cv-slate_orange 1 1 87 85 0.40 1.17 0 cv-teal_pulse 1 1 57 57 0.11 0.38 0 cv-terracotta_rail 1 1 102 102 0.42 0.87 0 cv-timeline_minimal 2 2 89 87 0.36 0.47 0 @@ -53,7 +53,7 @@ letter-mint-editorial-letter 1 1 10 10 0.18 0.32 0 letter-modern_professional 1 1 12 12 0.10 0.29 0 letter-monogram_sidebar 1 1 12 12 0.14 0.20 0 letter-nordic_clean 1 1 15 15 0.16 0.35 0 -letter-panel 1 1 13 13 0.16 0.21 0 +letter-panel 1 1 13 13 0.14 0.29 0 letter-sidebar_portrait 1 1 12 12 0.41 0.52 0 letter-timeline_minimal 1 1 15 15 0.29 0.53 0 proposal-editorial 2 2 132 130 0.57 1.08 0 diff --git a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxLayoutMetrics.java b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxLayoutMetrics.java index 6c2ec4812..5e1f6ab02 100644 --- a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxLayoutMetrics.java +++ b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxLayoutMetrics.java @@ -673,7 +673,8 @@ OptionalDouble lineHeight(DocumentNode node) { /** * Whether a node's line height is other than its tallest laid-out line ({@link #lineHeight}): * the page's distance between its lines, or a line without its prefix. The paragraph, set at - * that one height, can then come out shorter than the page's; at the tallest line it cannot. + * that one height, can then come out shorter than the page's; at the tallest line, only by its + * rounding to the twip. * * @param node any node that lays its text out as paragraph lines * @return whether the height is not the tallest line's @@ -736,7 +737,7 @@ private OptionalDouble lineHeight(DocumentNode node, boolean byPitch, boolean wi // the gap Word is given on top (applyLineGap) — keeps the first and last lines where // the page has them, never below the tallest written line, which would clip it. Nor // above the lines' mean height: the paragraph would come out taller than the page, - // and a surplus cannot be owed back. + // and a surplus only comes out of the space below it (settleTheLinesWithThePage). if (byPitch && ownWay && pairs > 0 && textLines > 0) { double pitch = pitches / pairs - Math.max(0, lineGap(node)); text = Math.max(text, Math.min(pitch, heights / textLines)); diff --git a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java index 705e60bbc..0037d9c6f 100644 --- a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java +++ b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java @@ -8637,13 +8637,14 @@ private boolean applyParagraphProperties(XWPFParagraph target, ParagraphNode sou topEdgeLine = null; topEdgeLineOver = null; if (stacked == null) { - oweWhatTheLinesFallShort(target, source); + settleTheLinesWithThePage(target, source); } return rightToLeft; } /** - * Owes below a paragraph what its lines are shorter in Word than on the page. + * Owes below a paragraph what its lines are shorter in Word than on the page, and hangs below + * it what they are taller. * *

Word sets a paragraph's lines one height apart, and the page sets each line its own * height. Where they differ the written height is the page's distance between lines @@ -8652,12 +8653,23 @@ private boolean applyParagraphProperties(XWPFParagraph target, ParagraphNode sou * terms, whose wrapped lines carry a taller prefix than their first, stood 0.6pt higher * with every item. Only a paragraph written at a height other than its tallest laid-out * line is made up to the page; one written at its tallest line, to keep its letters whole, - * comes out no shorter than the page and keeps that height.

- */ - private void oweWhatTheLinesFallShort(XWPFParagraph target, ParagraphNode source) { + * falls short only by its line's rounding to the twip, which is not owed: owed, it set + * {@code ModernInvoice}'s lines a step or two of Word's grid lower (measured, see + * {@link #LINES_ROUNDING_TOLERANCE}).

+ * + *

Written at its tallest line, it can come out taller: the page sets a line shorter than + * that, a wrapped line after a large first one, at its own height. Its last line then hangs + * below the block, as a line held to its icon does, and what follows takes that out of the + * space between them; what the space cannot take is named. {@code CompactMono}'s sidebar, its + * skills two lines to a paragraph and each written 0.12pt taller than the page, ended a point + * low. So do lines rounded up to the twip, over enough of them: Word sets them as written — + * {@code OrangeOps}' achievement lines, a 0.08pt gap between them written as a tenth, stood + * nearer the page in Word with what they pass it by hung (measured).

+ */ + private void settleTheLinesWithThePage(XWPFParagraph target, ParagraphNode source) { java.util.OptionalDouble page = layout.linesHeight(source); CTPPr properties = target.getCTP().getPPr(); - if (page.isEmpty() || properties == null || !hasAnExactLine(target) || !layout.lineIsNotTheTallest(source)) { + if (page.isEmpty() || properties == null || !hasAnExactLine(target)) { return; } Long line = writtenTwips(properties.getSpacing().getLine()); @@ -8667,13 +8679,20 @@ private void oweWhatTheLinesFallShort(XWPFParagraph target, ParagraphNode source double written = layout.lineCount(source) * (line / POINT_TO_TWIP) - lineTopsTakenIn.getOrDefault(target.getCTP(), 0.0); double shortBy = page.getAsDouble() - written; - if (shortBy > LINES_SHORT_TOLERANCE) { + if (shortBy > LINES_ROUNDING_TOLERANCE && layout.lineIsNotTheTallest(source)) { owePendingSpacingAfter(shortBy); + } else if (-shortBy > LINES_ROUNDING_TOLERANCE) { + hangingBelow = Math.max(hangingBelow, -shortBy); } } - /** What a paragraph's lines may fall short of the page by, twips rounding, before it is owed. */ - private static final double LINES_SHORT_TOLERANCE = 0.1; + /** + * What a paragraph's lines may fall short of or pass the page by, twips rounding, before it + * is owed below the paragraph or taken out of the space below it: Word sets lines on a grid + * of its own, 0.12pt apart (measured), and a twip more or less of space moves a line a step + * or nothing. + */ + private static final double LINES_ROUNDING_TOLERANCE = 0.1; /** * Sets a paragraph's mark in its text's character formatting: face, size, colour, weight, @@ -10877,6 +10896,8 @@ private static boolean startsWith(byte[] bytes, int... signature) { * ({@link #writePageBreak}). */ private void leaveThePageAbove() { + // What a block on that page never took is named there. + nameAHangLeftOver(); resumeHere(); flushSpacingAfter(); borderBelow = 0; @@ -14333,15 +14354,17 @@ private void holdAParagraphsTopEdgeOnItsPage(XWPFDocument document, ParagraphNod double edges = Math.max(0, carriedSpacingBefore); double above = spaceAboveOnItsPage(node); double kept = Double.isNaN(above) ? own + edges : Math.max(0, above) + Math.max(0, node.padding().top()); - if (!(kept > 0.01)) { - return; - } // Text hanging below a band, a pull out of the block before and a card's border below // it stay on the page above with them, as at a table moved to a new page: the layout - // starts the new page from its top. + // starts the new page from its top, with or without an edge to hold there. What a block + // on that page never took is named there. + nameAHangLeftOver(); forgetTheHang(); pullBelow = 0; borderBelow = 0; + if (!(kept > 0.01)) { + return; + } carriedSpacingBefore += own; XWPFParagraph line = newBodyParagraph(document); pullLeftOn = null; @@ -14671,7 +14694,8 @@ private void writeSpacer(XWPFDocument document, SpacerNode node) throws Exceptio // Text hanging below the block before — a row's last line held to its icon — a pull // out of it and a card's border below it stay on the page above with it, as at a // paragraph moved to a new page (holdAParagraphsTopEdgeOnItsPage), whether or not the - // spacer's line then holds any of the gap. + // spacer's line then holds any of the gap. What a block there never took is named there. + nameAHangLeftOver(); forgetTheHang(); pullBelow = 0; borderBelow = 0; @@ -14703,6 +14727,11 @@ private void writeSpacer(XWPFDocument document, SpacerNode node) throws Exceptio pullLeft = 0; } owePendingSpacingAfter(height); + // A spacer shorter than its hairline — a width anchor of no height, as Panel's cards + // open with — has the hairline reach past it by the rest of that tenth, as a line hangs + // below a block: what follows takes it out of the space between them, or names it. Taken + // nowhere, it stood every card a tenth of a point taller in Word. + hangingBelow = Math.max(hangingBelow, SEPARATOR_POINTS - Math.max(0, node.height())); // The page gives a spacer its margin and padding above and below as well; here it is // its height alone. The space below a band, or below a layer another resumes after in // its column, is measured from the page, the margin and padding below its block in it. @@ -14767,7 +14796,9 @@ private double takeTheTailOutOf(double room) { * what of it the space does not take, the panel's padding below takes, the border then * drawn that much inside the panel's edge; *
  • a line hanging below the box of the block above — a band's text held to its marker, a - * cell's last line held to its icon (hangingBelow);
  • + * cell's last line held to its icon, the last line of a paragraph Word sets taller than + * the page, a spacer's line past a spacer shorter than it: hangingBelow, as + * {@link #settleTheLinesWithThePage} and {@link #writeSpacer} set it among others; *
  • the paragraph Word needs between two tables, which the page does not have * ({@link #separateFromTheTableAbove}).
  • * diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java index ef72a603f..f0009b039 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java @@ -121,6 +121,63 @@ void aSpacerIsItsHeightAndNotALineOfTextAsWell() throws Exception { } } + @Test + void theSpaceBelowASpacerOfNoHeightTakesItsHairline() throws Exception { + // Nothing on the page, it is a hairline in Word: the space below takes that back, or the + // next entry stood a tenth of a point lower than the page sets it. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addSection("Entries", entries -> entries + .spacing(9) + .addParagraph("First entry") + .addSpacer(spacer -> spacer.name("Anchor").width(100).height(0)) + .addParagraph("Second entry")))) { + List all = document.getParagraphs(); + XWPFParagraph spacer = all.get(1); + + assertThat(spacer.getText()).isEmpty(); + assertThat(before(spacer) + DocxTwips.of(spacer.getCTP().getPPr().getSpacing().getLine()) + before(all.get(2))) + .as("the section's spacing either side of the spacer, its hairline included") + .isEqualTo(2 * NINE_POINTS); + } + } + + @Test + void theSpaceUnderACardsOpeningSpacerOfNoHeightTakesItsHairline() throws Exception { + // A width anchor: Panel's cards open with one, and each card stood a tenth of a point + // taller in Word than on the page. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addSection("Card", card -> card + .spacing(9) + .fillColor(DocumentColor.rgb(240, 240, 240)) + .padding(DocumentInsets.of(6)) + .addSpacer(spacer -> spacer.name("Anchor").width(200).height(0)) + .addParagraph("Title")))) { + XWPFTableCell cell = document.getTables().get(0).getRow(0).getCell(0); + XWPFParagraph spacer = cell.getParagraphs().get(0); + + assertThat(cell.getParagraphs()).extracting(XWPFParagraph::getText).containsExactly("", "Title"); + assertThat(DocxTwips.of(spacer.getCTP().getPPr().getSpacing().getLine()) + before(cell.getParagraphs().get(1))) + .as("the card's spacing under the anchor, its hairline included").isEqualTo(NINE_POINTS); + } + } + + @Test + void aCardsPaddingBelowTakesTheHairlineOfASpacerOfNoHeightEndingIt() throws Exception { + // Nothing owed below the spacer in the card: the card's padding below takes the tenth, + // as it takes a line hanging below its last block. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addSection("Card", card -> card + .fillColor(DocumentColor.rgb(240, 240, 240)) + .padding(DocumentInsets.of(6)) + .addParagraph("Title") + .addSpacer(spacer -> spacer.name("Anchor").width(200).height(0))))) { + XWPFTableCell cell = document.getTables().get(0).getRow(0).getCell(0); + + assertThat(DocxTwips.of(cell.getCTTc().getTcPr().getTcMar().getBottom().getW())) + .as("its 6pt padding less the hairline").isEqualTo(6 * 20 - 2); + } + } + @Test void aSpacerOverATableHoldsTheRestOfItsHeightBelowItsHairline() throws Exception { // A table has no space above it in Word, so the spacer writes the rest of its height diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java new file mode 100644 index 000000000..cc5bddb85 --- /dev/null +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java @@ -0,0 +1,211 @@ +package com.demcha.compose.document.backend.semantic.docx; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextStyle; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.junit.jupiter.api.Test; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr; + +import java.io.ByteArrayInputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.within; + +/** + * A paragraph Word sets taller than the page takes the difference out of the space below it, and + * names what that space cannot take. + * + *

    Word sets every line of a paragraph at one height, which the export writes as its tallest + * line's; the page sets each line at its own. A paragraph opening on a large run sets its wrapped + * line closer on the page than in Word, and Word's paragraph ends that much lower. What follows + * takes it out of the space between them, as it takes a line hanging below the block above; what + * the space cannot take is named.

    + */ +class DocxLineSurplusTest { + + private static final DocumentTextStyle LARGE = DocumentTextStyle.builder().size(20).build(); + private static final DocumentTextStyle SMALL = DocumentTextStyle.builder().size(9).build(); + + /** The page's content: 400 x 600 with a 20pt margin. */ + private static final double CONTENT = 560; + + @Test + void theSpaceBelowAParagraphWordSetsTallerTakesTheDifference() throws Exception { + Exported exported = export(page -> page.spacing(20).addParagraph(DocxLineSurplusTest::mixed).addParagraph("After")); + double surplus = surplus(exported); + + assertThat(surplus).as("the premise: Word's lines at the tallest pass the page's").isGreaterThan(1); + assertThat(before(paragraph(exported.document(), "After")) / 20.0).as("the gap less what Word's lines pass the page by") + .isCloseTo(20 - surplus, within(0.05)); + assertThat(exported.report().bySubject().get("space above")).isNull(); + } + + @Test + void whatTheSpaceBelowCannotTakeIsNamed() throws Exception { + Exported exported = export(page -> page.addParagraph(DocxLineSurplusTest::mixed) + .addParagraph(p -> p.name("After").text("After"))); + double surplus = surplus(exported); + + assertThat(exported.report().bySubject().get("space above")).singleElement().satisfies(note -> { + assertThat(note.path()).contains("After"); + assertThat(note.detail()).isEqualTo("it stands " + points(surplus) + "pt lower than the page " + + "sets it, and what follows with it: the space the page leaves above it does not hold the line " + + "hanging below the block above it (" + points(surplus) + "pt)"); + }); + } + + @Test + void aParagraphEndingAPageLeavesWhatItPassesThePageByThere() throws Exception { + // The block the layout opens the next page with stands at that page's top, as in Word: + // the hang stays on the page above, and nothing is named. + double mixed = export(page -> page.addParagraph(DocxLineSurplusTest::mixed)).heights().get("Mixed"); + Exported exported = export(page -> page.spacer(0, CONTENT - mixed - 2) + .addParagraph(DocxLineSurplusTest::mixed) + .addParagraph(p -> p.name("After").text("After"))); + + assertThat(surplus(exported)).as("the premise: Word's lines pass the page's").isGreaterThan(1); + assertThat(exported.pages().get("After")).as("the premise: the layout opens a page with it") + .isGreaterThan(exported.pages().get("Mixed")); + assertThat(exported.report().bySubject().get("space above")).isNull(); + } + + @Test + void whatABlockEndingAPageNeverTookIsNamedThere() throws Exception { + // A list item takes nothing out of a top edge of its own: the paragraph's hang over it + // stands it lower on its page, which the paragraph opening the next page leaves named. + double mixed = export(page -> page.addParagraph(DocxLineSurplusTest::mixed)).heights().get("Mixed"); + double points = export(page -> page.addList(list -> list.name("Points").bullet().items("Point"))) + .heights().get("Points"); + Exported exported = export(page -> page.spacer(0, CONTENT - mixed - points - 2) + .addParagraph(DocxLineSurplusTest::mixed) + .addList(list -> list.name("Points").bullet().items("Point")) + .addParagraph(p -> p.name("After").text("After"))); + + assertThat(exported.pages().get("After")).as("the premise: the layout opens a page with it") + .isGreaterThan(exported.pages().get("Points")); + assertThat(exported.report().bySubject().get("space above")).singleElement() + .satisfies(note -> assertThat(note.path()).contains("Points")); + } + + @Test + void theSpaceBelowAParagraphOfOneSizeTakesWhatItsRoundingAdds() throws Exception { + // Rounded up to the twip over enough lines to pass the page by a tenth of a point and + // more: Word sets the lines as written, OrangeOps' achievement lines among them. + Exported exported = rounded(surplus -> surplus > 0.15); + double line = line(paragraph(exported.document(), "rounded")); + double page = exported.heights().get("Rounded"); + double surplus = Math.round(page / line) * line - page; + + assertThat(before(paragraph(exported.document(), "After")) / 20.0).as("the gap less what the lines pass the page by") + .isCloseTo(20 - surplus, within(0.05)); + assertThat(exported.report().bySubject().get("space above")).isNull(); + } + + @Test + void aParagraphWrittenAtItsTallestLineOwesNothingForItsRounding() throws Exception { + // Rounded down to the twip, over enough lines to fall a tenth of a point and more short of + // the page: owed, that rounding stood ModernInvoice's lines a step of Word's grid lower. + Exported exported = rounded(surplus -> surplus < -0.15); + + assertThat(before(paragraph(exported.document(), "After"))).as("the gap alone").isEqualTo(400); + } + + @Test + void aSpacerOfNoHeightWithNoSpaceBelowItIsNamed() throws Exception { + Exported exported = export(page -> page.addParagraph("Above") + .addSpacer(spacer -> spacer.name("Anchor").width(100).height(0)) + .addParagraph(p -> p.name("After").text("After"))); + + assertThat(exported.report().bySubject().get("space above")).singleElement().satisfies(note -> { + assertThat(note.path()).contains("After"); + assertThat(note.detail()).isEqualTo("it stands 0.1pt lower than the page sets it, and what follows with " + + "it: the space the page leaves above it does not hold the line hanging below the block above " + + "it (0.1pt)"); + }); + } + + /** + * A one-size paragraph of many lines, followed 20pt below by another, at the first type size + * from 8 to 12pt whose lines, written at the twip, pass the page's by what {@code passing} + * accepts. + */ + private static Exported rounded(java.util.function.DoublePredicate passing) throws Exception { + String text = "rounded text that wraps onto many lines ".repeat(20); + for (double size = 8; size < 12; size += 0.05) { + DocumentTextStyle style = DocumentTextStyle.builder().size(size).build(); + Exported exported = export(page -> page.spacing(20) + .addParagraph(p -> p.name("Rounded").inlineText(text, style)) + .addParagraph("After")); + double line = line(paragraph(exported.document(), "rounded")); + double page = exported.heights().get("Rounded"); + if (passing.test(Math.round(page / line) * line - page)) { + return exported; + } + } + throw new AssertionError("the premise: no size from 8 to 12pt rounds its lines that far off the page"); + } + + private static void mixed(ParagraphBuilder paragraph) { + paragraph.name("Mixed").inlineText("Lead ", LARGE) + .inlineText("small text that wraps onto a second line ".repeat(3), SMALL); + } + + /** How far Word's two lines, both at the paragraph's one height, pass the page's. */ + private static double surplus(Exported exported) { + double line = line(paragraph(exported.document(), "Lead")); + double page = exported.heights().get("Mixed"); + assertThat(page).as("the premise: the paragraph is two lines, the second shorter").isBetween(line, 2 * line); + return 2 * line - page; + } + + private static double line(XWPFParagraph paragraph) { + return DocxTwips.of(paragraph.getCTP().getPPr().getSpacing().getLine()) / 20.0; + } + + private static String points(double points) { + return java.math.BigDecimal.valueOf(Math.round(points * 100) / 100.0).stripTrailingZeros().toPlainString(); + } + + private static XWPFParagraph paragraph(XWPFDocument document, String start) { + return document.getParagraphs().stream().filter(p -> p.getText().startsWith(start)).findFirst().orElseThrow(); + } + + private static long before(XWPFParagraph paragraph) { + CTPPr properties = paragraph.getCTP().getPPr(); + if (properties == null || !properties.isSetSpacing() || !properties.getSpacing().isSetBefore()) { + return 0; + } + return DocxTwips.of(properties.getSpacing().getBefore()); + } + + private record Exported(XWPFDocument document, DocxExportReport report, Map heights, + Map pages) { + } + + private static Exported export(Consumer content) throws Exception { + AtomicReference report = new AtomicReference<>(); + Map heights = new HashMap<>(); + Map pages = new HashMap<>(); + byte[] docx; + try (DocumentSession session = GraphCompose.document().pageSize(400, 600).margin(DocumentInsets.of(20)).create()) { + session.pageFlow(content::accept); + session.layoutGraph().nodes().forEach(node -> { + if (node.semanticName() != null) { + heights.putIfAbsent(node.semanticName(), node.placementHeight()); + pages.putIfAbsent(node.semanticName(), node.startPage()); + } + }); + docx = session.export(new DocxSemanticBackend(report::set)); + } + return new Exported(new XWPFDocument(new ByteArrayInputStream(docx)), report.get(), heights, pages); + } +} diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java index ab92ea2a7..17d15694e 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java @@ -55,6 +55,26 @@ void aSpacerTheGapBeforeCarriesToANewPageHoldsTheGapInItsLine() throws Exception } } + @Test + void aSpacerOfNoHeightTheGapBeforeCarriesToANewPageHoldsTheGapInItsLine() throws Exception { + // A spacer of no height that opens a page holds the gap the layout carries there in its + // line, as a taller one does. + try (XWPFDocument document = DocxExports.withLayout(300, 200, 20, page -> page + .spacing(GAP) + .spacer(0, CONTENT - 3) + .spacer(0, 0) + .addParagraph("After"))) { + CTSpacing spacing = spacing(spacerOnThePageAfter(document)); + + assertThat(spacing.getLineRule()).isEqualTo(STLineSpacingRule.EXACT); + assertThat(DocxTwips.of(spacing.getLine())).as("the gap, and the hairline's height") + .isEqualTo(Math.round(GAP * 20) + HAIRLINE); + assertThat(before(spacing(paragraphWith(document, "After")))) + .as("the gap below it, less the hairline the spacer has not the height for") + .isEqualTo(Math.round(GAP * 20) - HAIRLINE); + } + } + @Test void aSpacerTheGapBeforeStaysAboveIsWrittenAsBefore() throws Exception { // 150pt leave 10: the gap fits at the foot of the first page, the spacer does not.