compare pdf java – Πώς να Συγκρίνετε Αρχεία PDF σε Java Προγραμματιστικά
Αν είστε προγραμματιστής Java που χρειάζεται να compare pdf java αρχεία γρήγορα και ακριβώς, βρίσκεστε στο σωστό μέρος. Είτε δημιουργείτε σύστημα διαχείρισης περιεχομένου, προσθέτετε έλεγχο εκδόσεων σε νομικά συμβόλαια, είτε αυτοματοποιείτε QA για παραγόμενες αναφορές, οι χειροκίνητοι έλεγχοι πλευρά-προς-πλευρά είναι επιρρεπείς σε σφάλματα και χρονοβόροι. Το GroupDocs.Comparison for Java σας παρέχει ένα ενιαίο, αξιόπιστο API που εντοπίζει προσθήκες, διαγραφές, αλλαγές μορφοποίησης και ακόμη μετακινημένες παραγράφους — όλα χωρίς να χρειάζεται να γράψετε πολύπλοκη λογική diff μόνοι σας.
Σε αυτόν τον οδηγό θα περάσουμε βήμα-βήμα από κάθε απαραίτητο βήμα για τη ρύθμιση της βιβλιοθήκης, την εκτέλεση συγκρίσεων σε αρχεία, ροές ή αποθήκευση στο cloud, την εξαγωγή συντεταγμένων αλλαγών και τη διαχείριση σεναρίων με μεγάλα έγγραφα. Θα λάβετε επίσης πρακτικές συμβουλές για βελτιστοποίηση απόδοσης, κοινά προβλήματα και παραδείγματα πραγματικών περιπτώσεων χρήσης, ώστε να παραδώσετε μια αξιόπιστη λύση πιο γρήγορα.
Γρήγορες Απαντήσεις
- Ποια βιβλιοθήκη μου επιτρέπει να συγκρίνω αρχεία PDF σε Java; GroupDocs.Comparison for Java.
- Χρειάζομαι άδεια; Μια δωρεάν δοκιμή λειτουργεί για εκμάθηση· απαιτείται πλήρης άδεια για παραγωγή.
- Ποια έκδοση Java απαιτείται; Ελάχιστο Java 8, συνιστάται Java 11+.
- Μπορώ να συγκρίνω έγγραφα χωρίς αποθήκευση στο δίσκο; Ναι – χρησιμοποιήστε υπερφορτώσεις βασισμένες σε
InputStreamγια να διατηρήσετε τα πάντα στη μνήμη. - Πώς λαμβάνω τις συντεταγμένες αλλαγών; Καλέστε
setCalculateCoordinates(true)στοCompareOptionsπριν καλέσετε τοcompare.
Πώς να συγκρίνετε αρχεία PDF σε Java (compare pdf java);
Φορτώστε τα δύο PDF με μια παρουσία Comparer, ρυθμίστε το CompareOptions όπως απαιτείται και καλέστε compare. Η μέθοδος επιστρέφει έναν πίνακα ChangeInfo[] που σας λέει ακριβώς τι άλλαξε, πού και πώς. Ολόκληρη αυτή η ροή εργασίας μπορεί να γραφτεί σε λιγότερο από δέκα γραμμές Java, και η βιβλιοθήκη φροντίζει για όλες τις ιδιαιτερότητες του μορφότυπου για εσάς.
Τι είναι το “compare pdf files java”
Η φράση compare pdf files java αναφέρεται στη προγραμματική διαδικασία ανάλυσης δύο εγγράφων PDF (ή υποστηριζόμενων) σε μια εφαρμογή Java για την παραγωγή ενός λεπτομερούς diff. Το diff περιλαμβάνει κείμενο, εικόνες, πίνακες που προστέθηκαν, διαγράφηκαν ή τροποποιήθηκαν, καθώς και μετακινημένα τμήματα, συσκευασμένα ως δομημένη λίστα που μπορεί να αποδοθεί, να καταγραφεί ή να σταλεί σε downstream υπηρεσίες.
Γιατί να χρησιμοποιήσετε το GroupDocs.Comparison for Java;
Το GroupDocs.Comparison υποστηρίζει πάνω από 60 μορφές εισόδου και εξόδου, συμπεριλαμβανομένων PDF, DOCX, XLSX, PPTX, HTML και εικόνων, διατηρώντας το layout αμετάβλητο. Μπορεί να επεξεργαστεί αρχεία με εκατοντάδες σελίδες χωρίς να φορτώνει ολόκληρο το έγγραφο στη μνήμη, παρέχοντας αποτελέσματα σε λιγότερο από ένα δευτερόλεπτο για τυπικά PDF 50 σελίδων. Οι ενσωματωμένες επιλογές σας επιτρέπουν να αγνοήσετε αλλαγές στυλ, να εντοπίσετε μετακινημένο περιεχόμενο και να υπολογίσετε τις συντεταγμένες σελίδας για κάθε αλλαγή.
Πώς να συγκρίνετε αρχεία PDF προγραμματιστικά σε Java
Παρακάτω είναι η πλήρης ροή που θα ακολουθήσετε στο έργο σας. Κάθε βήμα εξηγείται πριν από το αντίστοιχο placeholder, ώστε να γνωρίζετε πάντα γιατί υπάρχει ο κώδικας.
Προαπαιτούμενα και Τι Θα Χρειαστείτε
- Java Development Kit (JDK) – έκδοση 8 ή υψηλότερη (Java 11+ προσφέρει καλύτερη διαχείριση μνήμης και υποστήριξη μονάδων).
- IDE – IntelliJ IDEA, Eclipse ή οποιονδήποτε επεξεργαστή που κατανοεί το Maven.
- Maven – για διαχείριση εξαρτήσεων· το tutorial χρησιμοποιεί το τυπικό
pom.xmlτου Maven. - Δειγματικά έγγραφα – δύο PDF (ή οποιεσδήποτε υποστηριζόμενες μορφές) με μικρές διαφορές για δοκιμή.
Ρύθμιση του GroupDocs.Comparison for Java
Διαμόρφωση Maven
Πρώτα, προσθέστε το αποθετήριο GroupDocs και την εξάρτηση στο pom.xml σας. Διατηρήστε το μπλοκ ακριβώς όπως φαίνεται:
<repositories>
<repository>
<id>repository.groupdocs.com</id>
<name>GroupDocs Repository</name>
<url>https://releases.groupdocs.com/comparison/java/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>25.2</version>
</dependency>
</dependencies>
Pro Tip: Πάντα βεβαιωθείτε ότι έχετε την πιο πρόσφατη σταθερή έκδοση στη σελίδα λήψης του GroupDocs. Οι νέες εκδόσεις συχνά προσθέτουν υποστήριξη για επιπλέον μορφές και βελτιώσεις απόδοσης.
Συνηθισμένα Προβλήματα Ρύθμισης και Λύσεις
- “Repository not found” – βεβαιωθείτε ότι το στοιχείο
<repositories>εμφανίζεται πριν το<dependencies>. - “ClassNotFoundException” – εκτελέστε μια ανανέωση Maven (π.χ., Maven → Reload project στο IntelliJ) για να τραβήξετε τα JAR στο classpath σας.
Επεξήγηση Επιλογών Άδειας
- Free Trial – ιδανικό για εκμάθηση και μικρές επιδείξεις.
- Temporary License – ζητήστε κλειδί 30 ημερών για εκτεταμένη αξιολόγηση.
- Full License – απαιτείται για παραγωγή, απεριόριστο μέγεθος αρχείου και προτεραιότητα υποστήριξης.
Βασική Δομή Έργου
your-project/
├── src/main/java/
│ └── com/yourcompany/comparison/
│ └── DocumentComparison.java
├── src/test/resources/
│ ├── source.docx
│ └── target.docx
└── pom.xml
Κύρια Υλοποίηση: Οδηγός Βήμα‑βήμα
Κατανόηση της Κλάσης Comparer
Η κλάση Comparer είναι το κεντρικό σημείο εισόδου για όλες τις λειτουργίες σύγκρισης στο GroupDocs.Comparison.
import com.groupdocs.comparison.Comparer;
try (Comparer comparer = new Comparer("sourceFilePath")) {
comparer.add("targetFilePath");
// Your comparison logic goes here
}
Γιατί να χρησιμοποιήσετε try‑with‑resources; Επειδή το Comparer υλοποιεί το AutoCloseable, το πρότυπο εγγυάται ότι οι εγγενείς πόροι (προσωρινές μνήμες, προσωρινά αρχεία) απελευθερώνονται αυτόματα, αποτρέποντας διαρροές μνήμης κατά την επεξεργασία μεγάλων PDF.
Χαρακτηριστικό 1: Λήψη Συντεταγμένων Αλλαγών
Αυτή η δυνατότητα επιστρέφει τις ακριβείς συντεταγμένες X/Y σε επίπεδο σελίδας για κάθε εντοπισμένη αλλαγή, επιτρέποντάς σας να δημιουργήσετε οπτικούς προβολείς diff.
Πότε να το Χρησιμοποιήσετε
- Δημιουργία web‑based προγράμματος ανασκόπησης εγγράφων που επισημαίνει τις επεξεργασίες.
- Δημιουργία αρχείων ελέγχου που εντοπίζουν τη θέση κάθε τροποποίησης.
- Ενσωμάτωση με προβολείς PDF που υποστηρίζουν επικάλυψη σχολίων.
Implementation Details
import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.result.ChangeInfo;
String sourceFilePath = "path/to/source.docx";
String targetFilePath = "path/to/target.docx";
try (Comparer comparer = new Comparer(sourceFilePath)) {
// Add the target document for comparison.
comparer.add(targetFilePath);
CompareOptions διαμορφώνει τη συμπεριφορά της σύγκρισης, όπως η ενεργοποίηση του υπολογισμού συντεταγμένων.
Ενεργοποίηση υπολογισμού συντεταγμένων:
import com.groupdocs.comparison.options.CompareOptions;
final Path resultPath = comparer.compare(
new CompareOptions.Builder()
.setCalculateCoordinates(true)
.build());
Εξαγωγή και εργασία με τις πληροφορίες αλλαγής:
ChangeInfo[] changes = comparer.getChanges();
for (ChangeInfo change : changes) {
System.out.printf("Change Type: %s, X: %f, Y: %f, Text: %s%n",
change.getType(), change.getBox().getX(), change.getBox().getY(), change.getText());
}
Σημείωση Απόδοσης: Η ενεργοποίηση των συντεταγμένων προσθέτει περίπου 15‑20 % επιπλέον φόρτο· απενεργοποιήστε το για μαζικές εργασίες diff όπου δεν χρειάζονται δεδομένα θέσης.
Χαρακτηριστικό 2: Λήψη Αλλαγών από Διαδρομές Αρχείων
Αν χρειάζεστε απλώς μια λίστα με τις αλλαγές, αυτή η μέθοδος επιστρέφει ένα ελαφρύ ChangeInfo[] χωρίς συντεταγμένες.
ChangeInfo αντιπροσωπεύει μια ενιαία εντοπισμένη αλλαγή, συμπεριλαμβανομένου του τύπου και της θέσης της.
Ιδανικό Για
- Δημιουργία περιλήψεων αλλαγών σε απλό κείμενο.
- Εκτέλεση νυχτερινών εργασιών batch που συγκρίνουν χιλιάδες ζεύγη εγγράφων.
- Γρήγορο έλεγχο αν δύο εκδόσεις είναι ταυτόσημες.
Implementation
try (Comparer comparer = new Comparer(sourceFilePath)) {
comparer.add(targetFilePath);
Εκτελέστε τη σύγκριση χωρίς επιπλέον επιλογές:
final Path resultPath = comparer.compare();
ChangeInfo[] changes = comparer.getChanges();
System.out.println("\nCount of changes: " + changes.length);
}
Καλύτερη Πρακτική: Πάντα ελέγχετε το changes.length. Ένας κενός πίνακας σημαίνει ότι τα δύο έγγραφα είναι ταυτόσημα, επιτρέποντάς σας να παραλείψετε την επεξεργασία downstream.
Χαρακτηριστικό 3: Εργασία με Ροές
Οι ροές σας επιτρέπουν να συγκρίνετε αρχεία που βρίσκονται στη μνήμη, σε κοινόχρηστο δίκτυο ή σε αποθήκευση cloud χωρίς να αγγίζετε το τοπικό σύστημα αρχείων.
Συνηθισμένες Χρήσεις
- Αποδοχή μεταφορτώσεων αρχείων σε ελεγκτή Spring Boot και σύγκριση άμεσα.
- Λήψη PDF από AWS S3, Azure Blob ή Google Cloud Storage απευθείας σε
ByteArrayInputStream. - Σύγκριση εγγράφων αποθηκευμένων σε στήλη BLOB βάσης δεδομένων.
Stream Implementation
import java.io.FileInputStream;
import java.io.InputStream;
try (InputStream sourceStream = new FileInputStream(sourceFilePath);
InputStream targetStream = new FileInputStream(targetFilePath);
Comparer comparer = new Comparer(sourceStream)) {
comparer.add(targetStream);
Συνεχίστε με την ίδια κλήση σύγκρισης:
final Path resultPath = comparer.compare();
ChangeInfo[] changes = comparer.getChanges();
System.out.println("\nCount of changes: " + Arrays.toString(changes).length);
}
Συμβουλή Μνήμης: Το μπλοκ try‑with‑resources εξασφαλίζει ότι οι ροές κλείνουν αυτόματα, κάτι που είναι κρίσιμο όταν διαχειρίζεστε πολλά μεγάλα PDF σε υπηρεσία πολλαπλών νημάτων.
Χαρακτηριστικό 4: Εξαγωγή Στόχου Κειμένου
Μερικές φορές χρειάζεστε το ακριβές απόσπασμα κειμένου που προστέθηκε ή αφαιρέθηκε, για ειδοποιήσεις email ή καταχωρήσεις αλλαγών.
Πρακτικές Εφαρμογές
- Αποστολή ειδοποιητικού email που περιλαμβάνει την προστιθέμενη παράγραφο.
- Συμπλήρωση πλέγματος UI που εμφανίζει κείμενο “παλιό vs. νέο” πλάι-πλάι.
- Έλεγχος κανονιστικών εγγράφων για συγκεκριμένες αλλαγές φράσεων.
Implementation
try (Comparer comparer = new Comparer(sourceFilePath)) {
comparer.add(targetFilePath);
final Path resultPath = comparer.compare();
ChangeInfo[] changes = comparer.getChanges();
for (ChangeInfo change : changes) {
String text = change.getText();
System.out.println(text);
}
}
Συμβουλή Φιλτραρίσματος: Χρησιμοποιήστε ChangeInfo.getChangeType() για να εστιάσετε μόνο σε προσθήκες (INSERT) ή διαγραφές (DELETE).
Συνηθισμένα Πιθανά Σφάλματα και Πώς να τα Αποφύγετε
1. Προβλήματα Διαδρομής Αρχείου
Πρόβλημα: “File not found” παρόλο που το αρχείο υπάρχει.
Λύση: Χρησιμοποιήστε απόλυτες διαδρομές κατά την ανάπτυξη ή επαληθεύστε τον τρέχοντα φάκελο του IDE. Στα Windows, διαφύγετε τις ανάστροφες κάθετες (\\) ή χρησιμοποιήστε κάθετες (/).
// Good
String path = "C:/Users/yourname/documents/test.docx";
// Or
String path = "C:\\Users\\yourname\\documents\\test.docx";
2. Διαρροές Μνήμης με Μεγάλα Αρχεία
Πρόβλημα: OutOfMemoryError κατά τη σύγκριση PDF 200 σελίδων.
Λύση: Πάντα τυλίξτε το Comparer σε μπλοκ try‑with‑resources και προτιμήστε τις υπερφορτώσεις βασισμένες σε ροές, που διατηρούν μόνο τις απαραίτητες σελίδες στη μνήμη.
3. Μη Υποστηριζόμενες Μορφές Αρχείων
Πρόβλημα: Εξαιρέσεις για ορισμένες παλαιές μορφές.
Λύση: Ελέγξτε την επίσημη λίστα supported‑formats (το GroupDocs υποστηρίζει 60+ μορφές). Αν μια μορφή δεν εμφανίζεται, μετατρέψτε την σε PDF ή DOCX πριν τη σύγκριση.
4. Προβλήματα Απόδοσης
Πρόβλημα: Οι συγκρίσεις διαρκούν περισσότερο από το αναμενόμενο.
Λύση:
- Απενεργοποιήστε τον υπολογισμό συντεταγμένων εκτός αν το χρειάζεστε.
- Χρησιμοποιήστε
CompareOptions.setDetectMovedBlocks(true)μόνο όταν χρειάζεστε εντοπισμό μετακινημένων τμημάτων. - Παράλληλη εκτέλεση ανεξάρτητων εργασιών σύγκρισης με thread pool.
Συμβουλές Βελτιστοποίησης Απόδοσης
Επιλέξτε τις Κατάλληλες Επιλογές
CompareOptions options = new CompareOptions.Builder()
.setCalculateCoordinates(false) // Only enable when needed
.setDetectStyleChanges(false) // Skip formatting if you only care about content
.build();
Διαχείριση Μνήμης
- Επεξεργασία εγγράφων σε παρτίδες αντί για φόρτωση όλων ταυτόχρονα.
- Χρησιμοποιήστε το streaming API για αρχεία μεγαλύτερα από 50 MB.
- Εξαρτηθείτε από το try‑with‑resources για εγγυημένο καθαρισμό.
Στρατηγικές Caching
// Pseudo-code for caching concept
String cacheKey = generateCacheKey(sourceFile, targetFile);
if (cache.contains(cacheKey)) {
return cache.get(cacheKey);
}
Πραγματικά Σενάρια και Λύσεις
Σενάριο 1: Σύστημα Διαχείρισης Περιεχομένου
public class ArticleVersionComparison {
public List<ChangeInfo> compareVersions(String oldVersion, String newVersion) {
try (Comparer comparer = new Comparer(oldVersion)) {
comparer.add(newVersion);
final Path result = comparer.compare();
return Arrays.asList(comparer.getChanges());
} catch (Exception e) {
log.error("Failed to compare article versions", e);
return Collections.emptyList();
}
}
}
Σενάριο 2: Αυτοματοποιημένη Διασφάλιση Ποιότητας
public boolean validateReportAgainstTemplate(InputStream report, InputStream template) {
try (Comparer comparer = new Comparer(template)) {
comparer.add(report);
comparer.compare();
ChangeInfo[] changes = comparer.getChanges();
// Only allow certain types of changes
return Arrays.stream(changes)
.allMatch(change -> isAllowedChange(change));
} catch (Exception e) {
return false;
}
}
Σενάριο 3: Επεξεργασία Εγγράφων σε Παρτίδες
public void processBatchComparison(List<DocumentPair> documents) {
documents.parallelStream().forEach(pair -> {
try (Comparer comparer = new Comparer(pair.getSource())) {
comparer.add(pair.getTarget());
Path result = comparer.compare();
// Process results...
} catch (Exception e) {
log.error("Failed to process document pair: " + pair, e);
}
});
}
Προηγμένες Λειτουργίες και Καλές Πρακτικές
Εργασία με Διαφορετικές Μορφές Αρχείων
public boolean isFormatSupported(String filePath) {
String extension = getFileExtension(filePath);
List<String> supportedFormats = Arrays.asList(
".docx", ".pdf", ".txt", ".rtf", ".odt", // Add more as needed
);
return supportedFormats.contains(extension.toLowerCase());
}
Διαχείριση Μεγάλων Εγγράφων
CompareOptions largeDocOptions = new CompareOptions.Builder()
.setCalculateCoordinates(false) // Saves memory
.setDetectStyleChanges(false) // Focuses on content only
.setWordsLimit(1000) // Limits processing scope
.build();
Πρότυπα Διαχείρισης Σφαλμάτων
public ComparisonResult compareDocuments(String source, String target) {
try (Comparer comparer = new Comparer(source)) {
comparer.add(target);
Path result = comparer.compare();
return ComparisonResult.success(comparer.getChanges());
} catch (SecurityException e) {
log.error("Access denied when comparing documents", e);
return ComparisonResult.failure("Access denied");
} catch (IOException e) {
log.error("IO error during document comparison", e);
return ComparisonResult.failure("File access error");
} catch (Exception e) {
log.error("Unexpected error during comparison", e);
return ComparisonResult.failure("Comparison failed");
}
}
Συχνές Ερωτήσεις
Q: Ποια είναι η ελάχιστη έκδοση Java που απαιτείται για το GroupDocs.Comparison;
A: Η ελάχιστη υποστηριζόμενη έκδοση είναι Java 8· η Java 11+ συνιστάται για βελτιωμένη διαχείριση μνήμης και υποστήριξη μονάδων.
Q: Μπορώ να συγκρίνω περισσότερα από δύο έγγραφα ταυτόχρονα;
A: Το GroupDocs.Comparison συγκρίνει ένα ζεύγος τη φορά. Για έκδοση πολλαπλών εγγράφων, επαναλάβετε τη λίστα εγγράφων και συγκρίνετε κάθε διαδοχικό ζεύγος, αποθηκεύοντας το αποτέλεσμα ChangeInfo[] για μεταγενέστερη συγκέντρωση.
try (Comparer comparer = new Comparer(sourceDocument)) {
comparer.add(targetDocument1);
comparer.add(targetDocument2);
comparer.add(targetDocument3);
// Now compare against all targets
}
Q: Πώς πρέπει να διαχειριστώ πολύ μεγάλα έγγραφα (100 MB+);
A:
- Απενεργοποιήστε τον υπολογισμό συντεταγμένων εκτός αν χρειάζεστε ακριβείς θέσεις.
- Προτιμήστε το API βασισμένο σε ροές για να αποφύγετε τη φόρτωση ολόκληρου του αρχείου στη RAM.
- Χωρίστε την επεξεργασία σε περιοχές σελίδων αν χρειάζεστε αλλαγές μόνο σε συγκεκριμένα τμήματα.
- Παρακολουθήστε τη χρήση heap του JVM και ρυθμίστε το
-Xmxανάλογα.
Q: Υπάρχει τρόπος να επισημάνω οπτικά τις αλλαγές στην έξοδο;
A: Ναι. Αφού λάβετε το ChangeInfo[], μπορείτε να δημιουργήσετε ένα νέο PDF χρησιμοποιώντας το GroupDocs.Watermark ή οποιαδήποτε βιβλιοθήκη PDF, σχεδιάζοντας ορθογώνια στις επιστρεφόμενες συντεταγμένες. Αυτό παράγει μια έκδοση “red‑line” που οι τελικοί χρήστες μπορούν να εξετάσουν σε οποιονδήποτε προβολέα PDF.
CompareOptions options = new CompareOptions.Builder()
.setShowInsertedContent(true)
.setShowDeletedContent(true)
.setGenerateOutputDocument(true)
.build();
Q: Πώς να διαχειριστώ έγγραφα με κωδικό πρόσβασης;
A: Περνάτε τον κωδικό στο κατασκευαστή Comparer ή το ορίζετε στο αντικείμενο LoadOptions πριν καλέσετε το compare. Η βιβλιοθήκη θα αποκρυπτογραφήσει το έγγραφο στη μνήμη, ώστε ο κωδικός να μην αγγίζει ποτέ το σύστημα αρχείων.
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
try (Comparer comparer = new Comparer(protectedDocument, loadOptions)) {
// Comparison logic here
}
Q: Μπορώ να προσαρμόσω τον τρόπο ανίχνευσης αλλαγών;
A: Απόλυτα. Το CompareOptions προσφέρει σημαίες όπως setIgnoreFormatting(true), setDetectMovedBlocks(true) και setGranularity(Granularity.WORD). Προσαρμόστε τις ώστε να ταιριάζουν με τους επιχειρηματικούς σας κανόνες—π.χ., αγνοήστε αλλαγές γραμματοσειράς ενώ εξακολουθείτε να εντοπίζετε μετακινημένες παραγράφους.
CompareOptions options = new CompareOptions.Builder()
.setDetectStyleChanges(false) // Ignore formatting changes
.setSensitivityOfComparison(100) // Adjust sensitivity (0‑100)
.build();
Q: Ποιος είναι ο καλύτερος τρόπος ενσωμάτωσης αυτού με το Spring Boot;
A: Δημιουργήστε ένα bean @Service που εισάγει τη διαδρομή της άδειας, στη συνέχεια εκθέστε ένα endpoint @RestController που δέχεται μεταφορτώσεις MultipartFile. Μέσα στον ελεγκτή, μετατρέψτε το MultipartFile σε InputStream και καλέστε τη μέθοδο σύγκρισης βασισμένη σε ροή. Επιστρέψτε το ChangeInfo[] ως JSON για την απόδοση στο front‑end.
@Service
public class DocumentComparisonService {
public ComparisonResult compare(MultipartFile source, MultipartFile target) {
// Implementation using the techniques from this guide
}
}
Πρόσθετοι Πόροι
Τελευταία Ενημέρωση: 2026-06-15
Δοκιμή Με: GroupDocs.Comparison 25.2 for Java
Συγγραφέας: GroupDocs
for (ChangeInfo change : changes) {
if (change.getType() == ComparisonAction.INSERT) {
System.out.println("Added: " + change.getText());
}
}