Skip to content

Upgrade to Apache PdfBox 2.0.37 and Build modernization - #591

Draft
sandeepkrs wants to merge 2 commits into
TomRoush:masterfrom
sandeepkrs:master
Draft

sandeepkrs wants to merge 2 commits into
TomRoush:masterfrom
sandeepkrs:master

Conversation

@sandeepkrs

Copy link
Copy Markdown

Fixes and Improvements:

  • Upgraded to Apache PdfBox 2.0.37
  • Build modernization
    • JDK 17
    • Kotlin base build.gradle
    • Min SDK version: 21, Target SDK: 36
    • Updated dependencies, Maven dependency fixes, and many others

Agents used:

  • GLM 5.3 with Claude Code CLI
  • Gemini Flash 3.8 via Antigravity

Tests:

  • Compiles clean on Windows, Ubuntu
  • Sample app features works + my app too (integrated via jitpack on github release tag)

sandeepkrs and others added 2 commits September 4, 2026 15:16
* docs: add PDFBox 2.0.27 -> 2.0.37 upgrade plan

Co-Authored-By: Claude <noreply@anthropic.com>

* Vendor jp2-android AAR to restore the build

The com.gemalto.jp2:jp2-android:1.0.3 artifact is no longer resolvable:
JCenter redirects to Maven Central where the artifact does not exist.
Vendor the AAR (BSD-2-Clause, (c) 2018 Gemalto s.r.o., unmodified) into
library/libs/ and sample/libs/ and switch both modules to file
dependencies. README updated with attribution and new usage.

Also drop -XX:MaxPermSize from org.gradle.jvmargs: JDK 17 refuses to
start the daemon with it (JDK 11 only warned).

Verified: ./gradlew build test on JDK 17.
BASELINE-0 (pre-existing unit failures on untouched code): 20 tests in
pdmodel.interactive.form fail because the test JVM cannot download
remote fixtures behind TLS-intercepting AV; environmental, unrelated to
this change.

Co-Authored-By: Claude <noreply@anthropic.com>

* Bump BouncyCastle jdk15to18 1.73 -> 1.85 family; raise library language level to 1.8

bcprov 1.85.2, bcpkix 1.85, bcutil 1.85.1 (per-artifact latest of the
same 1.85 release family; BC only publishes patch revisions for jars
that changed). compileOptions 1_7 -> 1_8 to match the sample module and
modern dependency bytecode.

Gate: build test -> 497 tests, failure set byte-identical to BASELINE-0
(20 known environmental TLS-fixture failures). Recorded as BASELINE-1.

Co-Authored-By: Claude <noreply@anthropic.com>

* Update fontbox Unicode Scripts.txt to 15.1.0 (upstream 2.0.37)

Upstream upgraded the script data from Unicode 10.0.0 (2017) to
15.1.0 (2023): ~440 changed mapping lines, 2693 -> 3033 lines.
Byte-copied from the 2.0.37 source distribution.

Gate: unit tests, failure set identical to BASELINE-1.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (1/10): fontbox — sync 41 changed files, add CMapStrings

Merge upstream fontbox changes from Apache PDFBox 2.0.27 to 2.0.37:

- cmap: new CMapStrings string table (byte-dedup for 1-2 byte codes,
  PDFBOX-5850); CMap.addCharMapping uses it; CMapParser.createStringFromBytes
  delegates to it; LiteralName dict-key comparison fix; increment() guard
  against negative position (PDFBOX-4661 follow-up)
- cff: CFFParser PDFBOX-5843 (defer "Private" entry validation for
  CIDFonts, tolerate empty entries); Type1CharString method renames
  (setCurrentPoint/callOtherSubr) + PDFBOX-5339 accent path caching
- ttf: GlyphTable/GlyfCompositeDescript recursion level guard for
  self-referencing composite glyphs; unmodifiable getComponents() view;
  TTFParser/GlyphData/TTFSubsetter etc. accumulated fixes; GlyphRenderer
  trace-level guards
- autodetect: WindowsFontDirFinder drops cmd.exe exec in favor of
  System.getenv (irrelevant on Android but kept in sync)
- Android deltas preserved: PDFBoxResourceLoader cmap/Scripts.txt loading
  (CMapParser, OpenTypeScript), Path.op union in seac, inner Point class
  and Path.close in GlyphRenderer, dropped CentOS X11 dir

