GroupDocs Viewer Java oktató: Word konvertálása HTML-re és dokumentumok megjelenítése megjegyzésekkel
Bevezetés
Ha Word konvertálásra HTML-re van szükséged, miközben minden lektor megjegyzését, kommentjét vagy annotációját meg akarod tartani, a megfelelő helyen jársz. Sok Java fejlesztő akadályba ütközik, amikor a dokumentumkonverzió eltávolítja az eredeti fájlba ágyazott értékes visszajelzéseket. Ez az oktató végigvezet a GroupDocs Viewer for Java használatán, hogy Word‑t HTML‑re konvertálj, és számos dokumentumtípust – Word, Excel, PowerPoint, PDF és egyebek – jeleníts meg anélkül, hogy a komment adatokat elveszítenéd.

Dokumentumok megjelenítése megjegyzésekkel a GroupDocs.Viewer for Java segítségével
Amit ebben az oktatóban elsajátítasz:
- Teljes GroupDocs Viewer beállítás és konfiguráció
- Lépésről‑lépésre Word konvertálása HTML-re a kommentek megőrzésével
- Gyakori hibakeresési megoldások és elkerülendő csapdák
- Valós példák implementációs minták és legjobb gyakorlatok
- Teljesítményoptimalizálási technikák termelési környezethez
Gyors válaszok
- Tud a GroupDocs Viewer Word‑t HTML‑re konvertálni? Igen—egyetlen kódsorral engedélyezheted a HTML renderelést és a komment támogatást.
- Megmaradnak a kommentek a HTML kimenetben? Teljesen—
setRenderComments(true)megőrzi minden kommentet és annotációt. - Milyen Java verzió szükséges? JDK 8 vagy újabb.
- Szükséges licenc a termeléshez? A teljes licenc eltávolítja a vízjeleket és feloldja az összes funkciót.
- Hogyan javítható a renderelés sebessége? Renderelj konkrét oldalakat, használj külső erőforrásokat, és növeld a JVM heap méretét.
Mi az a “Word konvertálása HTML-re” kommentekkel?
„Word konvertálása HTML-re” azt jelenti, hogy egy Microsoft Word .docx fájlt web‑kész HTML dokumentummá alakítunk, miközben megőrzük az eredeti elrendezést, a stílusokat és a beágyazott kommenteket. Ez a folyamat lehetővé teszi, hogy a böngészők pontosan úgy jelenítsék meg a dokumentumot, ahogy a szerzők szánták, a lektori visszajelzésekkel együtt.
Miért válasszuk a GroupDocs Viewer for Java‑t?
Mielőtt a kódba merülnénk, nézzük meg, miért a GroupDocs Viewer a legjobb könyvtár a Java‑alapú dokumentumrendereléshez:
- 170+ támogatott formátum – a könyvtár mindent kezel a DOCX‑től a CAD fájlokig, egyetlen függőséget biztosítva minden konverziós igényhez.
- Nincs szükség harmadik fél Office telepítésére – bármilyen operációs rendszeren működik Microsoft Office, LibreOffice vagy más nehéz futtatókörnyezet nélkül.
- Megőrzi a formázást és az annotációkat – a kommentek, lábjegyzetek és a változtatások nyomon követése érintetlenül maradnak a konverzió során.
- Gyors, könnyű motor – egy tipikus 100 oldalas dokumentum kevesebb, mint 2 másodperc alatt renderelődik egy szabványos 4‑magos szerveren.
- Robusztus dokumentáció és aktív közösség – példákat, fórumokat és gyors támogatást találsz, ha elakadsz.
Mikor használjuk ezt a megközelítést
- Web‑alapú dokumentumnézők építése, amelyeknek lektori megjegyzéseket kell megjeleníteniük
- Együttműködő felülvizsgálati platformok létrehozása, ahol a visszajelzésnek láthatónak kell maradnia
- Örökölt szerződések konvertálása online megjelenítésre jogi portálokban
- E‑learning megoldások fejlesztése, amelyek az oktató kommentjeit ágyazzák be a tananyagra
Előfeltételek és környezet beállítása
Amire szükséged lesz
- Java Development Kit (JDK) 8+ – a futtatókörnyezet, amely az alkalmazásodat hajtja.
- Maven 3.6+ – a függőségek kezeléséhez és a projekt építéséhez.
- A választott IDE – IntelliJ IDEA, Eclipse vagy VS Code.
- Minta dokumentumok kommentekkel – DOCX, XLSX, PPTX fájlok, amelyek lektori megjegyzéseket tartalmaznak.
Fejlesztői környezet beállítása
1. lépés: Java telepítés ellenőrzése
Nyiss egy terminált és futtasd:
java -version
A verziószámnak 1.8 vagy annál magasabb értékkel kell kezdődnie. Ha nem, töltsd le a legújabb JDK‑t a hivatalos Oracle vagy OpenJDK weboldalról.
2. lépés: Maven telepítés ellenőrzése
Futtasd:
mvn -v
A Maven‑nek jelentenie kell a verzióját és a használt Java verziót. Telepíts Maven‑t az Apache weboldaláról, ha a parancs nem ismerhető.
3. lépés: Új Maven projekt létrehozása
Generálj egy váz projektet a következővel:
mvn archetype:generate -DgroupId=com.example.viewer -DartifactId=viewer-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Lépj be az újonnan létrehozott viewer-demo mappába, és készen állsz a GroupDocs Viewer hozzáadására.
GroupDocs.Viewer beállítása Java‑hoz
Függőség hozzáadása
Az első lépés minden GroupDocs Viewer Java oktatóban a könyvtár projektbe való beillesztése. Add hozzá ezt a konfigurációt a pom.xml fájlodhoz:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-viewer</artifactId>
<version>25.2</version>
</dependency>
Pro tipp: Mindig ellenőrizd a GroupDocs kiadási oldalt a legújabb verzióért. A könyvtár aktívan karbantartott, rendszeres frissítésekkel és hibajavításokkal.
Licencelési lehetőségek megértése
GroupDocs rugalmas licencelést kínál, amely különböző projektigényekhez illeszkedik:
- Ingyenes próba (Tökéletes a tanuláshoz): 30 napos értékelés teljes funkcióhozzáféréssel és értékelési vízjelekkel.
- Ideiglenes licenc (Fejlesztéshez): Kiterjesztett értékelés vízjelek nélkül; ideális proof‑of‑concept projektekhez. Kérvényezhető a GroupDocs Ideiglenes Licenc oldalán.
- Teljes licenc (Termelésre kész): Nincs korlátozás vagy vízjel, kereskedelmi használat engedélyezett. Elérhető a GroupDocs vásárlási oldalon.
Alap inicializációs minta
Itt van az alapvető minta, amelyet az egész oktató során használni fogsz:
try (Viewer viewer = new Viewer("input.docx")) {
// Rendering options will be set later
}
Miért működik ez a minta:
- Automatikus erőforrás-kezelés megakadályozza a memória szivárgásokat.
- Kivételkezelés elkapja a gyakori fájlhozzáférési problémákat.
- Tiszta, olvasható kód, amely nagy projektekben is könnyen karbantartható.
Alap implementáció: Dokumentumok renderelése kommentekkel
A folyamat megértése
Amikor egy dokumentumot renderelsz a GroupDocs Viewer‑rel, a könyvtár négy kulcsfontosságú lépést hajt végre:
- Dokumentumelemzés – beolvassa a bemeneti fájlt és belső reprezentációt épít.
- Komment kivonás – azonosít minden kommentet, lábjegyzetet és annotációt.
- HTML generálás – tiszta, szabványos HTML‑t hoz létre, amely tükrözi az eredeti elrendezést.
- Erőforráskezelés – képeket, CSS‑t és betűtípusokat csomagol be, akár beágyazottan, akár külső fájlként.
Lépésről‑lépésre implementáció
1. lépés: Fájl útvonalak beállítása
Rendezd el a bemeneti és kimeneti helyeket már a kezdetekkor, hogy elkerüld az útvonalakkal kapcsolatos hibákat:
Path inputPath = Paths.get("documents/sample-with-comments.docx");
Path outputDir = Paths.get("output/html");
Files.createDirectories(outputDir);
Miért ez a megközelítés:
- Modern Java NIO.2
PathAPI-t használ, amely megbízhatóbb, mint ajava.io.File. - Leíró változónevek segítik a hibakeresést.
- Az output mintában lévő
{0}helyőrző automatikusan a lap számával lesz helyettesítve.
2. lépés: HTML renderelési beállítások konfigurálása
Itt történik a varázslat. Megmondjuk a GroupDocs‑nek, pontosan hogyan szeretnénk a dokumentumot renderelni:
HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(outputDir);
viewOptions.setRenderComments(true); // Preserve every comment
viewOptions.setPageNumberPrefix("page_");
Kulcsfontosságú konfigurációs részletek:
forEmbeddedResources()beágyazza a CSS‑t, képeket és betűtípusokat közvetlenül a HTML‑be, így a kimenet hordozható.setRenderComments(true)az egyetlen sor, amely biztosítja, hogy a Word konvertálása HTML-re megtartja az összes lektori megjegyzést.- Az alternatív
forExternalResources()lehetővé teszi az eszközök külön tárolását, ha egy könnyebb HTML fájlt szeretnél.
3. lépés: Renderelés végrehajtása
Most mindent összehozzuk:
try (Viewer viewer = new Viewer(inputPath.toFile())) {
viewer.view(viewOptions);
}
A view hívás beolvassa a Word fájlt, kinyeri a kommenteket, HTML oldalakat generál, és a output/html könyvtárba írja őket. Minden oldal page_1.html, page_2.html stb. néven kerül mentésre.
Teljes működő példa
Az összes részlet összeállításával egyetlen, futtatható osztályt kapsz, amely Word dokumentumot konvertál HTML‑re, miközben a kommenteket érintetlenül hagyja. (A teljes forráskód elérhető a hivatalos GitHub tárolóban.)
Haladó konfiguráció és beállítások
Dinamikus kimeneti könyvtárak beállítása
Nagyobb alkalmazásoknál érdemes lehet a kimeneti könyvtárakat felhasználói azonosítók vagy időbélyegek alapján generálni:
String userId = "12345";
Path dynamicOutput = Paths.get("output", userId, LocalDate.now().toString());
Files.createDirectories(dynamicOutput);
HtmlViewOptions dynamicOptions = HtmlViewOptions.forEmbeddedResources(dynamicOutput);
Gyakori problémák és hibakeresés
1. probléma: „File Not Found” hibák
Győződj meg arról, hogy a bemeneti útvonal abszolút vagy a munkakönyvtárhoz relatív, és ellenőrizd a fájl jogosultságait. A Path objektumok használata segít elkerülni a gyakori karakterlánc‑összefűzési hibákat.
2. probléma: A kommentek nem jelennek meg a kimenetben
Ellenőrizd, hogy a setRenderComments(true) a viewer.view() előtt van meghívva. Továbbá győződj meg arról, hogy a forrásdokumentum valóban tartalmaz kommenteket; ezeket a viewer.getDocumentInfo().getComments() segítségével ellenőrizheted.
3. probléma: Memóriahiány hibák nagy dokumentumoknál
A GroupDocs Viewer adatfolyamot használ, de a rendkívül nagy fájlok (> 500 oldal) még mindig megterhelhetik a JVM heap‑et. Növeld a heap méretét -Xmx4g‑val, vagy csak a szükséges oldalakat rendereld.
4. probléma: Lassú renderelési teljesítmény
Renderelj konkrét oldaltartományokat a viewer.view(pageRange, viewOptions) használatával. A külső erőforrások (forExternalResources()) szintén csökkentik a HTML terhelés méretét, felgyorsítva a böngésző renderelését.
Valós példák implementációs minták
Minta 1: Webalkalmazás integráció
Integráld a renderelési logikát egy Spring Boot controllerbe, hogy igény szerint szolgálj ki HTML‑t:
@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);
}
}
Minta 2: Tömeges feldolgozás több dokumentummal
Ha egy egész mappát kell konvertálni Word fájlokból, iterálj a könyvtáron, és használd újra ugyanazt a HtmlViewOptions példányt, hogy minimalizáld az objektum létrehozás költségét.
Teljesítményoptimalizálás és legjobb gyakorlatok
Memóriakezelési tippek
- Mindig használj try‑with‑resources‑t a
Viewerpéldányokhoz. - Nagy dokumentumokat batch‑ekben dolgozz fel ahelyett, hogy egyszerre mindent a memóriába töltenél.
- Figyeld a JVM heap használatát olyan eszközökkel, mint a VisualVM, és szükség szerint állítsd be a
-Xmx‑et. - Alkalmazz megfelelő gyorsítótárazást a gyakran elérhető dokumentumoknál, hogy elkerüld az ismételt renderelést.
Erőforrás használati irányelvek
Kis alkalmazásokhoz (< 100 dokumentum/nap):
HtmlViewOptions options = HtmlViewOptions.forEmbeddedResources(Paths.get("output"));
options.setRenderComments(true);
Nagy forgalmú alkalmazásokhoz (1000+ dokumentum/nap):
HtmlViewOptions options = HtmlViewOptions.forExternalResources(Paths.get("output"));
options.setRenderComments(true);
options.setCacheEnabled(true);
Gyorsítótárazási stratégiák
Tárold a renderelt HTML‑t egy elosztott gyorsítótárban (pl. Redis), a dokumentum hash‑e alapján kulcsként. Amikor egy kérés érkezik, először ellenőrizd a gyorsítótárat; ha találat van, azonnal szolgáld ki a gyorsítótárból származó HTML‑t, megkerülve a renderelő motort.
Mikor használjuk a GroupDocs Viewer‑t alternatívákkal szemben
A GroupDocs Viewer ideális a következőkre
- Dokumentumkezelő rendszerek – sok fájltípus megjelenítése annotációkkal.
- Együttműködő felülvizsgálati platformok – a kommenteknek minden résztvevő számára láthatónak kell maradniuk.
- Oktatási eszközök – az oktatók megjegyzései a diák mellett jelennek meg.
- Jogi alkalmazások – a jogi megjegyzésekkel ellátott szerződések hiteles renderelése szükséges.
Alternatívákat érdemes fontolóra venni, ha
- Egyszerű PDF megjelenítés – a natív böngésző PDF megjelenítők elegendőek lehetnek.
- Alapvető kép konvertálás – az
ImageIOvagy hasonló könyvtárak könnyebbek. - Tiszta szövegkinyerés – az Apache POI vagy iText lehet megfelelőbb.
Gyakran ismételt kérdések
K: Renderelhetek dokumentumokat kommentek nélkül?
Igen—egyszerűen hagyd ki a setRenderComments(true) hívást, vagy állítsd false‑ra.
K: Mely fájlformátumok támogatják a komment renderelést?
A legtöbb fő formátum—beleértve a DOC/DOCX, XLS/XLSX, PPT/PPTX, PDF és sok más. Lásd a hivatalos dokumentációt a teljes listáért.
K: Testreszabhatom a HTML kimenet stílusát?
Természetesen. Használd a HtmlViewOptions.setEmbedResources(false)‑t külső CSS fájlok generálásához, majd a renderelés után add hozzá a saját stíluslapodat.
K: Hogyan kezelem a jelszóval védett dokumentumokat?
Adj meg egy LoadOptions példányt a jelszóval:
LoadOptions lehetővé teszi a dokumentum betöltési paramétereinek, például a jelszavak, megadását.
LoadOptions loadOptions = new LoadOptions("myPassword");
try (Viewer viewer = new Viewer(inputPath.toFile(), loadOptions)) {
viewer.view(viewOptions);
}
K: Lehetséges csak bizonyos oldalakat renderelni?
Igen—használd a túlterhelt view metódust, amely PageNumber gyűjteményt fogad:
PageNumber egy adott oldal indexet jelöl, amelyet az oldalak részhalmazának renderelésekor használsz.
viewer.view(new int[]{1, 3, 5}, viewOptions);
K: Miért lassú a renderelés nagy dokumentumoknál?
A nagy fájlok több feldolgozási időt igényelnek. Növeld a sebességet úgy, hogy csak a szükséges oldalakat rendereled, külső erőforrásokat használsz, növeled a JVM heap‑et, és engedélyezed az aszinkron feldolgozást.
K: Hogyan követhetem a renderelés előrehaladását?
Bár a GroupDocs Viewer nem rendelkezik beépített visszahívásokkal, időzítheted a műveletet a System.nanoTime()‑val a viewer.view() előtt és után, hogy naplózd a időtartamot.
K: Mi történik, ha a forrásdokumentum sérült?
A könyvtár ViewerException‑t dob. Tedd a hívást try‑catch blokkba, és naplózd a hibát a graceful degradation érdekében.
K: Használhatom a GroupDocs Viewer‑t kereskedelmi alkalmazásban?
Igen, de kereskedelmi licenc szükséges. Az ingyenes próba vízjeleket tartalmaz, amelyeket a termelési használat előtt el kell távolítani.
K: Vannak használati korlátok?
Maga a könyvtár nem szab korlátot, bár a licencszerződés meghatározhat használati korlátokat. Tekintsd át a szerződésed részleteit.
K: Átadhatok olyan alkalmazásokat, amelyek tartalmazzák a GroupDocs Viewer‑t?
Saját alkalmazásodat terjesztheted, de a GroupDocs könyvtár binárisait magukat nem terjesztheted. Ellenőrizd a licencfeltételeket a megfelelőség érdekében.
Következő lépések és haladó témák
Most már szilárd alapjaid vannak a Word konvertálására HTML-re a kommentek megőrzésével. Íme néhány irány, hogy mélyítsd a tudásodat:
- Vízjelezés – egyedi vízjelek hozzáadása a renderelt oldalakhoz márka vagy titoktartás céljából.
- Metaadat kinyerés – szerző, létrehozás dátuma és oldalszám lekérése a
viewer.getDocumentInfo()segítségével. - Egyedi nézők – speciális nézők építése PDF‑ekhez, táblázatokhoz vagy prezentációkhoz, amelyek másként rejtenek vagy emelik ki a kommenteket.
- Felhő tároló integráció – fájlok renderelése közvetlenül az AWS S3‑ról, Azure Blob‑ról vagy Google Drive‑ról anélkül, hogy helyileg letöltenéd őket.
Ajánlott tanulási útvonal
- Kísérletezz különböző fájltípusokkal – próbálj ki Excel, PowerPoint és PDF fájlokat, hogy lásd, hogyan kezelik a kommenteket a különböző formátumok.
- Építs egy egyszerű webes nézőt – hozz létre egy minimális HTML oldalt, amely az
<iframe>vagy AJAX segítségével tölti be a generált HTML‑t. - Fedezd fel a GroupDocs ökoszisztémát – nézd meg a GroupDocs Annotation, Comparison és Signature termékeket a teljes dokumentumfolyamatokhoz.
- Csatlakozz a közösséghez – vegyél részt a GroupDocs Fórumon tippekért, mintaprojektekért és támogatásért.
Segítség és támogatás
Hivatalos erőforrások
Közösségi erőforrások
- Stack Overflow (címke:
groupdocs-viewer) - Reddit programozási közösségek
- Java fejlesztői Discord szerverek
Utolsó frissítés: 2026-05-21
Tesztelve a következővel: GroupDocs.Viewer 25.2 for Java
Szerző: 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());
}