PDF to XLS writer source record Purpose ------- Writes the legacy Excel 97-2003 XLS workbook offered by the PDF to Excel route. Upstream source --------------- Repository: https://github.com/ExaDev/documents.js Commit: 02ae8a5e5c2463345e10ffdc98c5631e018eeba9 Packages used: xls-codec, archive-codec, document-schema.js, excel-number-format Licence: MIT Licence SHA-256: cf7829eff583e4a1d96ea6621f9ae62fdf60d653e0d36e99b18758fcae26ab00 pdfpix repair ------------- Patch: app/bench/office/repairs/xls-rich-fonts/documents.js.patch Base commit: 02ae8a5e5c2463345e10ffdc98c5631e018eeba9 Patch SHA-256: 07871cbaffeffe907c81f77c68855a5cfb889d6c0b82fa673e636e93a1996b4b Bundled dependencies -------------------- fflate 0.8.3, MIT, licence SHA-256 0a1df3a083d0c010560aa342e87959c8c1070e6fd54545741f083f22d0c8b551 Zod 4.5.4, MIT, licence SHA-256 3f1189b28e3866e0d979968d466b78f813f76827cfdca1fbb124cc0a5c8841f8 Build ----- Builder: app/bench/office/build_pdf_to_xls_runtime.mjs Runtime: Bun 1.4.2 Bundler: esbuild 0.28.0 Bundler output bytes: 496039 Bundler output SHA-256: 83616ed593c3a1589a51a9db6d38c7aaa0103177983ee38f357fe46f87c7a470 Repair tool: app/bench/office/repair_pdf_to_xls_runtime.mjs Repair tool: app/bench/office/repair_pdf_to_xls_row_blocks.mjs Output: app/src/office/runtime/pdf-to-xls-writer.vendor.mjs Output bytes: 496289 Output SHA-256: 9393ebf08af742c058c5acc245bb58b2db036ed8b040eb639a3fca9d4eec9002 Brotli quality 11 bytes: 89757 Build report: app/src/office/runtime/pdf-to-xls-writer.build.json The builder requires a source root containing the pinned documents.js checkout, the esbuild module, the dependency root, a new output directory and the repair directory, in that order. It verifies the commit, exact patch, tool version, input hashes, dependency manifests and licences. It builds twice and rejects different output or any unresolved runtime import. Zod 4 runs new Function("") once, while the module evaluates, to choose between a compiled validator and an interpreted one. The site serves script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval', so every browser refuses the call, reports the refusal to the page and takes the interpreted path anyway. The first repair tool rewrites that probe to false, so the call is never made. The writer cuts a sheet into 32-row blocks by row index and wrote one DBCELL record and one INDEX entry per block, including for a block that holds no ROW records. A reader takes a block as a run of ROW records, so it stops at that DBCELL with the block unfinished and then counts fewer cells than DIMENSIONS declares. A row with no text writes no ROW record, so a sheet with more than 32 text-free rows in a row reaches that state. Three corpus files hit it and produced no download. The second repair tool skips a block with no rows and sizes the INDEX record to the blocks written. Those two are the only edits made to the bundler's output. app/bench/office/pdf_to_xls_writer_csp.test.mjs proves the writer asks for no eval and that these numbers describe the shipped file, and app/bench/office/xls_empty_row_block.test.mjs proves the row-block repair with no corpus.