You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo应用中如何显示Base64格式PDF?附请求代码

在Expo应用中显示Base64格式PDF的解决方案

首先修正你的请求逻辑——axios默认会将响应解析为JSON,这会破坏二进制PDF数据,必须添加responseType: 'blob'参数确保正确获取文件内容:

const displayPdfFile = async(contract)=>{
  try {
    const token = await AsyncStorage.getItem('token');
    const res = await axios.get(`${url}/files/${contract.id}`, {
      headers: { Authorization: token },
      responseType: 'blob' // 关键配置:保留二进制原始数据
    });
    const fileReader = new FileReader();
    fileReader.readAsDataURL(res.data);
    fileReader.onload = ()=>{
      // 将Base64格式的PDF数据存入组件状态,供渲染使用
      setPdfSource(fileReader.result);
    };
  } catch(e) {
    alert(e);
    console.log(e);
  }
}

接下来提供两种Expo环境下的可行显示方案:

方案1:使用expo-webview直接加载(最简实现)

安装依赖:

npx expo install expo-webview

组件渲染代码:

import { WebView } from 'expo-webview';
import { useState } from 'react';
import { Text } from 'react-native';

export default function PdfViewer() {
  const [pdfSource, setPdfSource] = useState(null);

  // 这里调用displayPdfFile获取PDF数据...

  return (
    <WebView
      source={{ uri: pdfSource }}
      style={{ flex: 1 }}
      startInLoadingState={true}
      renderLoading={() => <Text>加载PDF中...</Text>}
    />
  );
}

方案2:使用专业PDF组件(兼容性更强)

使用@react-native-pdf/pdf组件,对复杂排版、多页PDF的支持更完善:
安装依赖:

npx expo install @react-native-pdf/pdf

组件渲染代码:

import Pdf from '@react-native-pdf/pdf';
import { useState } from 'react';
import { View, Text } from 'react-native';

export default function PdfViewer() {
  const [pdfSource, setPdfSource] = useState(null);

  // 这里调用displayPdfFile获取PDF数据...

  return (
    <View style={{ flex: 1 }}>
      {pdfSource ? (
        <Pdf
          source={{ uri: pdfSource }}
          style={{ flex: 1 }}
          onLoadComplete={(numPages) => console.log(`PDF加载完成,共${numPages}页`)}
          onError={(err) => console.error('PDF加载失败:', err)}
        />
      ) : (
        <Text>加载中...</Text>
      )}
    </View>
  );
}

可选优化:转存本地文件后加载

如果遇到DataURL加载不稳定的情况,可借助expo-file-system将Base64数据转成本地文件再加载:

import * as FileSystem from 'expo-file-system';

// 处理Base64数据转本地文件
const savePdfToLocal = async (pdfSource, contractId) => {
  // 剔除DataURL前缀,保留纯Base64内容
  const base64Content = pdfSource.replace('data:application/pdf;base64,', '');
  const localUri = `${FileSystem.documentDirectory}contract-${contractId}.pdf`;
  await FileSystem.writeAsStringAsync(localUri, base64Content, {
    encoding: FileSystem.EncodingType.Base64
  });
  return localUri;
};

// 使用本地URI加载PDF
const localPdfUri = await savePdfToLocal(pdfSource, contract.id);
setPdfSource(localPdfUri);

内容的提问来源于stack exchange,提问作者Fran Fí de Nena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:00:20