Unit tests: failure set identical to baseline (20 known environmental
TLS failures; 497 tests, 446 pass, 31 skipped).

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (2/10): cos/io/parser/writer — sync 29 files, add StringUtil

Merge upstream cos, io, pdfparser, pdfwriter and util changes from
Apache PDFBox 2.0.27 to 2.0.37:

- cos: COSName reworked to byte-based identity (PDF 32000-1 §7.3.5:
  names are byte sequences, not UTF-8 strings; ByteBuffer-keyed
  canonical maps, getPDFName(byte[]) factory); COSString hex parsing
  via Hex.getHexValue with FORCE_PARSING leniency; COSDictionary
  null-safety in getKeyForValue and toString recursion guards; all 22
  new COSName constants taken (556 total, matches upstream)
- pdfparser: BaseParser recursion depth guard (max 500, PDFBOX-5788),
  lenient missing dictionary close, skipLinebreak refactor,
  checkForEndOfString LF variants, decodeBuffer with Windows-1252
  alternative charset, PDFBOX-5025 "NNNendobj" number catch;
  COSParser validateStreamLength rewrite (zero/negative length,
  PDFBOX-5954/5880), xref parsing via new StringUtil.splitOnSpace,
  object-stream ArrayList without attacker-controlled capacity;
  PDFStreamParser close(), nested inline image rejection (PDFBOX-6038),
  isolated '+' handling (PDFBOX-5906), ReDoS-safe number pattern
- pdfwriter: COSWriter incremental-update xref/size handling,
  detectPossibleSignature (PDFBOX-5521), SHA-256 document ID instead
  of MD5
- util: new StringUtil (splitOnSpace); Hex.getHexValue fast path;
  Matrix javadoc; FileTypeDetector/SmallMap/IterativeMergeSort sync
- io: ScratchFile/ScratchFileBuffer sync

Forward-ported from multipdf (lands fully in batch 9): the upstream
"Tx".equals() fix in PDFMergerUtility.mergeFields — the old ==
identity comparison silently skipped field joining now that COSName
names are byte-decoded strings (also fixes upstream's duplicated
destField operand).

Android deltas preserved: PDFBoxResourceLoader absent (loader sites
live in pdmodel/font, merged later), port IOUtils.closeAndLogException
3-arg signature, e.getMessage() in exception logging.

Unit tests: failure set identical to baseline (20 known environmental
TLS failures; 497 tests, 446 pass, 31 skipped).

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (3/10): pdmodel core — root, common, fixup

Merge upstream 2.0.27→2.0.37 changes into pdmodel root/common/fixup
(32 files) plus graphics/state closure pair pulled in by the compile
rule (PDSoftMask, PDExtendedGraphicsState).

Port deltas preserved:
- PDDocument: Android static-init block (kept, upstream's
  WritableRaster/UnsatisfiedLinkError voodoo dropped), 3-arg
  IOUtils.closeAndLogException, Log.x(tag, msg, e) exception logging
- PDAbstractContentStream / PDPageContentStream / PDAppearanceContentStream:
  AWTColor signatures; dropped colorspaces (Pattern/Separation/DeviceN)
  stay commented with // TODO: PdfBox-Android; Path.FillType
  winding rules (fill + deprecated clipPath)
- PDResources: cache condition keeps PDPattern exclusion comment
- PDRectangle: PointF-based path construction + path.close()
- PDExtendedGraphicsState: Paint.Cap/Paint.Join getters

Upstream taken: addSignature restructure + subsetDesignatedFonts() in
all save paths (PDDocument), beginMarkedContent + MCID simplified
notation, PDResources directFontCache + 3-arg ctor wiring
(ResourceCache through PDExtendedGraphicsState/PDSoftMask), TABLOID
page size + huge-value clamping (PDRectangle), getCOSArray/getCOSName
patterns, PDFBOX-5890/6214-era fixes.

Gates: compile green; unit tests 497/446 pass, failure set identical
to BASELINE-1 (20 environmental TLS failures); eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (4/10): documentinterchange, encryption, fdf

Merge upstream 2.0.27→2.0.37 changes into pdmodel documentinterchange
(12 files), encryption (9), fdf (18); 39 files total.

