Porovnat dokumenty
Porovnání dokumentů je proces, který identifikuje změny mezi dvěma dokumenty a obsahuje změny jako revize. Tento proces porovnává všechny dva dokumenty, včetně verzí jednoho konkrétního dokumentu, pak se změny mezi oběma dokumenty zobrazí jako revize v prvním dokumentu.
Porovnávací metody je dosaženo porovnáním slov na úrovni znaku nebo na úrovni slova. Pokud slovo obsahuje změnu alespoň jednoho znaku, ve výsledku se rozdíl zobrazí jako změna celého slova, nikoli znaku. Tento proces srovnání je obvyklým úkolem v právních a finančních odvětvích.
Místo manuálního vyhledávání rozdílů mezi dokumenty nebo mezi různými verzemi můžete použít Aspose.Words pro porovnání dokumentů a získání změn obsahu ve formátování, hlavičky/noha, tabulkách a dalších.
Tento článek vysvětluje, jak porovnat dokumenty a jak určit pokročilé srovnávací vlastnosti.
Zkuste online
Můžete porovnat dva dokumenty on-line pomocí Správa dokumentů online Nástroj.
Všimněte si, že metoda srovnání, popsaná níže, se používá v tomto nástroji k zajištění stejných výsledků. Takže dostanete stejné výsledky i pomocí nástroje online srovnání nebo pomocí metody srovnání v Aspose.Words.
Omezení a podporované formáty souborů
Porovnání dokumentů je velmi složité. Existují různé části kombinace obsahu, které je třeba analyzovat k rozpoznání všech rozdílů. Důvodem této složitosti je, že Aspose.Words Cílem je získat stejné výsledky srovnání jako Microsoft Word srovnávací algoritmus.
Obecné omezení pro dva dokumenty jsou porovnávány je, že nesmí mít revize před voláním metody srovnání, protože toto omezení existuje v Microsoft Word.
Porovnat dva dokumenty
Když porovnáte dokumenty, objeví se rozdíly ve druhém dokumentu od prvního jako revize s prvním dokumentem. Při změně dokumentu bude mít každá editace svou vlastní revizi po spuštění metody porovnání.
Aspose.Words umožňuje identifikovat rozdíly v dokumentech pomocí Compare metoda Microsoft Word Porovnat funkci dokumentu. Umožňuje vám kontrolovat dokumenty nebo verze dokumentů pro nalezení rozdílů a změn, včetně formátování úprav, jako jsou změny písma, změny odstupu, přidání slov a odstavců.
V důsledku srovnání mohou být dokumenty určeny jako rovnocenné nebo rovnocenné. Pojem “rovné dokumenty” znamená, že metoda srovnání není schopna představovat změny jako revize. To znamená, že text i formátování textu jsou stejné. Ale mezi dokumenty mohou být i jiné rozdíly. Například, Microsoft Word podporuje pouze formát revize pro styly, a nemůžete reprezentovat styl vložení / odstranění. Takže dokumenty mohou mít jiný soubor stylů a Compare metoda stále nevytváří žádné revize.
Následující příklad kódu ukazuje, jak ověřit, zda jsou dva dokumenty stejné nebo ne:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document docA = new Document(dataDir + "DocumentA.doc"); | |
Document docB = new Document(dataDir + "DocumentB.doc"); | |
docA.compare(docB, "user", new Date()); | |
if (docA.getRevisions().getCount() == 0) | |
System.out.println("Documents are equal"); | |
else | |
System.out.println("Documents are not equal"); |
Následující příklad kódu ukazuje, jak jednoduše použít Compare
metoda ke dvěma dokumentům:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The source document doc1 | |
Document doc1 = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc1); | |
builder.writeln("This is the original document."); | |
// The target document doc2 | |
Document doc2 = new Document(); | |
builder = new DocumentBuilder(doc2); | |
builder.writeln("This is the edited document."); | |
// If either document has a revision, an exception will be thrown | |
if (doc1.getRevisions().getCount() == 0 && doc2.getRevisions().getCount() == 0) | |
doc1.compare(doc2, "authorName", new Date()); | |
// If doc1 and doc2 are different, doc1 now has some revisions after the comparison, which can now be viewed and processed | |
if (doc1.getRevisions().getCount() == 2) | |
System.out.println("Documents are equal"); | |
for (Revision r : doc1.getRevisions()) | |
{ | |
System.out.println("Revision type: " + r.getRevisionType() + ", on a node of type " + r.getParentNode().getNodeType() + ""); | |
System.out.println("\tChanged text: " + r.getParentNode().getText() + ""); | |
} | |
// All the revisions in doc1 are differences between doc1 and doc2, so accepting them on doc1 transforms doc1 into doc2 | |
doc1.getRevisions().acceptAll(); | |
// doc1, when saved, now resembles doc2 | |
doc1.save(dataDir + "Document.Compare.docx"); | |
doc1 = new Document(dataDir + "Document.Compare.docx"); | |
if (doc1.getRevisions().getCount() == 0) | |
System.out.println("Documents are equal"); | |
if (doc2.getText().trim() == doc1.getText().trim()) | |
System.out.println("Documents are equal"); |
Upřesnit možnosti pokročilého srovnání
Existuje mnoho různých vlastností CompareOptions třída, kterou můžete použít, pokud chcete porovnat dokumenty.
Například, Aspose.Words umožňuje ignorovat změny provedené během porovnání některých typů objektů v rámci původního dokumentu. Pro typ objektu si můžete vybrat vhodnou vlastnost, například IgnoreHeadersAndFooters, IgnoreFormatting, IgnoreComments, a jiní tím, že je postaví na “true”.
Kromě toho Aspose.Words poskytuje Granularity vlastnost, se kterou můžete určit, zda sledovat změny podle charakteru nebo slov.
Další společnou vlastností je volba, ve které dokument ukázat změny srovnání. Například, v okně “Porovnat dokumenty dialog” Microsoft Word má možnost Zobrazit změny v?? Aspose.Words poskytuje Target majetek, který slouží tomuto účelu.
Následující příklad kódu ukazuje, jak nastavit pokročilé porovnávací vlastnosti:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// Create the original document | |
Document docOriginal = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(docOriginal); | |
// Insert paragraph text with an endnote | |
builder.writeln("Hello world! This is the first paragraph."); | |
builder.insertFootnote(FootnoteType.ENDNOTE, "Original endnote text."); | |
// Insert a table | |
builder.startTable(); | |
builder.insertCell(); | |
builder.write("Original cell 1 text"); | |
builder.insertCell(); | |
builder.write("Original cell 2 text"); | |
builder.endTable(); | |
// Insert a textbox | |
Shape textBox = builder.insertShape(ShapeType.TEXT_BOX, 150, 20); | |
builder.moveTo(textBox.getFirstParagraph()); | |
builder.write("Original textbox contents"); | |
// Insert a DATE field | |
builder.moveTo(docOriginal.getFirstSection().getBody().appendParagraph("")); | |
builder.insertField(" DATE "); | |
// Insert a comment | |
Comment newComment = new Comment(docOriginal, "John Doe", "J.D.", new Date()); | |
newComment.setText("Original comment."); | |
builder.getCurrentParagraph().appendChild(newComment); | |
// Insert a header | |
builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY); | |
builder.writeln("Original header contents."); | |
// Create a clone of our document, which we will edit and later compare to the original | |
Document docEdited = (Document)docOriginal.deepClone(true); | |
Paragraph firstParagraph = docEdited.getFirstSection().getBody().getFirstParagraph(); | |
// Change the formatting of the first paragraph, change casing of original characters and add text | |
firstParagraph.getRuns().get(0).setText("hello world! this is the first paragraph, after editing."); | |
firstParagraph.getParagraphFormat().setStyle(docEdited.getStyles().get(StyleIdentifier.HEADING_1)); | |
// Edit the footnote | |
Footnote footnote = (Footnote)docEdited.getChild(NodeType.FOOTNOTE, 0, true); | |
footnote.getFirstParagraph().getRuns().get(1).setText("Edited endnote text."); | |
// Edit the table | |
Table table = (Table)docEdited.getChild(NodeType.TABLE, 0, true); | |
table.getFirstRow().getCells().get(1).getFirstParagraph().getRuns().get(0).setText("Edited Cell 2 contents"); | |
// Edit the textbox | |
textBox = (Shape)docEdited.getChild(NodeType.SHAPE, 0, true); | |
textBox.getFirstParagraph().getRuns().get(0).setText("Edited textbox contents"); | |
// Edit the DATE field | |
FieldDate fieldDate = (FieldDate)docEdited.getRange().getFields().get(0); | |
fieldDate.setUseLunarCalendar(true); | |
// Edit the comment | |
Comment comment = (Comment)docEdited.getChild(NodeType.COMMENT, 0, true); | |
comment.getFirstParagraph().getRuns().get(0).setText("Edited comment."); | |
// Edit the header | |
docEdited.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.HEADER_PRIMARY).getFirstParagraph().getRuns().get(0).setText("Edited header contents."); | |
// Apply different comparing options | |
CompareOptions compareOptions = new CompareOptions(); | |
compareOptions.setIgnoreFormatting(false); | |
compareOptions.setIgnoreCaseChanges(false); | |
compareOptions.setIgnoreComments(false); | |
compareOptions.setIgnoreTables(false); | |
compareOptions.setIgnoreFields(false); | |
compareOptions.setIgnoreFootnotes(false); | |
compareOptions.setIgnoreTextboxes(false); | |
compareOptions.setIgnoreHeadersAndFooters(false); | |
compareOptions.setTarget(ComparisonTargetType.NEW); | |
// compare both documents | |
docOriginal.compare(docEdited, "John Doe", new Date(), compareOptions); | |
docOriginal.save(dataDir + "Document.CompareOptions.docx"); |