Tutorial GroupDocs Viewer Java: Mengonversi Word ke HTML dan Menampilkan Dokumen dengan Komentar
Pendahuluan
Jika Anda perlu mengonversi Word ke HTML sambil mempertahankan setiap catatan, komentar, atau anotasi reviewer, Anda berada di tempat yang tepat. Banyak pengembang Java mengalami kesulitan ketika konversi dokumen menghilangkan umpan balik berharga yang tertanam dalam file asli. Tutorial ini memandu Anda menggunakan GroupDocs Viewer untuk Java untuk mengonversi Word ke HTML dan menampilkan berbagai jenis dokumen—Word, Excel, PowerPoint, PDF, dan lainnya—tanpa kehilangan data komentar apa pun. Anda akan menemukan mengapa GroupDocs Viewer adalah pilihan siap produksi, cara menyiapkan lingkungan, kode tepat yang Anda perlukan, dan trik terbukti untuk menjaga kinerja tetap cepat bahkan dengan file besar.

Render Dokumen dengan Komentar menggunakan GroupDocs.Viewer untuk Java
Apa yang akan Anda kuasai dalam tutorial ini:
- Pengaturan dan konfigurasi lengkap GroupDocs Viewer
- Langkah‑demi‑langkah mengonversi Word ke HTML dengan komentar yang dipertahankan
- Solusi pemecahan masalah umum dan hal‑hal yang harus dihindari
- Pola implementasi dunia nyata dan praktik terbaik
- Teknik optimisasi kinerja untuk penggunaan produksi
Jawaban Cepat
- Apakah GroupDocs Viewer dapat mengonversi Word ke HTML? Ya—aktifkan rendering HTML dan dukungan komentar dalam satu baris kode.
- Apakah komentar tetap ada dalam output HTML? Tentu—
setRenderComments(true)mempertahankan setiap komentar dan anotasi. - Versi Java apa yang diperlukan? JDK 8 atau lebih tinggi.
- Apakah lisensi diperlukan untuk produksi? Lisensi penuh menghapus watermark dan membuka semua fitur.
- Bagaimana cara meningkatkan kecepatan rendering? Render halaman tertentu, gunakan sumber daya eksternal, dan tingkatkan ukuran heap JVM.
Apa itu “convert word to html” dengan komentar?
“Convert Word to HTML” berarti mengubah file Microsoft Word .docx menjadi dokumen HTML siap web sambil mempertahankan tata letak, gaya, dan komentar yang tertanam. Proses ini memungkinkan browser menampilkan dokumen persis seperti yang dimaksudkan penulis, lengkap dengan umpan balik reviewer.
Mengapa Memilih GroupDocs Viewer untuk Java?
Sebelum kita masuk ke kode, mari jelajahi mengapa GroupDocs Viewer adalah perpustakaan pilihan untuk rendering dokumen berbasis Java:
- lebih dari 170 format yang didukung – perpustakaan menangani segala hal mulai dari DOCX hingga file CAD, memberi Anda satu dependensi untuk semua kebutuhan konversi.
- Tidak memerlukan instalasi Office pihak ketiga – berfungsi di semua OS tanpa memerlukan Microsoft Office, LibreOffice, atau runtime berat lainnya.
- Mempertahankan format dan anotasi – komentar, catatan kaki, dan perubahan yang dilacak tetap utuh setelah konversi.
- Mesin cepat dan ringan – dokumen 100 halaman biasanya dirender dalam kurang dari 2 detik pada server standar 4‑core.
- Dokumentasi lengkap dan komunitas aktif – Anda akan menemukan contoh, forum, dan dukungan cepat kapan pun Anda mengalami masalah.
Kapan Menggunakan Pendekatan Ini
- Membangun penampil dokumen berbasis web yang perlu menampilkan catatan reviewer
- Membuat platform tinjauan kolaboratif di mana umpan balik harus tetap terlihat
- Mengonversi kontrak lama untuk tampilan online di portal hukum
- Mengembangkan solusi e‑learning yang menyematkan komentar instruktur dalam materi belajar
Prasyarat dan Penyiapan Lingkungan
Apa yang Anda Butuhkan
- Java Development Kit (JDK) 8+ – runtime yang menjalankan aplikasi Anda.
- Maven 3.6+ – untuk manajemen dependensi dan membangun proyek.
- IDE pilihan Anda – IntelliJ IDEA, Eclipse, atau VS Code.
- Dokumen contoh dengan komentar – file DOCX, XLSX, PPTX yang berisi catatan reviewer.
Menyiapkan Lingkungan Pengembangan Anda
Langkah 1: Verifikasi Instalasi Java
Buka terminal dan jalankan:
java -version
Anda harus melihat string versi yang dimulai dengan 1.8 atau lebih tinggi. Jika tidak, unduh JDK terbaru dari situs resmi Oracle atau OpenJDK.
Langkah 2: Periksa Instalasi Maven
Jalankan:
mvn -v
Maven harus melaporkan versi dan versi Java yang digunakannya. Instal Maven dari situs Apache jika perintah tidak dikenali.
Langkah 3: Buat Proyek Maven Baru
Hasilkan proyek kerangka dengan:
mvn archetype:generate -DgroupId=com.example.viewer -DartifactId=viewer-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Masuk ke folder viewer-demo yang baru dibuat dan Anda siap menambahkan GroupDocs Viewer.
Menyiapkan GroupDocs.Viewer untuk Java
Menambahkan Dependensi
Langkah pertama dalam tutorial GroupDocs Viewer Java apa pun adalah memasukkan perpustakaan ke dalam proyek Anda. Tambahkan konfigurasi ini ke file pom.xml Anda:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-viewer</artifactId>
<version>25.2</version>
</dependency>
Pro Tip: Selalu periksa halaman rilis GroupDocs untuk versi terbaru. Perpustakaan ini dipelihara secara aktif dengan pembaruan rutin dan perbaikan bug.
Memahami Opsi Lisensi
GroupDocs menawarkan lisensi fleksibel yang sesuai dengan berbagai kebutuhan proyek:
- Free Trial (Sempurna untuk Pembelajaran): evaluasi 30 hari dengan akses penuh ke semua fitur dan watermark evaluasi.
- Temporary License (Untuk Pengembangan): evaluasi diperpanjang tanpa watermark; ideal untuk proyek proof‑of‑concept. Minta di Halaman Lisensi Sementara GroupDocs.
- Full License (Siap Produksi): Tanpa batasan atau watermark, penggunaan komersial diizinkan. Tersedia di Halaman Pembelian GroupDocs.
Pola Inisialisasi Dasar
Berikut pola dasar yang akan Anda gunakan sepanjang tutorial ini:
try (Viewer viewer = new Viewer("input.docx")) {
// Rendering options will be set later
}
Mengapa Pola Ini Berfungsi:
- Manajemen sumber daya otomatis mencegah kebocoran memori.
- Penanganan pengecualian menangkap masalah akses file umum.
- Kode bersih dan mudah dibaca yang mudah dipelihara pada proyek besar.
Implementasi Inti: Rendering Dokumen dengan Komentar
Memahami Proses
Saat Anda merender dokumen dengan GroupDocs Viewer, perpustakaan melakukan empat langkah utama:
- Analisis Dokumen – mengurai file input dan membangun representasi internal.
- Ekstraksi Komentar – mengidentifikasi setiap komentar, catatan kaki, dan anotasi.
- Generasi HTML – membuat HTML bersih yang mematuhi standar dan mencerminkan tata letak asli.
- Penanganan Sumber Daya – menggabungkan gambar, CSS, dan font baik secara inline maupun sebagai file eksternal.
Implementasi Langkah‑demi‑Langkah
Langkah 1: Siapkan Jalur File Anda
Atur lokasi input dan output Anda sejak awal untuk menghindari kesalahan terkait jalur:
Path inputPath = Paths.get("documents/sample-with-comments.docx");
Path outputDir = Paths.get("output/html");
Files.createDirectories(outputDir);
Mengapa Pendekatan Ini:
- Menggunakan API
PathJava NIO.2 modern, yang lebih andal daripadajava.io.File. - Nama variabel yang deskriptif memudahkan debugging.
- Placeholder
{0}dalam pola output secara otomatis diganti dengan nomor halaman.
Langkah 2: Konfigurasikan Opsi Rendering HTML
Di sinilah keajaiban terjadi. Kami memberi tahu GroupDocs secara tepat bagaimana kami ingin dokumen dirender: HtmlViewOptions mengonfigurasi cara dokumen dirender ke HTML, termasuk penanganan sumber daya dan rendering komentar.
HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(outputDir);
viewOptions.setRenderComments(true); // Preserve every comment
viewOptions.setPageNumberPrefix("page_");
Detail Konfigurasi Utama:
forEmbeddedResources()menyematkan CSS, gambar, dan font langsung ke dalam HTML, membuat output dapat dipindahkan.setRenderComments(true)adalah satu baris kode yang memastikan convert word to html mempertahankan semua catatan reviewer.- Alternatif
forExternalResources()memungkinkan Anda menyimpan aset secara terpisah jika menginginkan file HTML yang lebih ringan.
Langkah 3: Jalankan Rendering
Sekarang kita menggabungkan semuanya: Viewer adalah kelas utama yang digunakan untuk memuat dokumen dan melakukan operasi rendering.
try (Viewer viewer = new Viewer(inputPath.toFile())) {
viewer.view(viewOptions);
}
Pemanggilan view membaca file Word, mengekstrak komentar, menghasilkan halaman HTML, dan menuliskannya ke output/html. Setiap halaman disimpan sebagai page_1.html, page_2.html, dll.
Contoh Kerja Lengkap
Menggabungkan semua bagian memberikan Anda satu kelas yang dapat dijalankan yang mengonversi dokumen Word ke HTML sambil mempertahankan komentar. (Kode sumber lengkap tersedia di repositori GitHub resmi.)
Konfigurasi Lanjutan dan Opsi
Menyiapkan Direktori Output Dinamis
Untuk aplikasi yang lebih besar Anda mungkin ingin menghasilkan direktori output berdasarkan ID pengguna atau cap waktu:
String userId = "12345";
Path dynamicOutput = Paths.get("output", userId, LocalDate.now().toString());
Files.createDirectories(dynamicOutput);
HtmlViewOptions dynamicOptions = HtmlViewOptions.forEmbeddedResources(dynamicOutput);
Masalah Umum dan Pemecahan Masalah
Masalah 1: Kesalahan “File Not Found”
Pastikan jalur input bersifat absolut atau relatif terhadap direktori kerja, dan verifikasi izin file. Menggunakan objek Path membantu menghindari kesalahan penggabungan string umum.
Masalah 2: Komentar Tidak Muncul di Output
Periksa kembali bahwa setRenderComments(true) dipanggil sebelum viewer.view(). Juga pastikan dokumen sumber memang berisi komentar; Anda dapat memeriksanya melalui viewer.getDocumentInfo().getComments().
Masalah 3: Kesalahan Out of Memory dengan Dokumen Besar
GroupDocs Viewer melakukan streaming data, tetapi file yang sangat besar (> 500 halaman) masih dapat membebani heap JVM. Tingkatkan ukuran heap dengan -Xmx4g atau render hanya halaman yang diperlukan.
Masalah 4: Performa Rendering Lambat
Render rentang halaman tertentu menggunakan viewer.view(pageRange, viewOptions). Sumber daya eksternal (forExternalResources()) juga mengurangi ukuran payload HTML, mempercepat rendering di browser.
Pola Implementasi Dunia Nyata
Pola 1: Integrasi Aplikasi Web
Integrasikan logika rendering ke dalam controller Spring Boot untuk menyajikan HTML sesuai permintaan:
@RestController
@RequestMapping("/api/view")
public class DocumentController {
@GetMapping("/{id}")
public ResponseEntity<Resource> renderDocument(@PathVariable String id) throws IOException {
Path docPath = Paths.get("documents", id + ".docx");
Path outDir = Files.createTempDirectory("viewer");
HtmlViewOptions options = HtmlViewOptions.forEmbeddedResources(outDir);
options.setRenderComments(true);
try (Viewer viewer = new Viewer(docPath.toFile())) {
viewer.view(options);
}
// Return the first HTML page as a Resource
Path firstPage = outDir.resolve("page_1.html");
Resource resource = new UrlResource(firstPage.toUri());
return ResponseEntity.ok()
.contentType(MediaType.TEXT_HTML)
.body(resource);
}
}
Pola 2: Pemrosesan Batch Banyak Dokumen
Saat Anda perlu mengonversi seluruh folder file Word, lakukan loop melalui direktori dan gunakan kembali instance HtmlViewOptions yang sama untuk meminimalkan overhead pembuatan objek.
Optimasi Performa dan Praktik Terbaik
Tips Manajemen Memori
- Selalu gunakan try‑with‑resources untuk instance
Viewer. - Proses dokumen besar secara batch daripada memuat semuanya ke memori sekaligus.
- Pantau penggunaan heap JVM dengan alat seperti VisualVM dan sesuaikan
-Xmxsesuai kebutuhan. - Terapkan caching yang tepat untuk dokumen yang sering diakses guna menghindari rendering berulang.
Panduan Penggunaan Sumber Daya
Untuk Aplikasi Kecil (< 100 dokumen/hari):
HtmlViewOptions options = HtmlViewOptions.forEmbeddedResources(Paths.get("output"));
options.setRenderComments(true);
Untuk Aplikasi Volume Tinggi (1000+ dokumen/hari):
HtmlViewOptions options = HtmlViewOptions.forExternalResources(Paths.get("output"));
options.setRenderComments(true);
options.setCacheEnabled(true);
Strategi Caching
Simpan HTML yang dirender dalam cache terdistribusi (mis., Redis) dengan kunci berupa hash dokumen. Ketika permintaan datang, periksa cache terlebih dahulu; jika ada, sajikan HTML yang di‑cache secara instan, melewati mesin rendering.
Kapan Menggunakan GroupDocs Viewer vs Alternatif
GroupDocs Viewer Sempurna Untuk
- Sistem Manajemen Dokumen – perlu menampilkan banyak tipe file dengan anotasi.
- Platform Tinjauan Kolaboratif – komentar harus tetap terlihat oleh semua peserta.
- Alat Pendidikan – catatan instruktur muncul bersamaan dengan slide kuliah.
- Aplikasi Hukum – kontrak dengan komentar pengacara memerlukan rendering yang setia.
Pertimbangkan Alternatif Ketika
- Tampilan PDF Sederhana – penampil PDF bawaan browser mungkin sudah cukup.
- Konversi Gambar Dasar –
ImageIOatau perpustakaan serupa lebih ringan. - Ekstraksi Teks Murni – Apache POI atau iText mungkin lebih tepat.
Pertanyaan yang Sering Diajukan
Q: Bisakah saya merender dokumen tanpa komentar?
A: Ya—cukup hilangkan pemanggilan setRenderComments(true) atau setel ke false.
Q: Format file apa yang mendukung rendering komentar?
A: Sebagian besar format utama—termasuk DOC/DOCX, XLS/XLSX, PPT/PPTX, PDF, dan banyak lagi. Lihat dokumentasi resmi untuk daftar lengkap.
Q: Bisakah saya menyesuaikan gaya output HTML?
A: Tentu saja. Gunakan HtmlViewOptions.setEmbedResources(false) untuk menghasilkan file CSS eksternal, lalu tambahkan stylesheet Anda sendiri setelah rendering.
Q: Bagaimana cara menangani dokumen yang dilindungi kata sandi?
A: Berikan instance LoadOptions dengan kata sandi:
LoadOptions memungkinkan Anda menentukan parameter pemuatan dokumen seperti kata sandi.
LoadOptions loadOptions = new LoadOptions("myPassword");
try (Viewer viewer = new Viewer(inputPath.toFile(), loadOptions)) {
viewer.view(viewOptions);
}
Q: Apakah memungkinkan untuk merender hanya halaman tertentu?
A: Ya—gunakan metode view yang di‑overload yang menerima koleksi PageNumber:
PageNumber mewakili indeks halaman tertentu yang digunakan saat merender subset halaman.
viewer.view(new int[]{1, 3, 5}, viewOptions);
Q: Mengapa rendering lambat untuk dokumen besar?
A: File besar memerlukan lebih banyak waktu pemrosesan. Tingkatkan kecepatan dengan merender hanya halaman yang diperlukan, menggunakan sumber daya eksternal, meningkatkan heap JVM, dan mengaktifkan pemrosesan asynchronous.
Q: Bagaimana saya dapat memantau kemajuan rendering?
A: Meskipun GroupDocs Viewer tidak memiliki callback bawaan, Anda dapat mengukur waktu operasi dengan System.nanoTime() sebelum dan sesudah viewer.view() untuk mencatat durasi.
Q: Apa yang terjadi jika dokumen sumber rusak?
A: Perpustakaan melempar ViewerException. Bungkus pemanggilan dalam blok try‑catch dan catat kesalahan untuk penurunan yang elegan.
Q: Bisakah saya menggunakan GroupDocs Viewer dalam aplikasi komersial?
A: Ya, tetapi lisensi komersial diperlukan. Versi percobaan gratis menyertakan watermark yang harus dihapus untuk penggunaan produksi.
Q: Apakah ada batasan penggunaan?
A: Perpustakaan itu sendiri tidak memberlakukan batasan, meskipun perjanjian lisensi Anda mungkin menentukan batas penggunaan. Tinjau kontrak Anda untuk detailnya.
Q: Bisakah saya mendistribusikan aplikasi yang menyertakan GroupDocs Viewer?
A: Anda dapat mendistribusikan aplikasi Anda sendiri, tetapi tidak dapat mendistribusikan binary perpustakaan GroupDocs itu sendiri. Periksa ketentuan lisensi untuk kepatuhan.
Langkah Selanjutnya dan Topik Lanjutan
Anda kini memiliki dasar yang kuat untuk convert word to html sambil mempertahankan komentar. Berikut beberapa arah untuk memperdalam keahlian Anda:
- Watermarking – tambahkan watermark khusus ke halaman yang dirender untuk branding atau kerahasiaan.
- Ekstraksi Metadata – ambil penulis, tanggal pembuatan, dan jumlah halaman melalui
viewer.getDocumentInfo(). - Viewer Kustom – bangun viewer khusus untuk PDF, spreadsheet, atau presentasi yang menyembunyikan atau menyoroti komentar secara berbeda.
- Integrasi Penyimpanan Cloud – render file langsung dari AWS S3, Azure Blob, atau Google Drive tanpa mengunduhnya secara lokal.
Jalur Pembelajaran yang Direkomendasikan
- Bereksperimen dengan Berbagai Tipe File – coba file Excel, PowerPoint, dan PDF untuk melihat bagaimana komentar ditangani di berbagai format.
- Bangun Web Viewer Sederhana – buat halaman HTML minimal yang memuat HTML yang dihasilkan melalui
<iframe>atau AJAX. - Jelajahi Ekosistem GroupDocs – lihat GroupDocs Annotation, Comparison, dan Signature untuk alur kerja dokumen end‑to‑end.
- Bergabung dengan Komunitas – berpartisipasi di Forum GroupDocs untuk tips, contoh proyek, dan dukungan.
Mendapatkan Bantuan dan Dukungan
Sumber Resmi
Sumber Daya Komunitas
- Stack Overflow (tag:
groupdocs-viewer) - Komunitas pemrograman Reddit
- Server Discord pengembang Java
Terakhir Diperbarui: 2026-05-21
Diuji Dengan: GroupDocs.Viewer 25.2 untuk Java
Penulis: GroupDocs
java -version
javac -version
mvn -version
mvn archetype:generate -DgroupId=com.example.documentviewer -DartifactId=groupdocs-viewer-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
<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>
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();
}
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");
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);
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();
}
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();
}
}
}
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);
}
}
// 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());
}
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());
// 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
// 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)
@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());
}
}
}
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());
}
}
}
}
// Simple approach works fine
try (Viewer viewer = new Viewer(documentPath)) {
viewer.view(viewOptions);
}
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);
}
}
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();
}
}
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
try (Viewer viewer = new Viewer("protected-doc.docx", loadOptions)) {
// Render as usual
}
viewer.view(viewOptions, 1, 3, 5); // Renders only pages 1, 3, and 5
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");
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());
}