Port deltas preserved:
- SecurityProvider: remove Android-provided BouncyCastle provider before
  registering our own (invariant); upstream's reflection-free direct
  construction taken, try/catch chain dropped with it
- FDFAnnotation + Circle/Line/Polygon/Polyline/Square: AWTColor in place
  of java.awt.Color for color/interiorColor APIs; upstream's new shared
  getColor(COSName) helper typed as AWTColor
- PDStructureTreeRoot / StandardSecurityHandler: "Log instance."
  javadoc removed, Log.e tag/msg/throwable form

Upstream taken: PDStructureTreeRoot getClassMap/setClassMap (ClassMap
support, PDFBOX-4695-era), parent-tree javadoc; StandardSecurityHandler
RANDOM static SecureRandom + encryptionVersion local caching +
determineEncryptionKey restructure; SaslPrep, PDEncryption,
SecurityHandlerFactory/PublicKeySecurityHandler fixes; FDFDictionary /
FDFField / FDFDocument updates.

Gates: compile green; unit tests 497/446 pass, failure set identical
to BASELINE-1 (20 environmental TLS failures); eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (5/10): pdmodel/graphics — color, image, shading, state

Merge upstream 2.0.27→2.0.37 changes into pdmodel/graphics (24 files)
plus filter/DecodeResult closure (JPXSMask carrier for the new lazy
JPX init). 19 files auto-merged (tx37), 22 manual merges; 14
upstream-changed files that were dropped in this port (8 color spaces,
PNGConverter, 5 shading contexts/paints) stay dropped.

Port deltas preserved:
- PDColorSpace: DeviceRGB fallbacks with Log.e for dropped spaces
  (Pattern/CalGray/CalRGB/DeviceN/Indexed/Separation/Lab); Bitmap-based
  abstract toRGBImage; toRawImage/toRGBImageAWT stay commented
- PDICCBased: no ICC_Profile/awt — upstream cache restructure grafted
  into 3-space-indented port body
- PDJPXColorSpace: android.graphics.ColorSpace with SDK>O guard; new
  upstream toRGB implemented via Color.valueOf/convert (API 26+)
- PDImageXObject: BitmapFactory rewrite kept; applyMask/scaleImage
  Bitmap mechanics kept. Upstream's PDFBOX-5375 ctor skip-decode
  replaced by upstream's final lazy initJPXValues() design (better:
  enables PDFBOX-5657 SMaskInData via DecodeResult.getJPXSMask)
- SampledImageReader: fromAny/applyColorKeyMask stay dropped; upstream
  wrapped-stream close fix applied to getStencilImage
- PDGraphicsState: Region/GraphicsUtil mechanics kept; upstream
  clippingCache→single-slot clippingPathCache restructure + textMatrix/
  textLineMatrix fields/accessors taken; Paint.Cap/Join getters kept
- Shading: toPaint stays commented (TODO: PdfBox-Android); PointF/RectF
  bodies kept; upstream stream-close/abort-on-bad-flag/vertex-locals/
  readVertex-validation fixes grafted

Upstream taken: getCOSArray casts throughout shading, PDShadingType4
abort on broken stream/bad flag, PDShadingType5 lattice vertex locals +
list capacity, ShadedTriangle calcColor restructure, PDOutputIntent
getCOSStream + javadoc, CCITTFactory TIFF FillOrder=2 support
(fliptable) + bos capacity.

Gates: compile green; unit tests 497/446 pass, failure set identical
to BASELINE-1 (20 environmental TLS failures); eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (6/10): pdmodel/font — sync 19 files

Auto-synced (11): PDCIDFont, PDCIDFontType2, PDCIDFontType2Embedder,
PDFont, PDFontDescriptor, PDTrueTypeFont, PDTrueTypeFontEmbedder,
PDType1FontEmbedder, PDType3CharProc, DictionaryEncoding,
MacOSRomanEncoding.

Manual merges (8):
- FileSystemFontProvider: re-apply FontLoadLevel gating (NONE/MINIMUM
  loads only DroidSans variants; FULL loads all) into the upstream
  2.0.37 ctor restructure.
- FontMapperImpl: re-apply the 12 Android substitute mappings and the
  PDFBoxResourceLoader-based fontdir.properties loading.
