首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于安卓系统的React原生WebView不显示PDF和Word文件

用于安卓系统的React原生WebView不显示PDF和Word文件
EN

Stack Overflow用户
提问于 2019-09-29 21:22:59
回答 2查看 10K关注 0票数 8

我正在开发一个关于发布个人简历的新项目。

我需要在应用程序中显示用户的简历。

我的标准WebView代码如下,并且在iOS上运行良好。

代码语言:javascript
复制
import * as React from 'react';
import { WebView } from 'react-native';


export default class App extends React.Component {
  render() {
    return (
      <WebView
            style={{flex: 1, backgroundColor: 'white'}}
            source={{
              uri: 'http://www.africau.edu/images/default/sample.pdf',
            }}
            bounces={true}
            useWebKit={true}
            scrollEnabled={true}
          />
    );
  }
}

这段代码也需要在Android上工作。当我在Android上试用时,页面什么也没有显示。

You can try this on Expo Snack.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-30 04:17:35

Android Webview无法显示PDF文件。有一个与此问题相关的问题。您可以从this link查看它

你的问题有多种解决方案,你可以自己选择最相关的一个。

1)使用react-native-pdf-view

2)使用Google Docs作为浏览器。尝试将此URL加载到您的Webview http://docs.google.com/gview?embedded=true&url=http://www.africau.edu/images/default/sample.pdf

3) Use Chrome Custom Tabs

票数 20
EN

Stack Overflow用户

发布于 2021-09-28 10:27:38

我选择了选项2,但面对的是Google文档查看器的error,所以我做了这个棘手的事情来检查是否没有内容加载,以便刷新网页视图。

代码语言:javascript
复制
const retries = 10

const PdfViewerScreen = ({ route, navigation }: Props) => {
  const { pdfUrl } = route.params || {}
  const webview = useRef(null)
  const [tries, setTries] = useState(1)
  const [reset, setReset] = useState(Date.now())

  const isAndroid = Platform.OS === 'android'
  const base = !isAndroid
    ? ''
    : 'https://docs.google.com/gview?embedded=true&url='

  // Use date as reset to be able to 
  // reload the webview
  const uri = `${base}${pdfUrl}?t=${reset}`

  // Js code to get baseURI when 
  // webview is loaded. docs.google.com has a bug
  // where no content is returned.
  const myInjectedJs = `    
    (function(){ 
      window.ReactNativeWebView.postMessage(window.document.baseURI);
    })();`

  const onMessage = (event: WebViewMessageEvent) => {
    // Issue does not occur in iOS
    if(!isAndroid) return

    const baseURI = event.nativeEvent.data
    if (tries === retries) navigation.goBack()

    if (baseURI !== uri) {
      setReset(Date.now())
      setTries(tries + 1)
    }
  }

  return (
    <>
      <WebView
        ref={webview}
        javaScriptEnabled={true}
        domStorageEnabled={true}
        startInLoadingState={true}
        style={tailwind(`flex-1`)}
        injectedJavaScript={myInjectedJs}
        source={{ uri }}
        onMessage={onMessage}
        renderLoading={() => (
          <View style={tailwind('w-full h-full')}>
            <Loading />
          </View>
        )}
      />
    </>
  )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58155621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档