HarmonyOS 鸿蒙Next中OFD格式文件打不开

HarmonyOS 鸿蒙Next中OFD格式文件打不开 OFD格式文件打不开

4 回复

开发者你好,可以用Preview kit预览ofd文件,参考以下方案:

【解决方案】

  • 将ofd文件复制到沙箱并获取到路径。
  • 使用openPreview进行沙箱文件预览,配置PreviewInfo.miniType为空值,kit自动识别类型实现预览。

示例代码:

import { BusinessError } from '@kit.BasicServicesKit';
import { filePreview, } from '@kit.PreviewKit';
import { fileIo , fileUri } from '@kit.CoreFileKit';

@Entry
@Component
struct OfdPreview {
  context = this.getUIContext().getHostContext() as Context;
  filesDir = this.context.filesDir;
  private fileName: string = 'SFI20250709155344100684.ofd';

  async saveFileToSandbox(fileName: string) {
    const filePath = this.filesDir + '/' + fileName;
    let file: fileIo.File | null = null;
    try {
      const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
      const fileContent = this.context.resourceManager.getRawFileContentSync(fileName);
      const arrayBuffer = fileContent.buffer.slice(0);
      fileIo.writeSync(file.fd, arrayBuffer);
    } catch (error) {
      // Implement error handling.
    } finally {
      if (file != null) {
        fileIo.closeSync((file as fileIo.File).fd);
      }
    }
  }

  build() {
    Column({ space: 5 }) {
      Button('方案一:直接预览')
        .width('90%')
        .onClick(() => {
          // 使用过程中确保ofd 文件在资源文件夹下
          this.context?.resourceManager.getRawFileContent(this.fileName, (_err, value) => {
            let myBuffer: ArrayBufferLike = value.buffer;
            // 沙箱路径
            let filePath = this.filesDir + '/1.ofd';
            console.info(`testTag-filePath: ${filePath}`);

            let file: fileIo.File | null = null;
            try {
              let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
              let writeLen = fileIo.writeSync(file.fd, myBuffer);
              console.info(`testTag-write data to file succeed and size is: ${writeLen}`);
            } catch (error) {
              // Implement error handling.
            } finally {
              if (file !== null) {
                fileIo.closeSync(file);
              }
            }
          });

          let displayInfo: filePreview.DisplayInfo = {
            x: 100,
            y: 100,
            width: 800,
            height: 800
          };
          let fileInfo: filePreview.PreviewInfo = {
            title: '1.ofd',
            // 实际使用中需要切换为实际应用包名
            uri: 'file://xxx.xxx/data/storage/el2/base/haps/entry/files/1.ofd',
            mimeType: ''
          };
          filePreview.openPreview(this.context, fileInfo, displayInfo).then(() => {
            console.info('Succeeded in opening preview');
          }).catch((err: BusinessError) => {
            console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
          });
        });

      Button('方案二:步骤一、保存沙箱')
        .width('90%')
        .onClick(() => {
          this.saveFileToSandbox(this.fileName);
          this.getUIContext().getPromptAction().showToast({
            message: '已存储到沙箱'
          });
        });
      Button('方案二:步骤二、打开沙箱文件')
        .width('90%')
        .onClick(async () => {
          let filePath = this.filesDir + '/' + this.fileName;
          let uri = fileUri.getUriFromPath(filePath); // get uri

          let result = await filePreview.canPreview(this.context, uri); // Check whether the URI can be previewed
          if (result) {
            let displayInfo: filePreview.DisplayInfo = {
              x: 100,
              y: 100,
              width: 800,
              height: 800
            };
            let fileInfo: filePreview.PreviewInfo = {
              title: this.fileName,
              uri: uri,
              mimeType: ''
            };
            filePreview.openPreview(this.context, fileInfo, displayInfo).then(() => {
              console.info('Succeeded in opening preview');
            }).catch((err: BusinessError) => {
              console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
            });
          } else {
            this.getUIContext().getPromptAction().showToast({
              // File cannot be previewed.
              message: '文件不可预览'
            });
          }
        });
    }
    .height('100%')
    .width('100%');
  }
}

【总结】

Preview kit中的miniType配置说明,若无法确定文件格式,该项可直接赋值空字符串(""),系统会通过uri后缀进行文件格式判断。

更多关于HarmonyOS 鸿蒙Next中OFD格式文件打不开的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


搞个第三方软件去打开吧

在HarmonyOS Next中,OFD格式文件无法打开通常是由于系统或应用缺少对应的OFD文件解析支持。OFD是一种开放版式文档格式,需依赖专门的阅读器或系统内置解析功能。请确认设备上是否安装了支持OFD的鸿蒙应用,或检查系统更新是否包含相关格式支持。部分应用可能存在兼容性问题,可尝试使用华为应用市场中的OFD阅读工具。

在HarmonyOS Next中,OFD格式文件打不开通常是由于系统或应用缺少对应的文件解析支持。OFD(Open Fixed-layout Document)是中国自主的版式文档标准,类似于PDF,需要专门的阅读器或内置解析库才能打开。

可能的原因和解决方法:

  1. 检查应用兼容性:确认你使用的文件查看应用(如WPS、系统文件管理器)是否支持OFD格式。可尝试更新应用到最新版本,或安装专用于OFD的阅读器(如数科OFD阅读器)。

  2. 系统服务依赖:HarmonyOS Next可能未预置完整的OFD解析服务。建议通过官方应用市场下载并安装OFD相关插件或更新系统组件(若有推送)。

  3. 文件完整性:验证OFD文件是否损坏,可尝试在其他设备或平台上打开同一文件进行测试。

若以上方法无效,可能是当前系统版本对OFD的支持尚不完善,建议关注后续HarmonyOS更新公告或应用兼容性列表。

回到顶部