- PDSimpleFont/PDType0Font: keep noUnicode guard (buildging
  '.notdef'-safe widths) around the upstream null-uni handling.
- PDType3Font, PDType1CFont: upstream sync; port Type1CharString
  returns RectF so getBounds().height() replaces getHeight().
- TrueTypeEmbedder: take upstream TABLES constant, LinkedHashSet
  subset order, Charsets.US_ASCII ttcf check, os2 local, force-
  invisible ZWSP/WJ removal, getSubsetCodePoints(); keep RectF
  computeBounds for cap height / x-height paths.
- GlyphList: take upstream put-then-warn duplicate handling and
  merged uniXXXX/uXXXX parser; keep PDFBoxResourceLoader asset
  loading fallback.

Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests,
20 failed / 31 skipped - failure set identical to BASELINE-1 (known
Norton PKIX environmental failures); eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (7/10): contentstream — sync 20 files + OCG test

Auto-synced (16, tx37 verbatim — Android deltas were import-order only):
PDCID-style operator classes SetNonStrokingDevice{CMYK,Gray,RGB}Color,
SetStrokingDevice{CMYK,Gray,RGB}Color, SetNonStrokingColorSpace,
SetStrokingColorSpace (new isShouldProcessColorOperators guard),
CurveToReplicateFinalPoint, DrawObject, ShadingFill, BeginInlineImage,
BeginMarkedContentSequenceWithProperties, SetLineWidth,
SetLineMiterLimit, SetFontAndSize.

Manual merges (4):
- PDFStreamEngine: take upstream text-matrix-in-graphics-state rework
  (drops engine-level textMatrix/textLineMatrix fields), uncolored
  tiling pattern + Type3 d1 color-operator suppression
  (PDFBOX-5235/5361 era), soft-mask DeviceGray reset, PDFBOX-6095
  zero-size appearance guard, DataFormatException operator
  forgiveness; keep port RectF computeBounds mechanics for the
  annotation appearance box and tiling pattern bbox.
- SetLineCapStyle/SetLineJoinStyle: new checkArrayTypesClass guard +
  port Paint.Cap/Paint.Join enum switches.
- SetColor: upstream PDFBOX-5851 invalid-color fallback; keep port
  Pattern-colorspace condition comment-out (PDPattern dropped).

Unit test: TestOptionalContentGroups.testOCGConsumption updated to
upstream PDFBOX-5980 expectations (BDC tag is first operand 'OC';
group name now asserted via PDPropertyList.create on the resolved
property dict instead of the old last-COSName-wins tag).

Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests,
20 failed / 31 skipped - failure set identical to BASELINE-1 (known
Norton PKIX environmental failures); eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (8/10): filter — sync 12 files

Auto-synced (8, tx37 verbatim): ASCIIHexFilter, CCITTFaxDecoderStream,
CCITTFaxEncoderStream, CCITTFaxFilter, CryptFilter, Predictor,
RunLengthDecodeFilter, LZWFilter (delta was only an orphaned
'Log instance.' javadoc remnant).

Manual merges (4):
- Filter: take SYSPROP_CCITTFAX_MAXBYTES DoS cap constant; keep both
  javax.imageio reader finders (findImageReader, new findRasterReader)
  commented out per port policy (TODO: PdfBox-Android).
- DecodeResult: upstream JPX SMask getter/setter — already carried in
  the C7 merge (Bitmap form); no change needed.
- JPXFilter: keep gemalto JP2Decoder reflection guard + Bitmap pixel
  loop; add upstream PDFBOX-5657 SMaskInData handling in Android form
  (Bitmap.extractAlpha() into DecodeResult.setJPXSMask; opaque image
  rebuilt on an RGB_565 canvas before color-space extraction, SDK_INT
  > O as before).
- DCTFilter: stays a pure passthrough — all pb37 changes
  (findRasterReader, readImageRaster CMYK strategy, CMMException wrap,
  YCbCr/YCCK fixes) are javax.imageio-based and not portable; the
  commented-out raster helpers remain marked TODO: PdfBox-Android.

Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests,
20 failed / 31 skipped - failure set identical to BASELINE-1 (known
Norton PKIX environmental failures); audit + eol clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (9/10): pdmodel/interactive — sync 48 files

