Hướng dẫn GroupDocs Viewer Java: Chuyển đổi Word sang HTML và Hiển thị Tài liệu với Bình luận
Giới thiệu
Bạn đã bao giờ cố gắng chuyển đổi một tài liệu Word sang HTML mà lại mất hết các bình luận và chú thích quan trọng chưa? Bạn không phải là người duy nhất. Nhiều nhà phát triển Java gặp khó khăn trong việc bảo tồn định dạng tài liệu và nội dung nhúng trong quá trình chuyển đổi.
Bài hướng dẫn GroupDocs Viewer Java toàn diện này giải quyết chính xác vấn đề đó. Bạn sẽ học cách chuyển đổi Word sang HTML đồng thời hiển thị tài liệu (Word, Excel, PowerPoint và hơn thế nữa) thành HTML sạch sẽ với mọi bình luận, chú thích và phản hồi được giữ nguyên.
Cho dù bạn đang xây dựng hệ thống quản lý tài liệu, tạo nền tảng đánh giá cộng tác, hoặc chỉ cần hiển thị tài liệu có chú thích trên web, hướng dẫn này sẽ đáp ứng nhu cầu của bạn.

Những gì bạn sẽ nắm vững trong hướng dẫn này:
- Cài đặt và cấu hình GroupDocs Viewer đầy đủ
- Hướng dẫn từng bước chuyển đổi Word sang HTML với bình luận được bảo tồn
- Giải pháp khắc phục sự cố phổ biến và các lưu ý cần tránh
- Mẫu triển khai thực tế và các thực hành tốt nhất
- Kỹ thuật tối ưu hiệu năng cho môi trường sản xuất
Câu trả lời nhanh
- GroupDocs Viewer có thể chuyển đổi Word sang HTML không? Có, chỉ cần bật chế độ hiển thị HTML và hỗ trợ bình luận.
- Các bình luận có được giữ trong đầu ra HTML không? Hoàn toàn—
setRenderComments(true)sẽ bảo tồn chúng. - Phiên bản Java yêu cầu là gì? JDK 8 hoặc cao hơn.
- Cần giấy phép cho môi trường sản xuất không? Giấy phép đầy đủ sẽ loại bỏ watermark và mở khóa tất cả tính năng.
- Làm thế nào để cải thiện tốc độ hiển thị? Hiển thị các trang cụ thể, sử dụng tài nguyên bên ngoài và tăng kích thước heap JVM.
Tại sao chọn GroupDocs Viewer cho Java?
Trước khi chúng ta bắt tay vào viết mã, hãy nhanh chóng hiểu tại sao GroupDocs Viewer nổi bật trong việc hiển thị tài liệu Java:
Ưu điểm chính:
- Hỗ trợ hơn 170 định dạng tệp ngay từ đầu
- Không cần Microsoft Office hay phần mềm bên thứ ba nào khác
- Bảo tồn định dạng gốc và các yếu tố nhúng
- Engine hiển thị nhẹ và nhanh
- Tài liệu tuyệt vời và hỗ trợ cộng đồng
Khi nào nên sử dụng cách tiếp cận này:
- Xây dựng trình xem tài liệu trên web
- Tạo hệ thống đánh giá cộng tác
- Phát triển cổng quản lý tài liệu
- Chuyển đổi tài liệu cũ để hiển thị trên web
- Xây dựng nền tảng giáo dục với nội dung có chú thích
Yêu cầu và Cài đặt môi trường
Những gì bạn cần
Trước khi bắt đầu bài hướng dẫn GroupDocs Viewer Java này, hãy chắc chắn rằng bạn có:
Yêu cầu thiết yếu:
- Java Development Kit (JDK) 8 hoặc cao hơn
- Maven 3.6+ để quản lý phụ thuộc
- IDE yêu thích của bạn (IntelliJ IDEA, Eclipse hoặc VS Code)
- Kiến thức cơ bản về Java và Maven
Tùy chọn nhưng hữu ích:
- Các tài liệu mẫu có bình luận (tệp Word, Excel, PowerPoint)
- Kiến thức cơ bản về HTML và phát triển web
- Hiểu biết về các thao tác I/O file trong Java
Cài đặt môi trường phát triển của bạn
Bước 1: Xác minh cài đặt Java
java -version
javac -version
Bước 2: Kiểm tra cài đặt Maven
mvn -version
Nếu bạn thiếu bất kỳ công cụ nào, hãy tải chúng từ trang web chính thức và làm theo hướng dẫn cài đặt.
Bước 3: Tạo dự án Maven mới
mvn archetype:generate -DgroupId=com.example.documentviewer -DartifactId=groupdocs-viewer-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Bây giờ bạn đã sẵn sàng thêm GroupDocs Viewer vào dự án của mình!
Cài đặt GroupDocs.Viewer cho Java
Thêm phụ thuộc
Bước đầu tiên trong bất kỳ bài hướng dẫn GroupDocs Viewer Java nào là đưa thư viện vào dự án. Thêm cấu hình này vào tệp pom.xml của bạn:
<repositories>
<repository>
<id>repository.groupdocs.com</id>
<name>GroupDocs Repository</name>
<url>https://releases.groupdocs.com/viewer/java/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-viewer</artifactId>
<version>25.2</version>
</dependency>
</dependencies>
Mẹo: Luôn kiểm tra trang phát hành GroupDocs để có phiên bản mới nhất. Thư viện được duy trì tích cực với các bản cập nhật và sửa lỗi thường xuyên.
Hiểu các tùy chọn cấp phép
GroupDocs cung cấp các gói cấp phép linh hoạt phù hợp với nhu cầu dự án khác nhau:
Bản dùng thử miễn phí (Lý tưởng cho việc học):
- Thời gian đánh giá 30 ngày
- Truy cập đầy đủ tính năng với watermark đánh giá
- Thích hợp để theo dõi hướng dẫn này và thử nghiệm các khái niệm
Giấy phép tạm thời (Cho phát triển):
- Đánh giá mở rộng không có watermark
- Lý tưởng cho các dự án proof‑of‑concept
- Yêu cầu tại trang giấy phép tạm thời GroupDocs
Giấy phép đầy đủ (Sẵn sàng cho sản xuất):
- Không giới hạn hay watermark
- Cho phép sử dụng thương mại
- Có sẵn tại trang mua GroupDocs
Mẫu khởi tạo cơ bản
Đây là mẫu cơ bản bạn sẽ sử dụng trong suốt hướng dẫn này:
import com.groupdocs.viewer.Viewer;
// The try-with-resources pattern ensures proper cleanup
try (Viewer viewer = new Viewer("path/to/your/document.docx")) {
// All rendering operations happen here
// Resources are automatically closed when done
} catch (Exception e) {
System.err.println("Error rendering document: " + e.getMessage());
e.printStackTrace();
}
Tại sao mẫu này hoạt động:
- Quản lý tài nguyên tự động ngăn ngừa rò rỉ bộ nhớ
- Xử lý ngoại lệ bắt các vấn đề truy cập tệp thường gặp
- Mã sạch, dễ đọc và dễ bảo trì
Triển khai cốt lõi: Hiển thị tài liệu với bình luận
Bây giờ là phần chính! Hãy cùng đi qua quá trình hiển thị tài liệu với mọi bình luận được bảo tồn.
Hiểu quy trình
Khi bạn hiển thị tài liệu bằng GroupDocs Viewer, đây là những gì xảy ra phía sau:
- Phân tích tài liệu: Thư viện đọc và phân tích tệp đầu vào của bạn
- Trích xuất bình luận: Các bình luận và chú thích được xác định và bảo tồn
- Tạo HTML: HTML sạch, tuân thủ tiêu chuẩn được tạo ra (đây là nơi chúng ta chuyển đổi Word sang HTML)
- Xử lý tài nguyên: Hình ảnh, kiểu dáng và các tài nguyên khác được quản lý
- Tạo đầu ra: Các tệp HTML cuối cùng được ghi vào thư mục bạn chỉ định
Triển khai từng bước
Bước 1: Thiết lập đường dẫn tệp của bạn
Đầu tiên, hãy sắp xếp nơi các tệp sẽ được lưu. Điều này có vẻ cơ bản, nhưng quản lý đường dẫn đúng cách ngăn ngừa 90 % các vấn đề phổ biến:
import java.nio.file.Path;
import java.nio.file.Paths;
// Create a descriptive output directory
Path outputDirectory = Paths.get("rendered-documents");
Path pageFilePathFormat = outputDirectory.resolve("page_{0}.html");
Tại sao cách tiếp cận này:
- Sử dụng API
Pathhiện đại của Java NIO.2 (đáng tin cậy hơn lớpFilecũ) - Tên mô tả giúp việc gỡ lỗi dễ dàng hơn
- Biến
{0}sẽ được thay thế bằng số trang tự động
Bước 2: Cấu hình tùy chọn hiển thị HTML
Đây là nơi phép thuật diễn ra. Chúng ta sẽ chỉ định cho GroupDocs cách hiển thị tài liệu mong muốn:
import com.groupdocs.viewer.options.HtmlViewOptions;
// Create HTML options with embedded resources
HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(pageFilePathFormat);
// The crucial setting – enable comment rendering!
viewOptions.setRenderComments(true);
Chi tiết cấu hình chính:
forEmbeddedResources(): Bao gồm tất cả CSS, hình ảnh và phông chữ trực tiếp trong HTML (tuyệt vời cho tính di động)setRenderComments(true): Bảo tồn mọi bình luận và chú thích (cốt lõi của chuyển đổi Word sang HTML có bình luận)- Thay thế:
forExternalResources()nếu bạn muốn các tệp tài nguyên riêng
Bước 3: Thực thi việc hiển thị
Bây giờ chúng ta kết hợp tất cả lại:
import com.groupdocs.viewer.Viewer;
try (Viewer viewer = new Viewer("path/to/your/document.docx")) {
// Create output directory if it doesn't exist
if (!outputDirectory.toFile().exists()) {
outputDirectory.toFile().mkdirs();
}
// Perform the actual rendering
viewer.view(viewOptions);
System.out.println("Document rendered successfully!");
System.out.println("Output location: " + outputDirectory.toAbsolutePath());
} catch (Exception e) {
System.err.println("Rendering failed: " + e.getMessage());
e.printStackTrace();
}
Ví dụ làm việc hoàn chỉnh
Đây là toàn bộ mã được gộp lại trong một lớp duy nhất, có thể chạy được:
package com.example.documentviewer;
import com.groupdocs.viewer.Viewer;
import com.groupdocs.viewer.options.HtmlViewOptions;
import java.nio.file.Path;
import java.nio.file.Paths;
public class DocumentRenderer {
public static void main(String[] args) {
renderDocumentWithComments("sample-document.docx", "output");
}
public static void renderDocumentWithComments(String inputFile, String outputDir) {
// Set up paths
Path outputDirectory = Paths.get(outputDir);
Path pageFilePathFormat = outputDirectory.resolve("page_{0}.html");
// Configure rendering options
HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(pageFilePathFormat);
viewOptions.setRenderComments(true);
// Render the document
try (Viewer viewer = new Viewer(inputFile)) {
// Ensure output directory exists
outputDirectory.toFile().mkdirs();
// Execute rendering
viewer.view(viewOptions);
System.out.println("✓ Document rendered with comments preserved");
System.out.println("📂 Output directory: " + outputDirectory.toAbsolutePath());
} catch (Exception e) {
System.err.println("❌ Rendering failed: " + e.getMessage());
e.printStackTrace();
}
}
}
Cấu hình nâng cao và các tùy chọn
Thiết lập thư mục đầu ra động
Đối với các ứng dụng lớn hơn, bạn sẽ muốn quản lý đường dẫn tinh vi hơn:
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathManager {
/**
* Creates a structured output path based on document name and timestamp
*/
public static Path getOutputDirectoryPath(String documentName) {
String timestamp = String.valueOf(System.currentTimeMillis());
String cleanDocName = documentName.replaceAll("[^a-zA-Z0-9]", "_");
return Paths.get("rendered-docs")
.resolve(cleanDocName)
.resolve(timestamp);
}
/**
* Simple output directory for basic use cases
*/
public static Path getSimpleOutputPath(String folderName) {
return Paths.get("output").resolve(folderName);
}
}
Các vấn đề thường gặp và khắc phục
Vấn đề 1: Lỗi “File Not Found”
// Always check if file exists before processing
Path inputPath = Paths.get("your-document.docx");
if (!inputPath.toFile().exists()) {
throw new IllegalArgumentException("Input file not found: " + inputPath.toAbsolutePath());
}
// Check if file is readable
if (!inputPath.toFile().canRead()) {
throw new IllegalArgumentException("Cannot read input file: " + inputPath.toAbsolutePath());
}
Vấn đề 2: Bình luận không xuất hiện trong đầu ra
HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(pageFilePathFormat);
// This line is crucial – don't forget it!
viewOptions.setRenderComments(true);
// For debugging, you can verify the setting:
System.out.println("Comments enabled: " + viewOptions.isRenderComments());
Vấn đề 3: Lỗi Out of Memory với tài liệu lớn
// Increase JVM heap size when running
// java -Xmx2g -Xms1g YourApplication
// Or process documents page by page for very large files
HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(pageFilePathFormat);
viewOptions.setRenderComments(true);
// Render only specific pages if needed
viewer.view(viewOptions, 1, 2, 3); // Renders only pages 1, 2, and 3
Vấn đề 4: Hiệu năng hiển thị chậm
// Use external resources for faster processing of multiple pages
HtmlViewOptions viewOptions = HtmlViewOptions.forExternalResources(
pageFilePathFormat,
"resources/page_{0}/",
"resources/page_{0}/{0}"
);
// Enable caching if processing the same document multiple times
// (Note: Implement caching at application level)
Mẫu triển khai thực tế
Mẫu 1: Tích hợp ứng dụng web
Đây là cách bạn có thể tích hợp điều này vào một controller Spring Boot:
@RestController
@RequestMapping("/api/documents")
public class DocumentController {
@PostMapping("/render")
public ResponseEntity<String> renderDocument(
@RequestParam("file") MultipartFile file) {
try {
// Save uploaded file temporarily
Path tempFile = Files.createTempFile("upload", ".tmp");
file.transferTo(tempFile.toFile());
// Render with comments
String outputDir = renderDocumentWithComments(
tempFile.toString(),
"web-output"
);
return ResponseEntity.ok("Document rendered: " + outputDir);
} catch (Exception e) {
return ResponseEntity.badRequest()
.body("Rendering failed: " + e.getMessage());
}
}
}
Mẫu 2: Xử lý hàng loạt nhiều tài liệu
public class BatchDocumentProcessor {
public void processFolderWithComments(String inputFolder) {
File folder = new File(inputFolder);
File[] files = folder.listFiles((dir, name) ->
name.toLowerCase().endsWith(".docx") ||
name.toLowerCase().endsWith(".xlsx") ||
name.toLowerCase().endsWith(".pptx")
);
if (files == null) return;
for (File file : files) {
try {
String outputDir = file.getName().replace(".", "_") + "_output";
renderDocumentWithComments(file.getAbsolutePath(), outputDir);
System.out.println("✓ Processed: " + file.getName());
} catch (Exception e) {
System.err.println("❌ Failed to process " + file.getName() + ": " + e.getMessage());
}
}
}
}
Tối ưu hiệu năng và các thực hành tốt nhất
Mẹo quản lý bộ nhớ
Khi làm việc với GroupDocs Viewer trong môi trường sản xuất, quản lý bộ nhớ hiệu quả là rất quan trọng:
Thực hành tốt nhất
- Luôn sử dụng try‑with‑resources để tự động dọn dẹp
- Xử lý tài liệu lớn theo lô thay vì một lúc
- Giám sát việc sử dụng heap JVM và điều chỉnh khi cần
- Triển khai bộ nhớ đệm hợp lý cho các tài liệu truy cập thường xuyên
Hướng dẫn sử dụng tài nguyên
Cho ứng dụng nhỏ (< 100 tài liệu/ngày):
// Simple approach works fine
try (Viewer viewer = new Viewer(documentPath)) {
viewer.view(viewOptions);
}
Cho ứng dụng có khối lượng cao (1000+ tài liệu/ngày):
public class DocumentRenderingService {
private final ExecutorService executorService =
Executors.newFixedThreadPool(4); // Limit concurrent renderings
public CompletableFuture<String> renderAsync(String documentPath) {
return CompletableFuture.supplyAsync(() -> {
try (Viewer viewer = new Viewer(documentPath)) {
// Rendering logic here
return "success";
} catch (Exception e) {
throw new RuntimeException(e);
}
}, executorService);
}
}
Chiến lược bộ nhớ đệm
public class CachedDocumentRenderer {
private final Map<String, String> renderCache = new ConcurrentHashMap<>();
public String renderWithCaching(String documentPath) {
String cacheKey = generateCacheKey(documentPath);
return renderCache.computeIfAbsent(cacheKey, key -> {
// Only render if not already cached
return performActualRendering(documentPath);
});
}
private String generateCacheKey(String documentPath) {
// Include file modification time in cache key
File file = new File(documentPath);
return documentPath + "_" + file.lastModified();
}
}
Khi nào nên sử dụng GroupDocs Viewer so với các giải pháp thay thế
GroupDocs Viewer là lựa chọn hoàn hảo cho
- Hệ thống quản lý tài liệu: Cần hiển thị nhiều loại tệp với chú thích
- Nền tảng cộng tác: Bình luận và phản hồi phải được hiển thị
- Công cụ giáo dục: Chú thích của giảng viên cần được hiển thị cho sinh viên
- Ứng dụng pháp lý: Đánh giá hợp đồng với bình luận của luật sư
Xem xét các giải pháp thay thế khi
- Hiển thị PDF đơn giản: Trình xem PDF tích hợp của trình duyệt có thể đủ
- Chuyển đổi ảnh cơ bản:
ImageIOhoặc các thư viện tương tự có thể nhẹ hơn - Trích xuất văn bản thuần: Apache POI hoặc iText có thể phù hợp hơn
Phần Câu hỏi thường gặp mở rộng
Câu hỏi về triển khai kỹ thuật
H: Tôi có thể hiển thị tài liệu mà không có bình luận không?
Đ: Chắc chắn! Chỉ cần bỏ qua setRenderComments(true) hoặc đặt nó thành false.
H: Những định dạng tệp nào hỗ trợ hiển thị bình luận?
Đ: Hầu hết các định dạng chính—bao gồm DOC/DOCX, XLS/XLSX, PPT/PPTX, PDF và nhiều hơn nữa. Xem tài liệu chính thức để có danh sách đầy đủ.
H: Tôi có thể tùy chỉnh kiểu dáng đầu ra HTML không?
Đ: Có! Sử dụng HtmlViewOptions.setEmbedResources(false) để làm việc với các stylesheet bên ngoài, hoặc chèn CSS tùy chỉnh sau khi hiển thị.
H: Làm thế nào để xử lý tài liệu được bảo vệ bằng mật khẩu?
Đ: Sử dụng lớp LoadOptions:
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
try (Viewer viewer = new Viewer("protected-doc.docx", loadOptions)) {
// Render as usual
}
H: Có thể hiển thị chỉ các trang cụ thể không?
Đ: Có! Sử dụng phương thức view() được overload:
viewer.view(viewOptions, 1, 3, 5); // Renders only pages 1, 3, and 5
Khắc phục sự cố và hiệu năng
H: Tại sao việc hiển thị chậm với tài liệu lớn?
Đ: Các tệp lớn cần thời gian xử lý nhiều hơn. Xem xét:
- Hiển thị các trang cụ thể thay vì toàn bộ tài liệu
- Sử dụng tài nguyên bên ngoài thay vì nhúng
- Tăng kích thước heap JVM
- Triển khai xử lý bất đồng bộ
H: Làm sao tôi có thể theo dõi tiến độ hiển thị?
Đ: GroupDocs Viewer không cung cấp callback tích hợp, nhưng bạn có thể đo thời gian thực hiện:
System.out.println("Starting render for: " + documentName);
long startTime = System.currentTimeMillis();
viewer.view(viewOptions);
long endTime = System.currentTimeMillis();
System.out.println("Rendering completed in: " + (endTime - startTime) + "ms");
H: Điều gì xảy ra nếu tài liệu nguồn bị hỏng?
Đ: GroupDocs Viewer sẽ ném một ngoại lệ. Luôn triển khai xử lý lỗi mạnh mẽ:
try (Viewer viewer = new Viewer(documentPath)) {
viewer.view(viewOptions);
} catch (CorruptOrDamagedFileException e) {
System.err.println("Document is corrupted: " + e.getMessage());
} catch (Exception e) {
System.err.println("General error: " + e.getMessage());
}
Kinh doanh và cấp phép
H: Tôi có thể sử dụng GroupDocs Viewer trong ứng dụng thương mại không?
Đ: Có, nhưng bạn cần giấy phép thương mại. Bản dùng thử miễn phí có watermark đánh giá phải được loại bỏ khi sử dụng trong môi trường sản xuất.
H: Có giới hạn sử dụng nào không?
Đ: Thư viện không áp đặt giới hạn nào, nhưng thỏa thuận giấy phép của bạn có thể có. Hãy xem lại các điều khoản cụ thể.
H: Tôi có thể phân phối lại các ứng dụng có chứa GroupDocs Viewer không?
Đ: Thông thường, bạn có thể phân phối ứng dụng của mình, nhưng không được phân phối lại thư viện GroupDocs. Kiểm tra chi tiết giấy phép của bạn.
Các bước tiếp theo và chủ đề nâng cao
Chúc mừng! Bạn đã có nền tảng vững chắc trong việc sử dụng GroupDocs Viewer cho Java. Dưới đây là một số lĩnh vực để khám phá tiếp theo:
Các tính năng nâng cao để khám phá
- Đánh dấu nước: Thêm watermark tùy chỉnh vào tài liệu đã hiển thị
- Trích xuất thông tin tài liệu: Lấy siêu dữ liệu, số trang và chi tiết tệp
- Trình xem tùy chỉnh: Xây dựng trình xem chuyên biệt cho các loại tài liệu cụ thể
- Tích hợp lưu trữ đám mây: Hiển thị trực tiếp từ AWS S3, Google Drive, v.v.
Lộ trình học đề xuất
- Thực hành với các loại tệp khác nhau: Thử các tệp Excel, PowerPoint và PDF
- Xây dựng trình xem web đơn giản: Tạo giao diện cơ bản hiển thị HTML đã render
- Khám phá hệ sinh thái GroupDocs: Tìm hiểu các sản phẩm GroupDocs khác cho quản lý tài liệu toàn diện
- Tham gia cộng đồng: Tham gia Diễn đàn GroupDocs để nhận mẹo và hỗ trợ
Nhận trợ giúp và hỗ trợ
Tài nguyên chính thức
Tài nguyên cộng đồng
- Stack Overflow (tag:
groupdocs-viewer) - Cộng đồng lập trình trên Reddit
- Các diễn đàn và máy chủ Discord dành cho nhà phát triển Java
Kết luận
Bạn đã thành công nắm vững các nguyên tắc cơ bản của chuyển đổi Word sang HTML đồng thời bảo tồn bình luận bằng GroupDocs Viewer cho Java. Từ cài đặt và cấu hình cơ bản đến khắc phục sự cố nâng cao và tối ưu hiệu năng, bạn hiện có kiến thức để triển khai hiển thị tài liệu mạnh mẽ trong các ứng dụng thực tế.
Những điểm chính
- GroupDocs Viewer đơn giản hoá các nhiệm vụ hiển thị tài liệu phức tạp
- Bảo tồn bình luận chỉ cần một dòng cấu hình (
setRenderComments(true)) - Xử lý lỗi và quản lý tài nguyên đúng cách là cần thiết cho môi trường sản xuất
- Thư viện mở rộng từ tiện ích đơn giản đến giải pháp cấp doanh nghiệp
Các hành động tiếp theo của bạn
- Chạy các ví dụ với tài liệu của bạn
- Tạo một dự án nhỏ trình bày HTML đã render trên trang web
- Tìm hiểu sâu hơn các tùy chọn tùy chỉnh như đánh dấu nước và trích xuất siêu dữ liệu
- Chia sẻ kinh nghiệm của bạn với cộng đồng để giúp người khác
Bắt đầu xây dựng những trải nghiệm xem tài liệu tuyệt vời ngay hôm nay, và nhớ—cộng đồng GroupDocs luôn sẵn sàng hỗ trợ khi bạn cần!
Last Updated: 2026-01-28
Tested With: GroupDocs.Viewer 25.2 for Java
Author: GroupDocs