在 Java 中使用 GroupDocs 添加數位簽章 PDF
如果你正在開發處理合約、發票或任何法律文件的 Java 應用程式,你可能已經遇到這個難題:如何在不從頭開始構建的情況下,為 PDF 加入具法律效力的數位簽章?
手動簽署文件既慢又容易出錯,還會在工作流程中形成瓶頸。若能只用幾行 Java 程式碼就自動完成整個簽署過程,會怎樣?
本指南正是要教你這件事。使用 GroupDocs.Signature for Java,你將學會以程式方式為 PDF、Word 文件及其他格式添加數位簽章——包括視覺簽章、憑證驗證以及完整的例外處理。
你將掌握的內容:
- 在 Maven 或 Gradle 專案中設定 GroupDocs.Signature(只需 2 分鐘)
- 使用數位憑證與可選的簽章圖片簽署文件
- 處理常見錯誤與憑證問題的排除方法
- 何時使用數位簽章與其他簽章類型的比較
- 為生產環境實作安全最佳實踐
無論你是構建合約管理系統、自動化發票工作流程,或為 SaaS 產品加入電子簽章功能,本教學都能滿足需求。讓我們開始吧。
快速答覆
- 哪個函式庫支援 Java 數位簽章 PDF? GroupDocs.Signature for Java。
- 基本的 PDF 簽章需要多少行程式碼? 只要兩行:載入文件並呼叫
sign。 - 生產環境需要授權嗎? 需要,商業授權會移除浮水印並解鎖全部功能。
- 可以同時簽署 Word、Excel、PowerPoint 檔案嗎? 當然可以——GroupDocs.Signature 支援超過 50 種格式。
- 必須管理憑證嗎? 使用
.pfx憑證是加密簽章的必要條件,請妥善保存。
什麼是 Java 數位簽章 PDF?
Digital signature PDF java 指的是使用 Java 程式碼對 PDF 檔案套用加密簽章的過程。這會產生一個防篡改的封印,透過簽署者的公鑰憑證即可驗證,從而提供法律效力、完整性保護與不可否認性。
Java 中的數位簽章如何運作?
數位簽章使用簽署者的私鑰對文件產生唯一的雜湊值,然後將該雜湊值嵌入簽章物件。任何擁有相對應公鑰的人都能重新計算雜湊值,確認文件未被修改,從而提供法律上的不可否認性與完整性驗證。
為什麼選擇 GroupDocs.Signature 進行數位簽署?
GroupDocs.Signature 支援 50+ 輸入與輸出格式,可在不將整個檔案載入記憶體的情況下處理上百頁的 PDF,並提供內建的視覺簽章渲染。其 API 抽象了格式特定的細節,讓你只需撰寫單一程式碼路徑即可同時支援 PDF、DOCX、XLSX、PPTX 等多種檔案。
前置條件
在開始編寫程式碼之前,請先確保以下項目已備妥:
必要的函式庫與相依性
- GroupDocs.Signature for Java 版本 23.12(最新穩定版)
- 數位憑證檔案(
.pfx格式),用於簽署具法律效力的文件 - 圖片檔案(PNG、JPG),作為視覺簽章(可選,但建議使用以提升文件專業度)
環境設定需求
- 已安裝 JDK 8 或更新版本,並完成設定
- 你慣用的 IDE(IntelliJ IDEA、Eclipse 或支援 Java 的 VS Code)
- 使用 Maven 或 Gradle 建立基本專案(接下來會說明相依性設定)
知識前置條件
- 基本的 Java 程式開發經驗(只要會寫簡單類別即可)
- 了解 Java 的檔案 I/O 操作
- 熟悉例外處理(
try-catch區塊)
即使你不是專家,我們也會一步步說明。準備好了嗎?讓我們先設定 GroupDocs.Signature。
設定 GroupDocs.Signature for Java
將 GroupDocs.Signature 加入專案非常簡單。依照你的建置工具加入相依性:
Maven 設定
將以下內容加入 pom.xml:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle 設定
將以下內容加入 build.gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
小技巧: 若你在企業環境中受限於網路存取,亦可直接從 GroupDocs.Signature releases page 下載 JAR 檔,手動加入專案的 classpath。
取得授權的步驟
GroupDocs.Signature 在生產環境需要授權,但你有以下選擇:
- 免費試用 – 適合測試與概念驗證,無需任何承諾即可探索全部功能。
- 臨時授權 – 開發與測試期間可取得 30 天完整 API 存取,無浮水印或限制。
- 商業授權 – 生產部署的必備。依需求前往 Purchase here 購買。
基本初始化與設定
加入相依性後,使用以下程式碼快速驗證設定是否正確。此程式會初始化 GroupDocs.Signature 並確認能存取文件:
import com.groupdocs.signature.Signature;
public class DocumentSigner {
public static void main(String[] args) {
// Initialize with a sample document path
Signature signature = new Signature("path/to/your/document.docx");
System.out.println("GroupDocs.Signature initialized successfully!");
}
}
定義說明: Signature 是 GroupDocs.Signature 的核心類別,代表要簽署的文件。
這段程式在做什麼? Signature 類別是主要入口——它會將文件載入記憶體,為簽署作好準備。若看到成功訊息,即可進入正式簽署階段。
快速排除故障: 若拋出 FileNotFoundException,請再次確認文件路徑。測試時建議使用絕對路徑,以免相對路徑產生混淆。
接下來,我們將深入實作數位簽章。
實作指南
了解 Java 中的數位簽章
在撰寫程式碼之前,先釐清我們要建構的概念。數位簽章 透過加密憑證驗證文件真偽並偵測篡改。簽署文件時會發生:
- 憑證的私鑰對文件產生唯一雜湊
- 雜湊值被嵌入文件作為簽章
- 任何人皆可使用憑證的公鑰驗證,確保文件未被修改
這與僅放置圖片印章不同——數位簽章提供法律效力與防篡改功能,因此必須使用 .pfx 憑證檔(內含私鑰)。
步驟式實作
以下將完整的文件簽署流程拆解為可消化的步驟。
步驟 1:準備環境
先定義檔案路徑,請將佔位路徑替換為實際目錄:
final String DOCUMENT_DIRECTORY = "YOUR_DOCUMENT_DIRECTORY";
final String OUTPUT_DIRECTORY = "YOUR_OUTPUT_DIRECTORY";
final String CERTIFICATE_FILE_PATH = "path/to/your/certificate.pfx"; // Your .pfx certificate
final String IMAGE_FILE_PATH = "path/to/your/image.png"; // Optional: signature image
String filePath = DOCUMENT_DIRECTORY + "/sample.docx";
String fileName = new java.io.File(filePath).getName();
String outputFilePath = OUTPUT_DIRECTORY + "/Signed/" + fileName;
為什麼要分開目錄? 將原始文件與簽署後的文件放在不同資料夾,可避免不小心覆寫,亦方便版本管理。正式環境中,建議在輸出檔名加入時間戳記。
步驟 2:初始化 Signature 物件
建立負責所有簽署操作的 Signature 物件:
Signature signature = new Signature(filePath);
背後運作: 這會載入文件並為後續操作做好準備。函式庫會自動偵測文件格式(PDF、DOCX、XLSX 等),並套用相應的簽署方式。
重要提醒: 請務必使用 try‑with‑resources 或手動關閉 Signature 物件,以免在大量文件迴圈處理時發生記憶體泄漏。
步驟 3:設定數位簽署選項
在此指定簽章的外觀與行為:
import com.groupdocs.signature.options.sign.DigitalSignOptions;
DigitalSignOptions options = new DigitalSignOptions(CERTIFICATE_FILE_PATH) {
@Override
public void setImageFilePath(String value) {
super.setImageFilePath(IMAGE_FILE_PATH);
}
};
可自訂項目包括:
- 憑證路徑 – 法律有效簽章的必備項目
- 圖片路徑 – 可選的視覺簽章(如掃描簽名)
- 簽章位置 – 亦可設定 X/Y 座標、寬高(下方客製化章節會說明)
- 密碼保護 – 若
.pfx檔案有密碼,請使用options.setPassword("your_password")
常見錯誤: 忘記設定憑證密碼會導致難以理解的例外,請務必加入上述程式碼。
步驟 4:執行簽署並妥善處理例外
以下程式碼執行簽署,同時捕捉可能的錯誤:
try {
signature.sign(outputFilePath, options);
System.out.println("Document signed successfully: " + outputFilePath);
} catch (com.groupdocs.signature.exception.GroupDocsSignatureException ex) {
System.out.println("GroupDocs Signature Exception: " + ex.getMessage());
// Handle library-specific errors (e.g., invalid certificate, corrupted document)
} catch (Exception ex) {
System.out.println("System Exception: " + ex.getMessage());
// Handle general errors (e.g., file I/O issues, permission problems)
}
為什麼要有兩個 catch? 第一個捕捉 GroupDocs 特有的錯誤(如憑證驗證失敗),第二個捕捉其他例外(如檔案系統權限問題),有助於在開發階段快速定位問題。
上線建議: 將 System.out.println() 換成 SLF4J 或 Log4j 等正式日誌框架,這樣在生產環境除錯會更方便。
進階設定選項
想要更細緻地控制簽章?以下列出常用的客製化參數:
DigitalSignOptions options = new DigitalSignOptions(CERTIFICATE_FILE_PATH);
// Visual appearance
options.setImageFilePath(IMAGE_FILE_PATH);
options.setLeft(100); // X position in pixels
options.setTop(100); // Y position in pixels
options.setWidth(200); // Signature width
options.setHeight(100); // Signature height
// Certificate settings
options.setPassword("certificate_password"); // If .pfx is password-protected
// Signature metadata
options.setReason("Contract approval"); // Why this document is being signed
options.setContact("john@company.com"); // Signer's contact info
options.setLocation("New York Office"); // Where the signature occurred
實務小技巧: 合約文件務必填寫 Reason、Contact、Location 欄位,這些資訊會出現在 PDF 簽章屬性中,對審計非常有幫助。
常見陷阱與解決方案
以下整理開發者最常碰到的問題,讓你省下大量除錯時間:
1. 憑證無效錯誤
問題: 出現 CertificateException 或「Invalid certificate format」訊息。
解決方案:
- 確認
.pfx檔未損毀:可在 Windows 憑證管理員開啟,或在 Linux/Mac 執行keytool -list -keystore certificate.pfx。 - 核對密碼是否正確。
- 檢查憑證是否已過期(常被忽略)。
預防建議: 生產環境中實作憑證到期監控,於到期前 30 天發送警報。
2. 檔案路徑問題
問題: FileNotFoundException 或「Access denied」錯誤。
解決方案:
- 開發階段使用絕對路徑,例如
C:/projects/docs/sample.pdf。 - 確認 Java 程序對輸入檔案具有讀取權限,對輸出資料夾具有寫入權限。
- Windows 系統要注意反斜線與正斜線的差異,建議使用
File.separator或統一使用正斜線以提升跨平台相容性。
3. 大檔案記憶體問題
問題: 處理 >50 MB 的 PDF 時程式崩潰或變得無回應。
解決方案:
- 增加 JVM 堆積大小,例如在執行參數加入
-Xmx2G。 - 改為批次處理,而非一次載入多個文件。
- 必須在使用完畢後關閉
Signature物件:使用 try‑with‑resources 或手動呼叫dispose()。
// Good: automatic resource management
try (Signature signature = new Signature(filePath)) {
signature.sign(outputFilePath, options);
}
// Signature is automatically closed here
4. PDF 簽章位置錯誤
問題: 簽章出現在錯誤位置或與既有內容重疊。
解決方案:
- PDF 的座標系統是左下角為原點(與大多數 UI 系統不同)。
- 先取得頁面尺寸,再根據尺寸計算偏移量。
- 使用多種 PDF 閱讀器(Adobe Acrobat、瀏覽器內建檢視器)測試,因渲染方式可能不同。
安全最佳實踐
數位簽章的安全性取決於實作方式,以下提供生產環境的建議:
憑證管理
千萬不要在程式碼中硬編碼憑證路徑或密碼。 建議改為:
// Bad - hardcoded secrets
String certPath = "/home/user/cert.pfx";
String certPassword = "mypassword123";
// Good - environment variables or secure configuration
String certPath = System.getenv("CERT_PATH");
String certPassword = System.getenv("CERT_PASSWORD");
最佳做法:
- 將憑證存放於安全保管庫(AWS Secrets Manager、Azure Key Vault、HashiCorp Vault)。
- 高價值簽署作業使用硬體安全模組(HSM)。
- 在憑證到期前自動輪換。
- 限制應用程式使用者對憑證檔案的讀取權限(唯讀)。
輸入驗證
在簽署前務必驗證文件:
// Check file exists and is readable
File inputFile = new File(filePath);
if (!inputFile.exists() || !inputFile.canRead()) {
throw new IllegalArgumentException("Cannot access input file: " + filePath);
}
// Verify file size is reasonable (prevent DoS attacks)
long maxFileSize = 100 * 1024 * 1024; // 100MB
if (inputFile.length() > maxFileSize) {
throw new IllegalArgumentException("File too large for signing: " + inputFile.length());
}
// Validate file extension matches expected format
String extension = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!Arrays.asList("pdf", "docx", "xlsx").contains(extension)) {
throw new IllegalArgumentException("Unsupported file format: " + extension);
}
稽核日誌
為合規與除錯記錄每一次簽署操作:
// Log signature operations with essential details
logger.info("Signing document: {} by user: {} with certificate: {}",
fileName, userId, certificateThumbprint);
try {
signature.sign(outputFilePath, options);
logger.info("Successfully signed: {} to {}", fileName, outputFilePath);
} catch (Exception ex) {
logger.error("Failed to sign document: {} - Error: {}", fileName, ex.getMessage());
throw ex; // Re-throw after logging
}
建議記錄項目: 文件名稱與大小、發起簽署的使用者、憑證指紋(不要記錄完整憑證)、時間戳記、成功或失敗狀態、錯誤訊息(絕不記錄密碼或完整憑證內容)。
何時使用不同的簽章類型
GroupDocs.Signature 除了數位簽章外,還支援多種簽章類型,以下說明各自適用情境:
數位簽章(本章節重點)
適用情境: 合約、財務文件、合規文件
提供功能: 加密驗證、篡改偵測、不可否認性
使用時機: 需要法律效力或必須證明文件未被修改時
圖片簽章
適用情境: 簡易視覺驗證、內部批准
提供功能: 只顯示圖像,無加密驗證
使用時機: 只需簽章外觀,無法律要求(如內部備忘錄)
QR Code 簽章
適用情境: 手機驗證、跨系統追蹤
提供功能: 嵌入資料 + 方便掃描
使用時機: 需要編碼文件 ID、時間戳記等可快速掃描的資訊
條碼簽章
適用情境: 庫存文件、運送標籤、機器自動處理
提供功能: 標準化機器可讀資料
使用時機: 文件將被條碼掃描器批次處理
我的建議: 只要文件涉及法律層面(合約、協議、發票),務必使用 數位簽章,因為它是唯一提供加密真偽證明的方式。
實務應用案例
以下列出企業在生產環境中使用 Java 文件簽署的典型案例:
1. 合約管理系統
情境: 律師事務所每日需簽署超過 100 份客戶合約
實作方式:
- 將未簽署的合約存於雲端儲存(S3、Azure Blob)
- 合約審批通過後透過 API 觸發簽署
- 自動將已簽署的 PDF 電子郵件給相關方
- 以稽核日誌方式保存簽署紀錄
程式碼範例:
// Pseudo-code example
public void processApprovedContract(String contractId) {
Contract contract = contractRepository.findById(contractId);
String unsignedDoc = downloadFromCloudStorage(contract.getStorageKey());
// Sign the document
String signedDoc = signDocument(unsignedDoc, getLegalCertificate());
// Store and notify
uploadToCloudStorage(signedDoc, contract.getStorageKey() + "_signed");
emailService.sendSignedContract(contract.getParties(), signedDoc);
auditLog.recordSigning(contractId, getCurrentUser());
}
2. 發票自動化處理
情境: 財務部門自動為外發發票加簽
關鍵需求:
- 發票產生後立即簽署
- 加入公司印章圖片
- 在簽章中加入發票編號、日期、金額等元資料
實作技巧: 使用工作佇列(RabbitMQ、AWS SQS)非同步執行簽署,避免阻塞發票產生流程。
3. 人力資源文件工作流
情境: 簽署員工合約、錄用信、保密協議
安全考量:
- 為不同文件類型使用不同憑證(HR vs. Legal)
- 依角色限制誰能觸發簽署
- 使用加密備份保存已簽署文件
4. 與 CRM 系統整合
情境: 當交易完成時,Salesforce 或 HubSpot 觸發文件簽署
整合模式:
- CRM 發送 webhook 給 Java 簽署服務
- 使用模板填入交易資料產生文件
- 簽署完成後將 PDF 上傳回 CRM
Webhook 處理範例:
@PostMapping("/api/sign-sales-document")
public ResponseEntity<String> signSalesDocument(@RequestBody DealClosedEvent event) {
// Generate document from template
String document = documentGenerator.createFromTemplate(event.getDealId());
// Sign it
String signedDoc = documentSigner.sign(document, getSalesCertificate());
// Upload to CRM
crmClient.uploadDocument(event.getDealId(), signedDoc);
return ResponseEntity.ok("Document signed and uploaded");
}
5. 電子商務訂單確認
情境: 為 B2B 交易的採購單與出貨文件加簽
效能優化:
- 為常見文件類型預先產生已簽署的模板
- 同一憑證多次簽署時使用簽章快取
- 大量訂單使用批次簽署以提升吞吐量
真實世界的整合模式
微服務架構
若採用微服務,建議如下結構:
[Order Service] --> [Signing Service] --> [Storage Service]
|
v
[Notification Service]
簽署服務職責: 提供 REST API 接收簽署請求、管理憑證生命週期、處理高併發簽署佇列、回傳狀態回呼。
好處: 簽署邏輯獨立可重用、憑證輪換更容易、可獨立水平擴充。
批次處理模式
大量文件(每日上千份)時可使用:
public class BatchDocumentSigner {
private final BlockingQueue<SigningTask> queue = new LinkedBlockingQueue<>();
private final ExecutorService executorService = Executors.newFixedThreadPool(5);
public void submitForSigning(String documentPath, String certificatePath) {
queue.offer(new SigningTask(documentPath, certificatePath));
}
public void startProcessing() {
for (int i = 0; i < 5; i++) {
executorService.submit(() -> {
while (true) {
try {
SigningTask task = queue.take();
processSigningTask(task);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
});
}
}
private void processSigningTask(SigningTask task) {
// Your signing logic here
}
}
此模式可避免記憶體問題,提升整體吞吐量。
效能考量
簽署效能最佳化
典型簽署時間:
- 小型 PDF(1‑5 頁):100‑300 ms
- 中型 PDF(20‑50 頁):500‑1000 ms
- 大型 PDF(100+ 頁):2‑5 s
- Word 文件:通常比 PDF 更快
優化策略:
- 重複使用 Signature 物件
// Bad - creates new object for each document
for (String doc : documents) {
Signature sig = new Signature(doc);
sig.sign(output, options);
}
// Good - reuse when signing multiple documents with same options
for (String doc : documents) {
try (Signature sig = new Signature(doc)) {
sig.sign(output, options);
}
}
- 批次或平行處理 – 使用
CompletableFuture或ParallelStream處理獨立簽署任務:
List<CompletableFuture<Void>> futures = documents.stream()
.map(doc -> CompletableFuture.runAsync(() -> signDocument(doc)))
.collect(Collectors.toList());
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
- 監控與效能分析 – 使用 JProfiler、YourKit 等工具找出瓶頸。常見問題:憑證載入(可快取)、圖片處理(簽署前壓縮圖片)、檔案 I/O(使用 SSD、必要時使用 RAM Disk 作為暫存)。
資源使用指引
記憶體需求:
- 基礎函式庫:約 50 MB 堆積
- 每份文件:約 2 倍文件大小(輸入 + 輸出)
- 例如 100 MB PDF,建議至少配置
-Xmx256m
生產建議: 從 -Xmx1G 起步,觀察實際使用情況,開啟 GC 日誌並設定當堆積使用率超過 80% 時發出警報。
Java 記憶體管理最佳實踐
// Always use try-with-resources
try (Signature signature = new Signature(filePath)) {
signature.sign(outputPath, options);
} // Automatically calls signature.dispose()
// For custom resource management
Signature signature = null;
try {
signature = new Signature(filePath);
signature.sign(outputPath, options);
} finally {
if (signature != null) {
signature.dispose();
}
}
在生產環境中監控指標: 堆積使用趨勢、GC 暫停時間、同時簽署數量、每種文件類型的平均簽署時間。
結論
你已掌握在 Java 中實作專業級數位簽章的完整流程。重點回顧:
✅ 在任意 Java 專案(Maven 或 Gradle)中設定 GroupDocs.Signature
✅ 以具法律效力的數位憑證程式化簽署文件
✅ 優雅處理例外並排除常見問題
✅ 在生產環境落實安全最佳實踐
✅ 根據使用情境選擇合適的簽章類型
✅ 針對高量文件處理進行效能優化
結論: 數位簽章自動化每天可為團隊節省大量手動工作,同時提升安全性與合規性。無論是處理 10 份或 10 000 份文件,你在此學到的模式都能順利擴展。
後續步驟
想進一步深化實作嗎?以下主題值得探索:
- 簽章驗證工作流 – 學習如何程式化驗證已簽署文件。
- 自訂簽章外觀 – 使用公司標誌打造品牌化簽章區塊。
- 多重簽章流程 – 實作順序批准鏈(簽署 → 會簽 → 最終批准)。
- 雲端整合 – 連接 AWS S3、Google Drive、Dropbox 等,實現文件的無縫存取。
有問題嗎? GroupDocs 社群論壇活躍且熱心——可在 forum.groupdocs.com 搜尋或發問。
常見問答
1. GroupDocs.Signature 能簽署哪些檔案格式?
支援 PDF、DOCX、XLSX、PPTX 以及超過 50 種其他格式,包含圖片(PNG、JPG)與純文字。PDF 是最常用於具法律效力的簽署,因為它能跨平台保持版面,但函式庫同時支援試算表、簡報,甚至 CAD 檔,提供單一 API 處理所有文件類型。
2. 如何在批次處理中簽署多份文件?
使用執行緒池(thread‑pool)平行處理文件(參見「批次處理模式」章節)。若批次超過 1000 份,建議使用訊息佇列(RabbitMQ、AWS SQS)分散至多台伺服器。務必監控記憶體使用並實作速率限制,以防資源耗盡。
3. 能驗證 GroupDocs.Signature 所產生的簽章嗎?
可以!使用 signature.verify() 搭配適當的驗證選項,即可檢查憑證有效性、簽章完整性,以及文件是否被修改。亦可驗證簽署時間戳記、撤銷狀態與信任鏈,確保符合法律標準。
4. 數位簽章與電子簽章有何差別?
數位簽章 透過加密憑證提供防篡改與不可否認性(本教學的重點)。電子簽章 是更廣義的概念,包含任何以電子方式表示同意的方式——例如打字姓名、點擊「我同意」或使用數位簽章。若需在多數司法管轄區取得法律效力,數位簽章是首選。
5. 如何排除「Invalid certificate」錯誤?
首先確認 .pfx 檔能在 Windows 憑證管理員或使用 keytool -list 正常開啟。常見問題包括:(1) 密碼錯誤;(2) 憑證過期;(3) 檔案損毀——請重新向憑證機構匯出;(4) 權限不足——確保 Java 程序能讀取憑證檔。
6. 能將 GroupDocs.Signature 與 AWS S3 等雲端儲存整合嗎?
完全可以。先從 S3 下載文件至暫存目錄,簽署後再上傳回 S3。簡化流程如下:s3.getObject() → sign() → s3.putObject()。正式環境建議使用預簽名 URL 直接上傳,並加入重試機制處理暫時性失敗。
7. 生產環境如何管理憑證到期?
實作每日檢查憑證到期日的自動化任務,於到期前 30 天發送警報。將到期日期與憑證元資料存入資料庫,並使用排程工作自動從企業憑證管理系統取得並安裝更新的憑證。
8. 能否客製化簽章的視覺外觀,超出僅放圖片?
可以。可自訂位置、尺寸、旋轉角度、透明度與邊框樣式。進階客製化可結合圖片簽章與文字簽章,打造複雜的簽章區塊,甚至在簽章區加入 QR Code 或條碼以攜帶額外元資料。
9. 生產授權的費用如何?
GroupDocs 提供多種授權方案:開發者授權(適合小團隊)、伺服器授權(適合大規模部署)以及企業授權(含無限制開發者與高階支援)。價格從每位開發者每年數百美元起,依開發者人數與支援等級遞增。請聯絡業務取得依使用量客製化報價。
10. 文件頁面尺寸不固定時,如何處理簽章位置?
先透過 signature.getDocumentInfo() 取得頁面尺寸,然後以頁面比例(例如右側 10%、底部 5%)計算簽章座標。這樣無論是 A4、Letter 或自訂尺寸,都能保持一致的視覺位置。
相關資源
- Documentation – 完整 API 參考與教學
- API Reference – 詳細類別與方法說明
- Download – 最新版本與發行紀錄
- Purchase – 授權方案與價格
- Free Trial – 無需承諾即可測試全部功能
- Temporary License – 開發與測試期間取得完整存取權
- Support Forum – 社群協助與官方支援
最後更新日期: 2026-06-26
測試環境: GroupDocs.Signature 23.12 for Java
作者: GroupDocs