Auto-synced (33, tx37 verbatim): action/* (7), digitalsignature/*
(4), documentnavigation/outline/PDOutlineNode + PDOutlineItemIterator,
form/{PDButton, PDChoice, PDComboBox, PDField, PDFieldFactory,
PDNonTerminalField, PDSignatureField, PDTextField, PDTerminalField,
PDVariableText, ScriptingHandler, PDFieldTree}, viewerpreferences/
PDViewerPreferences, annotation/{PDAnnotationPopup, PDAnnotationLine,
PDAnnotationSquareCircle, PDBorderStyleDictionary, PDAnnotationMarkup},
handlers/{AnnotationBorder, PDAbstractAppearanceHandler,
PDAnnotationAdditionalActions(no-op)}, PlainText x2 (import order only).

Manual merges (15):
- PDAcroForm: upstream flatten/rotate rework; keep port RectF
  computeBounds appearance-box mechanics.
- AppearanceGeneratorHelper: keep PointF .x/.y + RectF computeBounds
  for text-height path measurement.
- PDTextAppearanceHandler: upstream 139-line rework kept; port stub
  for addPath retained (Android Path segments not retrievable),
  3-arg Log.e exception form.
- Appearance handlers (Caret, FreeText, Highlight, Link, Line,
  Polyline, FileAttachment): Log.e(msg, e) -> Log.e(msg, e) 3-arg
  port form.
- PDOutlineItem: AWTColor setTextColor signature kept.

Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests,
20 failed / 31 skipped - failure set identical to BASELINE-1; audit +
eol clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37 (10/10): multipdf + text — sync 8 files

Auto-synced (6, tx37 verbatim): Splitter (673 upstream lines: page
info / bookmark-tree merge rework), Overlay, TextPosition,
PDFTextStripperByArea, PDFMarkedContentExtractor + LayerUtility
(import order only).

Post-fixes on auto-applied files: Overlay + LayerUtility replace
upstream's new AffineTransform.quadrantRotate(N) with the port's
rotate() equivalents (harmony AffineTransform lacks quadrantRotate;
rotate(-PI/2)/rotate(-PI)/rotate(-1.5PI) are the same transforms mod
2*PI).

Manual merges (2):
- PDFTextStripper: take upstream 214-line rework (Bidi, article
  thread, sort improvements); re-apply PDFBoxResourceLoader block for
  BidiMirroring.txt asset loading.
- PDFMergerUtility: take upstream 216-line merge rework incl. the
  "Tx".equals(srcField/destField) fix (matches port's old local fix);
  keep port 3-arg IOUtils.closeAndLogException signature.

Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests,
20 failed / 31 skipped - failure set identical to BASELINE-1; audit +
eol clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37: rendering — sync 3 files

PageDrawer (24 upstream hunks, grafted onto Android implementation):
- PDFBOX-5782: null colorspace in getColor() renders transparent instead
  of throwing NPE (port returns android Color.argb(0,0,0,0) + Log.e)
- PDFBOX-5611: ignore zero-width displacement in drawGlyph2D stretch
- PDFBOX-5653: clamp dash phase to Short.MAX_VALUE after transformWidth
- getDashArray(): drop phase infinite/NaN early-return (superseded by the
  phase clamp)
- PDFBOX-5307: image-dictionary Mask/SMask overrides graphics-state soft
  mask — drawBitmap() now takes the PDImage and guards the (stubbed)
  soft-mask branch so masked images render instead of being dropped
- shouldSkipAnnotation(): destination-aware skip logic (PRINT/unprinted,
  VIEW+EXPORT/noView, hidden, invisible unknown, hidden OCG) replacing
  the old device-check comment
- PDFBOX-4744: noRotate annotations with transparency groups get their
  appearance reconstructed; appearance restored after render
- hasTransparency(PDFormXObject): recursive transparency-group detection
- hasBlendMode(): blendModeMap memoization (COSStream-keyed cache) from
  upstream performance fix
- getSubsampling(): private -> protected + upstream javadoc

PDFRenderer: upstream @throws javadoc additions (IllegalStateException /
IndexOutOfBoundsException) — applied to all 10 render overloads
(7 upstream + 3 port Canvas variants).

TTFGlyph2D: PDFBOX-5567 cached-path copy — android.graphics.Path has no
public clone(), use new Path(path) constructor.

Skipped (AWT-only, tied to stubbed port paths): adjustClip thin-line
enlargement, printer/IS_WINDOWS workaround, stencil-pixel handling,
drawBufferedImage quality-prescale workaround, SoftMask.java /
TilingPaint.java (dropped files — pure java.awt Paint/Raster machinery,
stay dropped per port scope).

Gates: compileDebugJavaWithJavac clean; audit greps clean;
testDebugUnitTest 497/20/31 — failure set identical to baseline;
build :library:test same 20 environmental (Norton PKIX) failures;
eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37: androidTest sync — 11 tests + 7 resources

Syncs upstream's 2.0.27→2.0.37 instrumentation-test changes, adapted to
the port's conventions (asset loads, TestResourceGenerator downloads,
TestRendering comparisons instead of TestPDFToImage):

- ValidateXImage/JPEGFactory/LosslessFactory/PDImageXObject/CCITT:
  getOpaqueImage() -> getOpaqueImage(null, 1), explicit stream close
  handling, document.close() after doWritePDF, assertArrayEquals on
  toByteArray in checkJpegStream. Port keeps PDDeviceRGB expectations
  for CMYK/gray JPEGs (Android Bitmap decode) with existing TODO marks.
- TestPublicKeyEncryption: assertEquals JCE-strength form;
  testProtectionError drops the leak-prone finally-close dance.
- TestSymmetricKeyEncryption: checkSeveralPerms() fold with
  InvalidPasswordException catch; closeQuietly in byte[] helpers;
  new testPDFBox5955 (RC4 40/48-bit, downloads) and testPDFBox5639
  (AESV3 R=5 excess bytes, downloads).
- PDFontTest: explicit InputStream+close for PDType1Font load; new
  PDFBOX5920Type0/PDFBOX5920TrueType space-width tests (assets),
  testSymbol round-trip, testPDFBox6172 CID!=GID IllegalStateException
  (downloads NotoSansSC otf).
- CombAlignmentTest: setValue("") warm-up per upstream; new
  testPDFBOX5784 (resource added).
- PDAcroFormFlattenTest: testFlattenPDFBox4889 replaced by
  flattenTestPDFBOX5254 (fields empty + 72 annotations); new
  flattenTestPDFBOX5225 (orphan widget, 76 fields / 59 annotations).
- PDFMergerUtilityTest: checkWithNumberTree 2025 expansion (MCID
  coverage), checkElement 3-arg rework (/P back-reference, OBJR/MCR
  /Pg guard, /Link subtype), checkParentTreeAgainstK-adjacent caller
  updates, ElementCounter PDFBOX-6009 K-array branch,
  testFileDeletion InputStream coverage; 11 new split/merge tests
  (PDFBOX-5762/5792/5809/5811/5840/5929/6009/6018/5939) — 6 new
  resource PDFs vendored from upstream test resources.
  testPDFBox515 left as commented stub (sources ship as a zip maven
  unpacks; TestResourceGenerator cannot unpack archives).
  testFillOrder2 (CCITT) left as commented stub (downloads TIFF +
  javax.imageio reference decode).

Gates: compileDebugAndroidTestJavaWithJac clean; unit test set
unchanged (497/20/31, same 20 environmental failures); eol audit clean.

Co-Authored-By: Claude <noreply@anthropic.com>

* Upgrade PDFBox API to 2.0.37: release metadata

- gradle.properties: VERSION_NAME 2.0.27.1-SNAPSHOT -> 2.0.37.0-SNAPSHOT
- README: dependency coordinate 2.0.27.0 -> 2.0.37.0; "Currently based
  on PDFBox v2.0.27" -> v2.0.37

Final gate: clean build; :library:test 497 tests / 20 failed / 31
skipped — failure set identical to pre-upgrade baseline (all 20 are
Norton PKIX environmental failures, unrelated to the merge);
:sample:assembleDebug produces sample-debug.apk; audit suite clean
(zero org.apache.pdfbox/fontbox refs, zero commons-logging, zero LOG.
calls, 70 port TODO markers, eol audit clean). 17 commits on
upgrade/pdfbox-2.0.37.

Co-Authored-By: Claude <noreply@anthropic.com>

* Bug fixes

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Modernize build system

* update sample app release signing config
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.

1 participant