我想通过代码实现:
1、查询指定word的所有修订记录信息。
2、将一些修订记录记录到指定word文件里面。
请问,有什么办法实现吗
我想通过代码实现:
1、查询指定word的所有修订记录信息。
2、将一些修订记录记录到指定word文件里面。
请问,有什么办法实现吗
你好,还有一个问题是在html转word时能实现批注的功能吗,或者我们怎么才能定位到word的指定文字并追加批注呀
@lycheng2822577561 您可以使用以下代码:
Document doc = new Document("input.docx");
for (Revision revision : doc.getRevisions()) {
String text = revision.getParentNode().getText();
if (text.contains("minim")) {
// 收集修订节点或修订文本,然后将它们插入到新文档中。
System.out.println(text);
}
}
revision.getParentNode().getText();
获取修订版的父段落,如果需要获取修订版内部的文本,可以使用revision.getGroup().getText()
。
下面是一个 HTML 文件示例,展示如何添加注释,这些注释将在 Html 转换为 Docx 后显示。
aw-test.zip (1009 Bytes)
或者,您也可以在打开文档后使用以下代码添加注释:
Document doc = new Document("aw-test.html");
String searchWord = "dapibus";
FindReplaceOptions options = new FindReplaceOptions();
options.setUseSubstitutions(true);
doc.getRange().replace(searchWord, "$0", options);
AddCommentCallback callback = new AddCommentCallback();
options.setReplacingCallback(callback);
doc.getRange().replace(searchWord, "", options);
doc.save("output.docx");
private class AddCommentCallback implements IReplacingCallback
{
@Override
public int replacing(ReplacingArgs replacingArgs) {
Document doc = (Document) replacingArgs.getMatchNode().getDocument();
Comment comment = new Comment(doc, "John Doe", "J.D.", new Date());
comment.setText("My comment.");
CommentRangeStart commentRangeStart = new CommentRangeStart(doc, comment.getId());
CommentRangeEnd commentRangeEnd = new CommentRangeEnd(doc, comment.getId());
Run word = (Run) replacingArgs.getMatchNode();
word.getParentNode().insertBefore(commentRangeStart, word);
word.getParentNode().insertAfter(commentRangeEnd, word);
commentRangeEnd.getParentNode().insertAfter(comment, commentRangeEnd);
return ReplaceAction.SKIP;
}
}
我有一个问题,html示例里面的Comment协议是怎么指向Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum condimentum. Vivamus dapibus sodales这段话的呀,是怎么建立关联关系的。
This is an annotation
你好,我还有一个问题,修订记录在html应该怎么保存呀,在转换word后能正常显示修订记录。
我还有一个问题,在操作word添加批注时,怎么才能实现给指定坐标的文段加批注呀,如果使用上面那种匹配替换的方式存在一个问题,如示例html里面的内容,可能会给多个sit关键字,替换后,会给所有关键字都加一遍批注。怎么才能实现像word编辑器操作一样可以指定某段句子加批注的效果。
@lycheng2822577561 带注释的 Div 应该有 id=“_cmnt1”
, id=“_cmnt2”
等。在文本中应使用 <a name=“_cmntref1”>
、<a name=“_cmntref2”>
等。您可以创建包含注释的 .docx 文件,然后使用 Aspose.Words 将 .docx 文件转换为 .html 文件,以显示结果。
@lycheng2822577561 有几种方法可以实现这一结果:
return ReplaceAction.STOP;
只替换第一个单词;Document doc = new Document("input.docx");
Paragraph para = (Paragraph) doc.getChild(NodeType.PARAGRAPH, 3, true);
String searchWord = "Aspose";
FindReplaceOptions options = new FindReplaceOptions();
options.setUseSubstitutions(true);
doc.getRange().replace(searchWord, "$0", options);
AddCommentCallback callback = new AddCommentCallback(para);
options.setReplacingCallback(callback);
doc.getRange().replace(searchWord, "", options);
doc.save("output.docx");
private class AddCommentCallback implements IReplacingCallback
{
public AddCommentCallback(Paragraph para) {
_currParagraph = para;
}
@Override
public int replacing(ReplacingArgs replacingArgs) {
Document doc = (Document) replacingArgs.getMatchNode().getDocument();
Comment comment = new Comment(doc, "John Doe", "J.D.", new Date());
comment.setText("My comment.");
CommentRangeStart commentRangeStart = new CommentRangeStart(doc, comment.getId());
CommentRangeEnd commentRangeEnd = new CommentRangeEnd(doc, comment.getId());
Run word = (Run) replacingArgs.getMatchNode();
Paragraph wordParagraph = word.getParentParagraph();
if (wordParagraph == _currParagraph) {
word.getParentNode().insertBefore(commentRangeStart, word);
word.getParentNode().insertAfter(commentRangeEnd, word);
commentRangeEnd.getParentNode().insertAfter(comment, commentRangeEnd);
}
return ReplaceAction.SKIP;
}
private Paragraph _currParagraph;
}
有不有办法往指定段落指定行列的文字上插入文字。
如下word内容,比如我想在第二段的“你在”的“在”后面加一个“做什么”,组成“你在做什么”,代码应该怎么写:
你好在
你在
吃饭了吗
@lycheng2822577561 您也可以使用 Range.Replace。此外,你还可以通过节点循环,查找文档中的特定文本。可以是整个文档,也可以是文本所在的特定段落。以下是示例代码:
Document doc = new Document("input.docx");
FindReplaceOptions options = new FindReplaceOptions();
options.setUseSubstitutions(true);
String searchWord = "大夫";
doc.getRange().replace(searchWord, "$0", options);
// Get all paragraphs
NodeCollection paragraphs = doc.getChildNodes(NodeType.PARAGRAPH, true);
// Loop through the paragraphs
for (Paragraph p : (Iterable<Paragraph>) paragraphs) {
for (Run run : p.getRuns()) {
if (run.getText().equals("大夫")) {
run.setText("大夫Updated text");
}
}
}
doc.save("output.docx");
不行,这种方式存在不能精准定位的问题,如我上面的示例,第一段和第二段都有一个"在"字,没法知道居然指的是哪个"在"字
你好,我还有两个问题:
1、怎么给修订记录节点前后加上自定义的一些内容?
2、怎么将修订记录插入word?
@lycheng2822577561 您可以使用以下代码添加新的修道院:
Document doc = new Document("input.docx");
for (Revision revision : doc.getRevisions()) {
Node node = revision.getParentNode();
if (node.getNodeType() == NodeType.PARAGRAPH) {
Paragraph para = (Paragraph) node;
// 在修订前添加内容。
Paragraph newParaBefore = new Paragraph(doc);
newParaBefore.appendChild(new Run(doc, "Content before the revision"));
para.getParentNode().insertBefore(newParaBefore, para);
// 在修订后添加内容。
Paragraph newParaAfter = new Paragraph(doc);
newParaAfter.appendChild(new Run(doc, "Content after the revision"));
para.getParentNode().insertAfter(newParaAfter, para);
}
else if (node.getNodeType() == NodeType.RUN) {
Run revisionRun = (Run)node;
Run runBefore = new Run(doc, "Content before the revision");
Run runAfter = new Run(doc, "Content after the revision");
revisionRun.getParentNode().insertBefore(runBefore, revisionRun);
revisionRun.getParentNode().insertAfter(runAfter, revisionRun);
}
}
doc.save("output.docx");
请查阅我们的文档: Track Changes in a Document in Java|Aspose.Words for Java
你好,怎么给加了批注记录的节点前后加上自定义的一些内容?
我想在这些加的前后内容的前后再加上书签方便定位应该怎么写呀
Document doc = new Document("C:\\Users\\LYCIT\\Downloads\\修订和批注.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
int a = 1;
for (Revision revision : doc.getRevisions()) {
String bookmarkname = "MyBookmark"+ a;
builder.startBookmark(bookmarkname);
Node node = revision.getParentNode();
if (node.getNodeType() == NodeType.PARAGRAPH) {
Paragraph para = (Paragraph) node;
// 在修订前添加内容。
Paragraph newParaBefore = new Paragraph(doc);
newParaBefore.appendChild(new Run(doc, "before"));
para.getParentNode().insertBefore(newParaBefore, para);
// 在修订后添加内容。
Paragraph newParaAfter = new Paragraph(doc);
newParaAfter.appendChild(new Run(doc, "after"));
para.getParentNode().insertAfter(newParaAfter, para);
}
else if (node.getNodeType() == NodeType.RUN) {
Run revisionRun = (Run)node;
Run runBefore = new Run(doc, "before");
Run runAfter = new Run(doc, "after");
revisionRun.getParentNode().insertBefore(runBefore, revisionRun);
revisionRun.getParentNode().insertAfter(runAfter, revisionRun);
}
builder.endBookmark(bookmarkname);
a++;
}
doc.save("C:\\Users\\LYCIT\\Downloads\\修订和批注666.docx");
@lycheng2822577561 您可以使用以下代码:
Document doc = new Document("input.docx");
int bookmarkIndex = 1;
for (Revision revision : doc.getRevisions()) {
Node node = revision.getParentNode();
String bookmarkName = "MyBookmark_" + bookmarkIndex++;
insertContentAround(node, bookmarkName);
}
doc.save("output.docx");
private void insertContentAround(Node para, String bookmarkName) throws Exception {
insertContent(para, bookmarkName, true);
insertContent(para, bookmarkName, false);
}
private void insertContent(Node node, String bookmarkName, boolean before) {
Document doc = (Document) node.getDocument();
Paragraph newPara = new Paragraph(doc);
Run newRun = new Run(doc, "Content " + (before ? "before" : "after") + " the revision");
newPara.appendChild(newRun);
Node newNode = node.getNodeType() == NodeType.PARAGRAPH ? newPara : newRun;
BookmarkStart start = new BookmarkStart(doc, bookmarkName);
BookmarkEnd end = new BookmarkEnd(doc, bookmarkName);
if (before) {
node.getParentNode().insertBefore(newNode, node);
newNode.getParentNode().insertBefore(start, newNode);
} else {
node.getParentNode().insertAfter(newNode, node);
newNode.getParentNode().insertAfter(end, newNode);
}
}
@lycheng2822577561 例如,您可以在前面代码的基础上使用下面的代码:
NodeCollection comments = doc.getChildNodes(NodeType.COMMENT, true);
for (Comment comment : (Iterable<Comment>) comments) {
String bookmarkName = "MyBookmark_" + bookmarkIndex++;
insertContentAround(comment, bookmarkName);
}
private void insertContentAround(Comment node, String bookmarkName) {
Node previousNode = node.getPreviousSibling();
Node start = null;
Node end = null;
while (previousNode != null) {
if (previousNode.getNodeType() == NodeType.COMMENT_RANGE_END)
end = previousNode;
if (previousNode.getNodeType() == NodeType.COMMENT_RANGE_START)
start = previousNode;
previousNode = previousNode.getPreviousSibling();
}
insertContent(start, bookmarkName, true);
insertContent(end, bookmarkName, false);
}