【问题标题】:Programatically add document to Hummingbird/OpenText eDocs database以编程方式将文档添加到 Hummingbird/OpenText eDocs 数据库
【发布时间】:2011-07-20 17:48:51
【问题描述】:

我正在使用(以前的 Hummingbird Enterprise)OpenText eDocs 文档管理系统。

http://www.opentext.com/2/global/products/products-opentext-edocs-products/products-opentext-edocs-document-management.htm

我们仍在使用 Hummingbird 5.1.0.5。

我一直在查看此软件的 API 文档,但有些地方有些模糊。 到目前为止,我可以创建我的个人资料表单,填充一些值。

DOCSObjects.Application docApp = null;
DOCSObjects.IProfile profile = null;
Type fType = Type.GetTypeFromProgID("DOCSObjects.Application");
docApp = (DOCSObjects.Application)Activator.CreateInstance(fType);
try { profile = docApp.CurrentLibrary.CreateProfile("DEF_PROF"); }
catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); }
if (profile != null)
{
    try
    {
        profile.Columns["DOCNAME"].Value = "New PDF Document";
        profile.Columns["APP_ID"].Value = "ACROBAT";
        profile.ShowProfile(1);
        // not sure how to set a document here
        profile.SetDocument(docApp.CurrentLibrary.Name, document);
        profile.Save(); // requires a short flag, but what?
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}
else
{
    MessageBox.Show("Profile is null");
}

我遇到的问题是如何使用配置文件保存文档。 我正在使用 C#,API 文档和智能感知只是要求文档的对象。 这是否意味着路径或者我需要将 PDF 加载到某些特定的 DOCSObjects 类型中?

此外,API 文档在保存文档时会引用一个常量,例如 OF_NORMAL。我假设这是 0,但还有其他我应该知道的吗?文档中引用了许多未定义值的常量。 (所有示例都使用 C++/VB)。

我知道任何人都在使用这个软件,但我想我会试一试。 谢谢您,我们非常感谢您的帮助。

【问题讨论】:

    标签: database opentext


    【解决方案1】:

    我已经在 VB 中完成了 - 使用我创建的 API 包装器。您应该使用 DM API 文件夹下的 PCDClient 而不是 DOCSObjects。

    这里的代码可能不会立即为您工作,因为它是高度定制的,但请尝试一下,您可能会弄明白。祝你好运!

    Public Sub CreateProfile(ByRef Doc As Profile)
    
        Try
           'SET THE STATIC META DATA
            Doc.objDoc.SetProperty("TYPE_ID", "DOCS") ' DOCUMENT TYPE IS ALWAYS DOCS
            Doc.objDoc.SetProperty("TYPIST_ID", RDIMSAPI._UserID)
            Doc.objDoc.SetProperty("APP_ID", RDIMSData.GetApp(Doc.FileToImport)) ' FILE TO IMPORT
    
            'CREATE THE DOCUMENT
            Doc.objDoc.Create()
            If Doc.objDoc.ErrNumber <> 0 Then
                Throw New Exception(Doc.objDoc.ErrNumber & " - " & Doc.objDoc.ErrDescription)
            End If
    
            'RETRIEVE THE NEW DOCUMENT PROFILE
            Dim DocNumber As Integer = Doc.objDoc.GetReturnProperty("%OBJECT_IDENTIFIER")
            Dim VersionID As Integer = Doc.objDoc.GetReturnProperty("%VERSION_ID")
    
            'ADD THE DOCUMENT TO THE PROFILE
            Dim objPutDoc As New PCDClient.PCDPutDoc
            objPutDoc.SetDST(RDIMSAPI._sDST)
            objPutDoc.AddSearchCriteria("%TARGET_LIBRARY", RDIMSAPI._Library)
            objPutDoc.AddSearchCriteria("%DOCUMENT_NUMBER", DocNumber)
            objPutDoc.AddSearchCriteria("%VERSION_ID", VersionID)
            objPutDoc.Execute()
            If objPutDoc.ErrNumber <> 0 Then
                Throw New Exception(Doc.objDoc.ErrNumber & " - " & Doc.objDoc.ErrDescription)
            End If
            objPutDoc.NextRow()
    
            'UPLOAD THE DOCUMENT
            Dim objPutStream As PCDClient.PCDPutStream = objPutDoc.GetPropertyValue("%CONTENT")
            Dim fs As FileStream = System.IO.File.OpenRead(Doc.FileToImport)
            Dim fi As FileInfo = New System.IO.FileInfo(Doc.FileToImport)
            Dim br As BinaryReader = New BinaryReader(fs)
            Dim addDocBytes As Byte() = br.ReadBytes(CInt(fs.Length))
            br.Read(addDocBytes, 0, addDocBytes.Length)
            br.Close()
            Dim bytesWritten As Integer = 0
            objPutStream.Write(addDocBytes, addDocBytes.Length, bytesWritten)
            objPutStream.SetComplete()
    
            'UNLOCK THE DOCUMENT
            Dim objDoc As New PCDClient.PCDDocObject
            objDoc.SetDST(RDIMSAPI._sDST)
            objDoc.SetObjectType("0_RDIMSPROF_SYS")
            objDoc.SetProperty("%TARGET_LIBRARY", RDIMSAPI._Library)
            objDoc.SetProperty("%OBJECT_IDENTIFIER", DocNumber)
            objDoc.SetProperty("%VERSION_ID", VersionID)
            objDoc.SetProperty("%STATUS", "%UNLOCK")
            objDoc.Update()
            objDoc.Fetch()
            objDoc = Nothing
            If Doc.objDoc.ErrNumber <> 0 Then
                Throw New Exception(Doc.objDoc.ErrNumber & " - " & Doc.objDoc.ErrDescription)
            End If
    
            'RELEASE ALL OBJECTS AND RETURN DOCUMENT NUMBER
            objPutDoc = Nothing
    
        Catch ex As Exception
            'IF EXCEPTION, LOG ERROR AND DISPLAY MESSAGE
            Throw New Exception("(" & Me.GetType().FullName & "." & New StackTrace(0).GetFrame(0).GetMethod.Name & ") " & ex.Message)
            Exit Sub
        End Try
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      我不知道你是否还在尝试。但这是我的 C# 代码。它是更大模块的一部分,因此不会立即工作。 profile 参数例如是“DEF_PROF”。

      这也使用了 PCDClientLib。我的理解是这些是服务器端库,你应该只在服务器上使用。并且您应该使用已经用于客户端代码的库。

      // All variable prepended with an underscore are class fields etc...
      // DMImportException is a custom exception, nothing special really
      
      /// <summary>
      /// Import a file into the library previously logged in to.
      /// </summary>
      /// <param name="profile">The name of the used profile.</param>
      /// <param name="profileNameValues">A dictionary of strings containing the profile values wich should be saved for the document.</param>
      /// <param name="FileName">The path and filename of the file to import.</param>
      public virtual void ImportFile(string profile, Dictionary<string, string> profileNameValues, string FileName)
      {
          if (!_isLoggedIn)
          {
              throw new DMImportException("Trying to import a file while not logged in into DM.");
          }
      
          int totalbyteswritten;
          byte[] bdata;
      
          bdata = file.readallbytes(filename);
      
          pcddocobject objdoc = new pcddocobject();
          objdoc.setproperty("%target_library", _library);
          objdoc.setdst(_dst);
          objdoc.setobjecttype(profile);
      
          foreach(var profilenamevaluepair in profilenamevalues)
          {
              objdoc.setproperty(profilenamevaluepair.key, profilenamevaluepair.value);
          }
      
          objdoc.create();
      
          if (objdoc.errnumber != 0)
          {
              throw new dmimportexception("error while creating a new objdoc. check the inner error.", objdoc.errnumber, objdoc.errdescription);
          }
      
          _docnumber = objDoc.GetReturnProperty("%OBJECT_IDENTIFIER").ToString();
          _versionID = objDoc.GetReturnProperty("%VERSION_ID").ToString();
      
          PCDPutDoc objPutDoc = new PCDPutDoc();
      
          objPutDoc.SetDST(_dst);
          objPutDoc.AddSearchCriteria("%TARGET_LIBRARY", _library);
          objPutDoc.AddSearchCriteria("%DOCUMENT_NUMBER", _docNumber);
          objPutDoc.AddSearchCriteria("%VERSION_ID", _versionID);
          objPutDoc.Execute();
      
          if (objPutDoc.ErrNumber != 0)
          {
              throw new DMImportException("RecentEdit Failure on Execute: Error while trying to get a handle to the newly created doc. Check the inner error.", objPutDoc.ErrNumber, objPutDoc.ErrDescription);
          }
      
          objPutDoc.NextRow();
      
          PCDPutStream objPutStream = (PCDPutStream)objPutDoc.GetPropertyValue("%CONTENT");
      
          objPutStream.Write((object)bdata, (int)bdata.Length, out TotalBytesWritten);
      
          objPutStream.SetComplete();
      
          objPutStream = null;
          objDoc = null;
      
          objDoc = new PCDDocObject();
          objDoc.SetDST(_dst);
          objDoc.SetObjectType(profile);
          objDoc.SetProperty("%TARGET_LIBRARY", _library);
          objDoc.SetProperty("%OBJECT_IDENTIFIER", _docNumber);
          objDoc.SetProperty("%VERSION_ID", _versionID);
          objDoc.SetProperty("%STATUS", "%UNLOCK");
          objDoc.Update();
      
          if (objDoc.ErrNumber != 0)
          {
              throw new DMImportException("Error while trying to unlock the just imported file. Check the inner error.", objDoc.ErrNumber, objDoc.ErrDescription);
          }
      
          objPutDoc = null;
          objDoc = null;
          return;
      }
      

      附:我建议您更新到更高版本的 eDocs(我们将在本周末从 5.1.0.5 升级到 5.2.1 ;-D)

      --- 编辑 ---

      我认为你需要

      Application.CurrentLibrary.CreateProfile("PROF_DEF").CreateVersionFromFile( /* filePath is one of the params */);
      

      如果您确实需要使用 DM Ext 执行此操作。 API 而不是 DM API

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多