从 属性 页面在 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

  1. 声明要分配给规则的新操作。此操作必须在 删除或更新 excel 时触发

    1. 创建一个实现您需求的操作:

      public class MyAction extends ActionExecuterAbstractBase {
      ...
      
          @Override
          protected void executeImpl(final Action arg0, final NodeRef arg1) {
              // your code here
          }
      ....
      }
      

      此操作将:

      1. 获取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
        
      2. 对于 excel 的每一行:

        1. 复制您的模板:

          • 找到它:

            getSearchService().query(searchParameters)
            
          • 复制它:

            getFileFolderService().copy(sourceNodeRef, targetParentRef, newName)
            
        2. 对你的新单词内容进行转换(查找匹配项并替换为 poi 库)。
        3. 更新新文件的内容:

          ContentWriter writerDoc = getContentService().getWriter(document.getNodeRef(), ContentModel.PROP_CONTENT,
                  true);
          writerDoc.putContent(file/inputStream);
          
    2. 在您的上下文文件中,声明您的操作:

      <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>
      
  2. 在“共享”中,使用您创建的操作为文件夹分配规则。