API:如何使用 Oracle Forms 检索保存在 BLOB 字段中的 PDF?

问题描述

@H_502_0@一些 PDF 文件使用带有 OLE 容器格式的 Oracle Forms 上传到 Oracle 数据库。这些文件保存在 BLOB 字段中,并使用 C# API 函数检索,该函数将 BLOB 转换为 base64 字符串并将其作为输出返回。因此,当我们尝试使用在线转换器将 base64 字符串转换为 PDF 文件时,会引发以下错误'文件的 MIME 被检测为“application/octet-stream”,但解码器将其显示为 application/pdf' 无法生成文件

@H_502_0@在排查问题时,我们尝试将物理PDF文件转换为BLOB并将其保存在数据库字段中:生成的base64字符串可以成功转换并且可以生成PDF,但是Oracle Forms无法显示

@H_502_0@有什么建议可以解决这个问题吗?喜欢:

  • 我们是否必须改变从数据库或 API 检索 BLOB 的方式?喜欢只提取 PDF Blob 数据而不提取 OLE 容器?
  • 我们是否必须将 Oracle 端或 API 端的 MIME 类型强制设置为 application/pdf ?
  • 是否可以在 Oracle Forms 上显示从物理转换为 blob 的文件
@H_502_0@我负责 API 而不是 Oracle 表单,因此我无法向您提供 Oracle 代码,仅提供说明;下面是我尝试使用的一种方法,以便从 .NET 中的容器中提取 PDF,但抛出了相同的错误

public static byte[] StripOleHeader(byte[] fileData)
        {
            const string START_BLOCK = "%PDF-";
            int startPos = -1;

            Encoding u8 = Encoding.UTF7;
            string strEncoding = u8.GetString(fileData);
            
            if (strEncoding.IndexOf(START_BLOCK) != -1)
            {
                startPos = strEncoding.IndexOf(START_BLOCK);
            }
            byte[] retByte;

            if (startPos == -1)
            {
                retByte = new byte[0];
            }
            else {
                retByte = new byte[fileData.LongLength - startPos];
                Array.copy(fileData,startPos,retByte,fileData.LongLength - startPos);
            }

            return retByte;
        }
@H_502_0@从 Oracle 过程读取 Oracle BLOB 时的 API 方法

         Byte[] byteArr = new Byte[blobPDF.Length];
         blobPDF.Read(byteArr,System.Convert.ToInt32(blobPDF.Length));
         var stripedArray = StripOleHeader(byteArr);
         if (stripedArray.Length > 0)
         {
             createPDFfile(byteArr);
             objPdf = Convert.ToBase64String(stripedArray);
         }
         else
         {
             objPdf = "";
         }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)