From 447b3fd1f31ebf2ef6f16132bd4d597e0f545d60 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Sun, 17 Dec 2023 00:20:25 -0800 Subject: [PATCH] Correct Font Size Calculated by MsDoc Reader Fix #2526. Most of that issue has already been fixed. The one remaining problem was a deprecation message handling font size. The code used `dechex($operand / 2)`, and issued the deprecation message whenever `$operand` was odd because `dechex` is designed only for integer conversion. `$operand` is actually 2 times the point size, so it will be odd only when the point size is some integer plus half a point (no other fractions are allowed). At any rate, it seems that `dechex` should not be used here in the first place; font size is a numeric value, not a hex string. There are many problems with MsDoc Reader at the moment. This PR is narrowly focused on the problem at hand. Its test is, at least, more detailed than the existing MsDoc Reader test, which does nothing more than confirm that read successfully creates a PhpWord object. The new test verifies that the font size is as expected, but does not validate any other aspect of the read. --- src/PhpWord/Reader/MsDoc.php | 2 +- tests/PhpWordTests/Reader/MsDocTest.php | 16 ++++++++++++++++ .../PhpWordTests/_files/documents/word.2526.doc | Bin 0 -> 24576 bytes 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/PhpWordTests/_files/documents/word.2526.doc diff --git a/src/PhpWord/Reader/MsDoc.php b/src/PhpWord/Reader/MsDoc.php index 4cf755e3fa..2599e42350 100644 --- a/src/PhpWord/Reader/MsDoc.php +++ b/src/PhpWord/Reader/MsDoc.php @@ -1871,7 +1871,7 @@ private function readPrl($data, $pos, $cbNum) break; // sprmCHps case 0x43: - $oStylePrl->styleFont['size'] = dechex($operand / 2); + $oStylePrl->styleFont['size'] = $operand / 2; break; // sprmCIss diff --git a/tests/PhpWordTests/Reader/MsDocTest.php b/tests/PhpWordTests/Reader/MsDocTest.php index deb8b9badd..f5f75ab790 100644 --- a/tests/PhpWordTests/Reader/MsDocTest.php +++ b/tests/PhpWordTests/Reader/MsDocTest.php @@ -60,6 +60,22 @@ public function testLoad(): void self::assertInstanceOf('PhpOffice\\PhpWord\\PhpWord', $phpWord); } + public function testLoadHalfPointFont(): void + { + $filename = __DIR__ . '/../_files/documents/word.2526.doc'; + $phpWord = IOFactory::load($filename, 'MsDoc'); + $sections = $phpWord->getSections(); + self::assertCount(1, $sections); + $elements = $sections[0]->getElements(); + self::assertArrayHasKey(0, $elements); + $element0 = $elements[0]; + if (method_exists($element0, 'getFontStyle')) { + self::assertSame(19.5, $element0->getFontStyle()->getSize()); + } else { + self::fail('Unexpected no font style for first element'); + } + } + /** * Test exception on not existing file. */ diff --git a/tests/PhpWordTests/_files/documents/word.2526.doc b/tests/PhpWordTests/_files/documents/word.2526.doc new file mode 100644 index 0000000000000000000000000000000000000000..94fc5ed8fd566e4cdaa44b6f1eb8b520773454d1 GIT binary patch literal 24576 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 is)sro_y=Ph`kir6W13Ib^PNe3&!RC