Skip to content

Preserve carriage returns in literal PDF strings - #38

Open
jihtsan wants to merge 2 commits into
CourtBouillon:mainfrom
jihtsan:codex/37-preserve-pdf-string-line-endings
Open

jihtsan wants to merge 2 commits into
CourtBouillon:mainfrom
jihtsan:codex/37-preserve-pdf-string-line-endings

Conversation

@jihtsan

@jihtsan jihtsan commented Oct 21, 2026

Copy link
Copy Markdown

Fixes #37.

ASCII CR and CRLF were emitted as raw line endings inside literal PDF strings. Conforming readers normalize them to LF, so the stored value could change. Escape CR/LF after escaping backslashes and parentheses, preserving string/byte values and the UTF-16 hex representation.

Validation on CPython 3.13.12:

  • Nine new regression cases: seven fail and two controls pass on the base; all pass with the fix.
  • Ghostscript 10.08.0 rewrites compressed and uncompressed PDFs, then pypdf reads their Title. Four of six baseline cases lose CR/CRLF; all six fixed cases preserve the input. Reading the original with pypdf alone does not show the problem; native Ghostscript parsing is essential to that check.
  • python -m pytest: 71 passed, 100% line and branch coverage.
  • python -m ruff check and git diff --check: pass; independent Codex Standards and Spec reviews found no unresolved issues.

Other Python/platform combinations were not tested locally. pypdf was used only for extra verification and is not added as a project dependency. This is independent of the name-object escaping in #36.

AI assistance: OpenAI GPT-6 (Codex) performed reproduction, implementation, tests, drafting and independent agent reviews at the account owner's request.

Fixes CourtBouillon#37. Escape CR/LF before serialization so conforming readers cannot normalize raw CR or collapse CRLF; preserve byte strings and the UTF-16 hex path.

AI assistance: OpenAI GPT-6 (Codex), authorized by the account owner. Prompt summary: reproduce literal-string byte loss using Ghostscript, preserve line endings, add regressions, and run the full test suite and independent review.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Literal PDF strings lose carriage returns when parsed

1 participant