diff --git a/.github/workflows/java-ci.yml b/.github/workflows/java-ci.yml
index a341da10..cf3508fa 100644
--- a/.github/workflows/java-ci.yml
+++ b/.github/workflows/java-ci.yml
@@ -51,7 +51,7 @@ jobs:
persist-credentials: false
- name: Setup Java ${{ matrix.java-version }}
- uses: actions/setup-java@v5
+ uses: actions/setup-java@v6
with:
distribution: zulu
java-version: ${{ matrix.java-version }}
diff --git a/.github/workflows/java-publish.yml b/.github/workflows/java-publish.yml
new file mode 100644
index 00000000..9d9d5e2c
--- /dev/null
+++ b/.github/workflows/java-publish.yml
@@ -0,0 +1,122 @@
+name: Maven Central Publish
+
+on:
+ release:
+ types: [published]
+ workflow_dispatch:
+ inputs:
+ version:
+ description: Maven package version to publish (for example, 0.2.0)
+ required: true
+ type: string
+
+permissions:
+ contents: read
+
+concurrency:
+ group: maven-central-publish
+ cancel-in-progress: false
+
+jobs:
+ publish:
+ if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'java-v')
+ runs-on: ubuntu-latest
+ environment:
+ name: maven-central
+ url: https://central.sonatype.com/artifact/io.github.mini-software/minipdf
+ defaults:
+ run:
+ working-directory: minipdf-java
+ env:
+ MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
+ MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_TOKEN }}
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
+ GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
+ RELEASE_VERSION: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+
+ - name: Validate release credentials
+ shell: bash
+ run: |
+ missing=0
+ for name in MAVEN_USERNAME MAVEN_PASSWORD MAVEN_GPG_PASSPHRASE GPG_PRIVATE_KEY; do
+ if [ -z "${!name:-}" ]; then
+ echo "::error::$name is not configured."
+ missing=1
+ fi
+ done
+ exit "$missing"
+
+ - name: Setup Java
+ uses: actions/setup-java@v6
+ with:
+ distribution: temurin
+ java-version: '17'
+ cache: maven
+ cache-dependency-path: minipdf-java/pom.xml
+ server-id: central
+ server-username-env-var: MAVEN_USERNAME
+ server-password-env-var: MAVEN_PASSWORD
+ gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
+ gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE
+
+ - name: Validate release version
+ id: version
+ shell: bash
+ run: |
+ VERSION="${RELEASE_VERSION#java-v}"
+ if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+ echo "::error::Version '$VERSION' must use stable semantic version format."
+ exit 1
+ fi
+ POM_VERSION="$(mvn -q -DforceStdout help:evaluate -Dexpression=project.version)"
+ if [ "$VERSION" != "$POM_VERSION" ]; then
+ echo "::error::Release version '$VERSION' does not match POM version '$POM_VERSION'."
+ exit 1
+ fi
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
+
+ - name: Install CJK fonts
+ run: sudo apt-get update && sudo apt-get install --yes fonts-noto-cjk
+
+ - name: Test release candidate
+ run: mvn -B -ntp clean verify
+
+ - name: Verify Maven Central artifacts
+ shell: bash
+ run: |
+ mvn -B -ntp -P release -DskipTests -Dgpg.skip=true package
+ VERSION="${{ steps.version.outputs.version }}"
+ for artifact in \
+ "minipdf/target/minipdf-$VERSION.jar" \
+ "minipdf/target/minipdf-$VERSION-sources.jar" \
+ "minipdf/target/minipdf-$VERSION-javadoc.jar" \
+ "minipdf-cli/target/minipdf-cli-$VERSION.jar" \
+ "minipdf-cli/target/minipdf-cli-$VERSION-sources.jar" \
+ "minipdf-cli/target/minipdf-cli-$VERSION-javadoc.jar"; do
+ if [ ! -s "$artifact" ]; then
+ echo "::error::Missing release artifact: $artifact"
+ exit 1
+ fi
+ done
+ CLI_VERSION="$(java -jar "minipdf-cli/target/minipdf-cli-$VERSION.jar" --version)"
+ if [ "$CLI_VERSION" != "minipdf-java $VERSION" ]; then
+ echo "::error::CLI reported '$CLI_VERSION'."
+ exit 1
+ fi
+
+ - name: Publish to Maven Central
+ run: mvn -B -ntp -P release -DskipTests deploy
+
+ - name: Summarize publication
+ shell: bash
+ run: |
+ echo "### MiniPdf Java ${{ steps.version.outputs.version }} published" >> "$GITHUB_STEP_SUMMARY"
+ echo "Maven Central coordinates:" >> "$GITHUB_STEP_SUMMARY"
+ echo '- `io.github.mini-software:minipdf:${{ steps.version.outputs.version }}`' >> "$GITHUB_STEP_SUMMARY"
+ echo '- `io.github.mini-software:minipdf-cli:${{ steps.version.outputs.version }}`' >> "$GITHUB_STEP_SUMMARY"
\ No newline at end of file
diff --git a/README.md b/README.md
index 06a2c12b..8748e9ab 100644
--- a/README.md
+++ b/README.md
@@ -89,7 +89,7 @@ features, known gaps, and development workflow.
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/documents/README.fr.md b/documents/README.fr.md
index 848a4073..df644e8d 100644
--- a/documents/README.fr.md
+++ b/documents/README.fr.md
@@ -85,7 +85,7 @@ Le [guide Rust](../minipdf-rs/README.md) décrit l'API du crate, la CLI, les fon
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/documents/README.it.md b/documents/README.it.md
index a1d6bd52..7b14b1b1 100644
--- a/documents/README.it.md
+++ b/documents/README.it.md
@@ -85,7 +85,7 @@ La [guida Rust](../minipdf-rs/README.md) descrive API del crate, CLI, funzionali
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/documents/README.ja.md b/documents/README.ja.md
index 7e0f4b15..3e3a3dc2 100644
--- a/documents/README.ja.md
+++ b/documents/README.ja.md
@@ -85,7 +85,7 @@ minipdf report.docx -o report.pdf
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/documents/README.ko.md b/documents/README.ko.md
index 6c2320e2..da3ce6ed 100644
--- a/documents/README.ko.md
+++ b/documents/README.ko.md
@@ -85,7 +85,7 @@ minipdf report.docx -o report.pdf
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/documents/README.zh-CN.md b/documents/README.zh-CN.md
index 605ed2d3..1bd73682 100644
--- a/documents/README.zh-CN.md
+++ b/documents/README.zh-CN.md
@@ -85,7 +85,7 @@ minipdf report.docx -o report.pdf
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/documents/README.zh-TW.md b/documents/README.zh-TW.md
index 15aba0a5..4ce7b6d4 100644
--- a/documents/README.zh-TW.md
+++ b/documents/README.zh-TW.md
@@ -85,7 +85,7 @@ minipdf report.docx -o report.pdf
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
diff --git a/minipdf-java/README.md b/minipdf-java/README.md
index 58a8c565..30926a52 100644
--- a/minipdf-java/README.md
+++ b/minipdf-java/README.md
@@ -11,7 +11,7 @@ The library is available from Maven Central:
io.github.mini-software
minipdf
- 0.1.6
+ 0.2.0
```
@@ -62,14 +62,14 @@ Download the executable JAR with Maven:
```powershell
mvn dependency:copy `
- -Dartifact=io.github.mini-software:minipdf-cli:0.1.6 `
+ -Dartifact=io.github.mini-software:minipdf-cli:0.2.0 `
-DoutputDirectory=.
```
Convert a document:
```powershell
-java -jar minipdf-cli-0.1.6.jar input.pptx -o output.pdf
+java -jar minipdf-cli-0.2.0.jar input.pptx -o output.pdf
```
The CLI accepts `.docx`, `.xlsx`, and `.pptx` files. Run it with `--help` for
@@ -93,4 +93,19 @@ From this directory:
```powershell
mvn -B -ntp verify
-```
\ No newline at end of file
+```
+
+## Publishing
+
+The `Maven Central Publish` GitHub Actions workflow publishes both `minipdf`
+and `minipdf-cli`. Configure these repository or `maven-central` environment
+secrets before running it:
+
+- `MAVEN_CENTRAL_USERNAME`
+- `MAVEN_CENTRAL_TOKEN`
+- `GPG_PRIVATE_KEY`
+- `GPG_PASSPHRASE`
+
+Publish a GitHub Release whose tag matches `java-v`, such as
+`java-v0.2.0`, or manually dispatch the workflow with `version` set to `0.2.0`.
+The requested version must match the Maven project version.
diff --git a/minipdf-java/minipdf-cli/pom.xml b/minipdf-java/minipdf-cli/pom.xml
index 546c1304..dab3175f 100644
--- a/minipdf-java/minipdf-cli/pom.xml
+++ b/minipdf-java/minipdf-cli/pom.xml
@@ -7,7 +7,7 @@
io.github.mini-software
minipdf-java-parent
- 0.1.6
+ 0.2.0
minipdf-cli
diff --git a/minipdf-java/minipdf-cli/src/main/java/io/github/minisoftware/minipdf/cli/MiniPdfCommand.java b/minipdf-java/minipdf-cli/src/main/java/io/github/minisoftware/minipdf/cli/MiniPdfCommand.java
index 3ef68781..62f91460 100644
--- a/minipdf-java/minipdf-cli/src/main/java/io/github/minisoftware/minipdf/cli/MiniPdfCommand.java
+++ b/minipdf-java/minipdf-cli/src/main/java/io/github/minisoftware/minipdf/cli/MiniPdfCommand.java
@@ -21,7 +21,7 @@
@Command(
name = "minipdf",
- version = "minipdf-java 0.1.6",
+ version = "minipdf-java 0.2.0",
description = "Convert XLSX, DOCX, and PPTX files to PDF with the Java MiniPdf engine.",
mixinStandardHelpOptions = true,
subcommands = MiniPdfCommand.ConvertCommand.class)
diff --git a/minipdf-java/minipdf/pom.xml b/minipdf-java/minipdf/pom.xml
index 7a0991e7..3dbf95ba 100644
--- a/minipdf-java/minipdf/pom.xml
+++ b/minipdf-java/minipdf/pom.xml
@@ -7,7 +7,7 @@
io.github.mini-software
minipdf-java-parent
- 0.1.6
+ 0.2.0
minipdf
diff --git a/minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/xlsx/PoiXlsxRenderer.java b/minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/xlsx/PoiXlsxRenderer.java
index b562d0de..4bc40f11 100644
--- a/minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/xlsx/PoiXlsxRenderer.java
+++ b/minipdf-java/minipdf/src/main/java/io/github/minisoftware/minipdf/internal/xlsx/PoiXlsxRenderer.java
@@ -6,6 +6,7 @@
import io.github.minisoftware.minipdf.MiniPdfException;
import io.github.minisoftware.minipdf.PageSize;
import io.github.minisoftware.minipdf.RegisteredFont;
+import org.apache.fontbox.ttf.TrueTypeCollection;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
@@ -1722,7 +1723,7 @@ static FontSet load(PDDocument document) throws IOException {
document,
registered,
Arrays.asList("notosanssc", "simhei", "simsun"),
- systemFonts("NotoSansSC-VF.ttf", "simhei.ttf", "simsun.ttc"));
+ systemFonts("NotoSansSC-VF.ttf", "NotoSansCJK-Regular.ttc", "simhei.ttf", "simsun.ttc"));
PDFont simsun = load(document, registered, Collections.singletonList("simsun"), systemFonts("simsun.ttc"));
PDFont mingliu = load(document, registered, Collections.singletonList("mingliu"), systemFonts("mingliu.ttc"));
List kaitiPaths = officeCloudFonts("STKaiti");
@@ -1890,7 +1891,10 @@ private static PDFont load(
for (Path path : paths) {
if (Files.isRegularFile(path)) {
try {
- return PDType0Font.load(document, Files.newInputStream(path), true);
+ String fileName = path.getFileName().toString().toLowerCase(Locale.ROOT);
+ return fileName.endsWith(".ttc") || fileName.endsWith(".otc")
+ ? loadCollectionFont(document, path)
+ : PDType0Font.load(document, Files.newInputStream(path), true);
} catch (IOException ignored) {
}
}
@@ -1898,6 +1902,18 @@ private static PDFont load(
return null;
}
+ private static PDFont loadCollectionFont(PDDocument document, Path path) throws IOException {
+ PDFont[] loaded = new PDFont[1];
+ try (TrueTypeCollection collection = new TrueTypeCollection(path.toFile())) {
+ collection.processAllFonts(font -> {
+ if (loaded[0] == null) {
+ loaded[0] = PDType0Font.load(document, font, true);
+ }
+ });
+ }
+ return loaded[0];
+ }
+
private static List systemFonts(String... names) {
List paths = new ArrayList<>();
String windows = System.getenv("WINDIR");
diff --git a/minipdf-java/pom.xml b/minipdf-java/pom.xml
index d08a679d..469cbad7 100644
--- a/minipdf-java/pom.xml
+++ b/minipdf-java/pom.xml
@@ -6,7 +6,7 @@
io.github.mini-software
minipdf-java-parent
- 0.1.6
+ 0.2.0
pom
MiniPdf for Java