从 属性 页面在 Alfresco 中动态更新文档模板
Update Document Template Dynamically in Alfresco from property page
我有一个文档模板,就像附加的屏幕截图一样。现在我的要求是,当我将文档上传到露天站点时,我想动态更新该文档的某些值。我将通过节点模板创建该文档或上传。我想从文档 属性 页面提供这些值。
任何人都可以帮助我如何实现这一目标。
我尝试使用 java 脚本,但我遇到了一些问题。所以我正在考虑使用 Alfresco CMIS API。但我在露天 cmis 中还很陌生。所以任何人都可以告诉我可以用于此任务的更好方法。
提前致谢。
我认为您应该通过 Rule
触发自定义操作
当有人更新节点时(例如通过编辑属性),您的操作将被触发,您将能够:
- 获取节点的内容
- 获取节点的属性
- 使用alfresco提供的apache poi库(我猜你用的是word文档)找到你的参数,并用你在属性节点中找到的值替换它们。
Here 是一个 excel借用教程,用于学习如何创建自定义操作。
注意:如果您想第二次更改您的属性(例如通过使用版本控制),您可能必须保留原始模板文档。
编辑(见下面的讨论):
我假设您知道如何在户外使用规则:http://docs.alfresco.com/5.0/tasks/library-folder-rules-define.html
声明要分配给规则的新操作。此操作必须在 删除或更新 excel 时触发
创建一个实现您需求的操作:
public class MyAction extends ActionExecuterAbstractBase {
...
@Override
protected void executeImpl(final Action arg0, final NodeRef arg1) {
// your code here
}
....
}
此操作将:
获取nodeRef参数(即excel文件)并加载文件
...
Inputstream inputstream = getFileFolderService().getReader(arg1).getContentInputStream();
...
NPOIFSFileSystem fs = null;
HSSFWorkbook workbook = null;
try {
fs = new NPOIFSFileSystem(inputstream);
workbook = new HSSFWorkbook(fs.getRoot(), true);
//get your data with POI
对于 excel 的每一行:
复制您的模板:
找到它:
getSearchService().query(searchParameters)
复制它:
getFileFolderService().copy(sourceNodeRef, targetParentRef, newName)
- 对你的新单词内容进行转换(查找匹配项并替换为 poi 库)。
更新新文件的内容:
ContentWriter writerDoc = getContentService().getWriter(document.getNodeRef(), ContentModel.PROP_CONTENT,
true);
writerDoc.putContent(file/inputStream);
在您的上下文文件中,声明您的操作:
<bean id="my-action" class="x.y.z.MyAction" parent="action-executer">
<property name="searchService">
<ref bean="searchService" />
</property>
<property name="nodeService">
<ref bean="nodeService" />
</property>
<property name="contentService">
<ref bean="contentService" />
</property>
<property name="fileFolderService">
<ref bean="FileFolderService" />
</property>
....
</bean>
在“共享”中,使用您创建的操作为文件夹分配规则。
我有一个文档模板,就像附加的屏幕截图一样。现在我的要求是,当我将文档上传到露天站点时,我想动态更新该文档的某些值。我将通过节点模板创建该文档或上传。我想从文档 属性 页面提供这些值。 任何人都可以帮助我如何实现这一目标。
我尝试使用 java 脚本,但我遇到了一些问题。所以我正在考虑使用 Alfresco CMIS API。但我在露天 cmis 中还很陌生。所以任何人都可以告诉我可以用于此任务的更好方法。
提前致谢。
我认为您应该通过 Rule
触发自定义操作当有人更新节点时(例如通过编辑属性),您的操作将被触发,您将能够:
- 获取节点的内容
- 获取节点的属性
- 使用alfresco提供的apache poi库(我猜你用的是word文档)找到你的参数,并用你在属性节点中找到的值替换它们。
Here 是一个 excel借用教程,用于学习如何创建自定义操作。
注意:如果您想第二次更改您的属性(例如通过使用版本控制),您可能必须保留原始模板文档。
编辑(见下面的讨论):
我假设您知道如何在户外使用规则:http://docs.alfresco.com/5.0/tasks/library-folder-rules-define.html
声明要分配给规则的新操作。此操作必须在 删除或更新 excel 时触发
创建一个实现您需求的操作:
public class MyAction extends ActionExecuterAbstractBase { ... @Override protected void executeImpl(final Action arg0, final NodeRef arg1) { // your code here } .... }
此操作将:
获取nodeRef参数(即excel文件)并加载文件
... Inputstream inputstream = getFileFolderService().getReader(arg1).getContentInputStream(); ... NPOIFSFileSystem fs = null; HSSFWorkbook workbook = null; try { fs = new NPOIFSFileSystem(inputstream); workbook = new HSSFWorkbook(fs.getRoot(), true); //get your data with POI
对于 excel 的每一行:
复制您的模板:
找到它:
getSearchService().query(searchParameters)
复制它:
getFileFolderService().copy(sourceNodeRef, targetParentRef, newName)
- 对你的新单词内容进行转换(查找匹配项并替换为 poi 库)。
更新新文件的内容:
ContentWriter writerDoc = getContentService().getWriter(document.getNodeRef(), ContentModel.PROP_CONTENT, true); writerDoc.putContent(file/inputStream);
在您的上下文文件中,声明您的操作:
<bean id="my-action" class="x.y.z.MyAction" parent="action-executer"> <property name="searchService"> <ref bean="searchService" /> </property> <property name="nodeService"> <ref bean="nodeService" /> </property> <property name="contentService"> <ref bean="contentService" /> </property> <property name="fileFolderService"> <ref bean="FileFolderService" /> </property> .... </bean>
在“共享”中,使用您创建的操作为文件夹分配规则。