Skip to content

Add initial Java conversion engine - #114

Merged
shps951023 merged 1 commit into
mainfrom
feat/java-port
Sep 3, 2026
Merged

shps951023 merged 1 commit into
mainfrom
feat/java-port

Conversation

@shps951023

Copy link
Copy Markdown
Member

Summary

  • add a Java 17 Maven reactor with reusable minipdf and executable minipdf-cli modules
  • add secure OOXML package detection/loading and initial XLSX/DOCX text conversion
  • add a deterministic PDF 1.4 writer, page options, font registration, and categorized errors
  • add picocli direct/subcommand syntax and shaded JAR packaging
  • add API, PDF structure, OOXML security, real classic fixture, and CLI tests

PPTX is detected but intentionally remains unsupported in this initial Java implementation.

Validation

  • mvn -B -ntp verify
  • 26 tests passed
  • shaded CLI JAR converted classic01_basic_table_with_headers.xlsx to a valid PDF

Copilot AI lite review requested due to automatic review settings September 3, 2026 02:30
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 1 minute.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

This review ran on the open-source allowance, not this organization's plan, because the pull request author doesn't have an assigned seat. Waiting won't change this — ask an organization admin to assign them a seat, or add seats in Billing if every seat is already assigned, then retry.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 75cfcc28-e761-42d8-8336-7ee324de5929

📥 Commits

Reviewing files that changed from the base of the PR and between 7049dd0 and 8835baf.

📒 Files selected for processing (27)
  • minipdf-java/minipdf-cli/pom.xml
  • minipdf-java/minipdf-cli/src/main/java/io/github/minisoftware/minipdf/cli/MiniPdfCommand.java
  • minipdf-java/minipdf-cli/src/test/java/io/github/minisoftware/minipdf/cli/MiniPdfCommandTest.java
  • minipdf-java/minipdf/pom.xml
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/ConversionOptions.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/MiniPdf.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/MiniPdfException.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/OfficeFormat.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PageSize.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PdfColor.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PdfDocument.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PdfPage.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/RegisteredFont.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/OfficePackageDetector.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/OoxmlPackage.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/SecureXml.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/SimplePdfTextRenderer.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/docx/DocxConverter.java
  • minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/xlsx/XlsxConverter.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/BasicOfficeConversionTest.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/ClassicFixtureSmokeTest.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/FontRegistrationTest.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/OfficeFormatDetectionTest.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/OoxmlSecurityTest.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/PageSizeTest.java
  • minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/PdfDocumentTest.java
  • minipdf-java/pom.xml

Comment @coderabbitai help to get the list of available commands.

@shps951023
shps951023 merged commit ae050e3 into main Sep 3, 2026
4 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

There are correctness/security issues in the ZIP normalization/limit logic and PDF stream serialization that should be fixed before merging.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds an initial Java 17 implementation of MiniPdf, introducing a Maven reactor with a core library and CLI that can detect OOXML containers, extract basic DOCX/XLSX text, and emit deterministic PDF 1.4 output with security-focused ZIP/XML handling.

Changes:

  • Introduces minipdf-java Maven reactor with minipdf (library) and minipdf-cli (shaded CLI).
  • Implements initial OOXML detection + secure ZIP/XML parsing, plus basic DOCX/XLSX text extraction and PDF writing.
  • Adds JUnit tests covering PDF structure invariants, OOXML security guards, classic fixtures, and CLI behavior.
File summaries
File Description
minipdf-java/pom.xml Adds Java 17 parent reactor with dependency/plugin management (JUnit, picocli, surefire).
minipdf-java/minipdf/pom.xml Defines the Java library module and test dependencies.
minipdf-java/minipdf-cli/pom.xml Defines the CLI module and shaded JAR packaging.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/MiniPdf.java Public Java API for format detection, conversion, and font registration.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/MiniPdfException.java Introduces categorized exceptions for IO/ZIP/XML/format/input errors.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/OfficeFormat.java Adds Office format enum used by detection/conversion routing.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/ConversionOptions.java Adds conversion options (currently page size override).
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PageSize.java Adds standard/custom page sizes with input validation.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PdfColor.java Adds PDF RGB color model with component validation.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PdfPage.java Adds page abstraction collecting text drawing operations.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/PdfDocument.java Implements deterministic PDF 1.4 writing (objects/xref/streams).
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/RegisteredFont.java Adds immutable font registration record with defensive copying.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/OoxmlPackage.java Secure ZIP loading with entry/path validation and size limits.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/OfficePackageDetector.java Detects DOCX/XLSX/PPTX based on OOXML package entries.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/SecureXml.java Provides hardened StAX parsing configuration (no DTD/XXE).
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/SimplePdfTextRenderer.java Renders extracted text lines into basic PDF pages with wrapping.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/docx/DocxConverter.java Extracts paragraph text from DOCX word/document.xml.
minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/xlsx/XlsxConverter.java Extracts shared strings + worksheet rows into printable lines.
minipdf-java/minipdf-cli/src/main/java/io/github/minisoftware/minipdf/cli/MiniPdfCommand.java Adds picocli-based CLI supporting direct and convert subcommand syntax.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/PdfDocumentTest.java Tests PDF header/footer, stream length accounting, escaping, xref offsets, and validation.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/PageSizeTest.java Tests standard sizes, input validation, and options behavior.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/OoxmlSecurityTest.java Tests traversal/XXE protections in OOXML processing.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/OfficeFormatDetectionTest.java Tests format detection and unsupported PPTX behavior.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/FontRegistrationTest.java Tests defensive copying and input validation for font registration.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/ClassicFixtureSmokeTest.java Smoke-tests converting classic XLSX/DOCX fixtures from the repo.
minipdf-java/minipdf/src/test/java/io/github/minisoftware/minipdf/BasicOfficeConversionTest.java Tests minimal DOCX/XLSX conversions, page override, and XML error classification.
minipdf-java/minipdf-cli/src/test/java/io/github/minisoftware/minipdf/cli/MiniPdfCommandTest.java Tests CLI direct/subcommand flows and option validation.
Review details

Suppressed comments (1)

minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/OoxmlPackage.java:96

  • normalizeEntryName normalizes path separators but not case. OfficePackageDetector detects formats case-insensitively, but converters later look up exact lower-case paths (e.g., word/document.xml, xl/sharedStrings.xml). This can lead to successful format detection followed by conversion failure for ZIPs that use upper-case entry names (and the tests already expect case normalization during detection).
        String normalized = entryName.replace('\\', '/');
  • Files reviewed: 27/27 changed files
  • Comments generated: 3
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +62 to +64
if (totalSize > MAX_TOTAL_SIZE
|| (input.length > 0 && totalSize / input.length > MAX_EXPANSION_RATIO)) {
throw invalidPackage("ZIP package expands beyond the configured limit");
Comment on lines +116 to +120
ByteArrayOutputStream object = new ByteArrayOutputStream();
write(object, "<< /Length " + stream.length + " >>\nstream\n");
object.writeBytes(stream);
write(object, "endstream");
return object.toByteArray();
Comment on lines +39 to +43
int streamStart = matcher.end();
int streamEnd = text.indexOf("endstream", streamStart);
assertEquals(Integer.parseInt(matcher.group(1)), streamEnd - streamStart);
streams++;
}
@shps951023
shps951023 deleted the feat/java-port branch September 16, 2026 08:18
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.

2 participants