Code Monkey home page Code Monkey logo

rn-pdf-reader-js's Introduction

PDF Reader

Android support 🚀





npm version npm downloads

Read a PDF just with JS (no native libs needed)

Requirements

  • 👉Install react-native-webview on your own!
  • 👉Install expo-file-system on your own!
  • 👉Install expo-constants on your own!
  • Use it into Expo app (from expo client, Standalone app or ExpoKit app).
  • Only React-Native 0.59-0.60+ support, Expo SDK 33-36+

PRs are welcome...

Example

import * as React from 'react'
import { View } from 'react-native'
import PDFReader from 'rn-pdf-reader-js'

export default class App extends React.Component {
  render() {
    return (
      <PDFReader
        source={{
          uri: 'http://gahp.net/wp-content/uploads/2017/09/sample.pdf',
        }}
      />
    )
  }
}

See more detailed example into App.tsx file.

Props

interface Source {
  uri?: string // can be local or served on the web (ie. start with `https://` or `file://`)
  base64?: string // should start with `data:application/pdf;base64,`. A base64 encoded pdf file tends to start with `JVBERi0xL` so your complete string should look something like this: `data:application/pdf;base64,JVBERi0xL...`
  headers?: { [key: string]: string }
}

interface Props {
  source: Source
  style?: View['props']['style'] // style props to override default container style
  webviewStyle?: WebView['props']['style'] // style props to override default WebView style
  webviewProps?: WebView['props']
  noLoader?: boolean
  useGoogleReader?: boolean // If you are not worried about confidentiality
  withScroll?: boolean // Can cause performance issue
  withPinchZoom?: boolean
  customStyle?: {
    readerContainer?: CSS.Properties
    readerContainerDocument?: CSS.Properties
    readerContainerNumbers?: CSS.Properties
    readerContainerNumbersContent?: CSS.Properties
    readerContainerZoomContainer?: CSS.Properties
    readerContainerZoomContainerButton?: CSS.Properties
    readerContainerNavigate?: CSS.Properties
    readerContainerNavigateArrow?: CSS.Properties
  }
  onLoad?(): void // callback that runs after WebView is loaded
  onLoadEnd?(): void // callback that runs after WebView is loaded
  onError?(): void // callback that runs when WebView is on error
}

Possibilities

Render type Platform Source prop
Custom PDF reader Android uri or base64
Direct from WebView iOS uri or base64
Google PDF Reader Android, iOS uri

What rn-pdf-reader-js use?

  • react-pdf (pdf.js)
  • WebView
  • Base64

FAQ

Hire an expert!

Looking for a ReactNative freelance expert with more than 12 years experience? Contact me from my website!

rn-pdf-reader-js's People

Contributors

azuy212 avatar boris-burgos avatar doshidak avatar garrinmf avatar guichaguri avatar jliphard avatar mmoraisa avatar muhammadady07 avatar norezark avatar psergei avatar rgordon95 avatar richjeffery avatar sguha00 avatar sungsong88 avatar umbertoghio avatar victorcabeceira avatar xcarpentier avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

rn-pdf-reader-js's Issues

Unable to dynamically change PDF URI

So I noticed that there's a loading icon whenever the URI is null, but I couldn't seem to actually get it to work as I would assume it should; show whenever a pdf is not fully loaded in. So I added a quick method that waited for the PDF to load before actually trying to access it, but I noticed that it doesn't rerender the PDF component.

Sidenote: I can integrate the async loading of assets for you, if I ever get time

loadPDF (url) {
    FileSystem.downloadAsync(url, FileSystem.cacheDirectory + 'cachedPDF.pdf').then((uri) => {
      if (this.state.current.file.data.url === url) {
        this.setState(state => {
          state.currentPDF = uri.uri
          state.current.ready = true

          return state
        })
      }
    })
  }
    return (
      <LoggedIn title='Recruiting Calendars' {...this.props} hideBack={true} onBack={this.state.current !== null ? () => this.backToList() : undefined}>
        <View style={style.horizontalContainer}>
          <Animatable.View style={style.horizontalContainerChild} ref={'_slide1'}>
            <KeyboardAwareScrollView bounces={false}>
              <Calendars />
            </KeyboardAwareScrollView>
          </Animatable.View>
          <Animatable.View style={style.horizontalContainerChild} ref={'_slide2'}>
            {this.state.current !== null &&
              <PDFReader
                source={{ uri: this.state.currentPDF }}
                style={{
                  paddingTop: 0
                }}
              />
            }
          </Animatable.View>
        </View>
      </LoggedIn>
    )

can't render jpg von Android

If we want to render a base64 encoded jpg (as src in an image element) with the pdf-reader, it doesn't show up on Android. However on iOS it is works normally.

left image is base64/jpeg (not showing) right image is base64/png (showing)
image

This is a base64 that doesn't show up on Android:

data:image/jpeg;base64,/9j/4QBYRXhpZgAASUkqAAgAAAABAJiCAgAzAAAAGgAAAAAAAABBbmRyZXkgUG9wb3YgKEFuZHJleSBQb3BvdiAoUGhvdG9ncmFwaGVyKSAtIFtOb25lXQAAAAD/7AARRHVja3kAAQAEAAAAPAAA/+EE/2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzQ1RjZBNjVGQkZDMTFFODlBODVDN0M5NjQ2NzEzNUQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzQ1RjZBNjRGQkZDMTFFODlBODVDN0M5NjQ2NzEzNUQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIExpZ2h0cm9vbSA2LjEwIChXaW5kb3dzKSAoQWRvYmUgUGhvdG9zaG9wIExpZ2h0cm9vbSA2LjEwIiBwaG90b3Nob3A6QXV0aG9yc1Bvc2l0aW9uPSJDb250cmlidXRvciI+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

Doesn't work for local files

When you try to open a local file, the component gives the message "source props is not correct" and keeps loading.

I'm just sending a document that is inside a folder on my project.

My call to the PDF Reader:
return (

<PDFReader
source={{ uri: "../../assets/doc/bio_security_measurements.pdf" }}
/>

)

My Package.json

{
"name": "empty-project-template",
"main": "node_modules/expo/AppEntry.js",
"private": true,
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"eject": "expo eject"
},
"dependencies": {
"expo": "^32.0.0",
"expo-cli": "^2.15.3",
"lodash": "latest",
"native-base": "^2.8.1",
"react": "16.5.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
"react-native-signature-canvas": "^1.3.0",
"react-navigation": "^2.18.0",
"rn-pdf-reader-js": "^0.2.3"
}
}

Add to reactnative.gallery :)

Hi!

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I help community when I can: sharing my works on open-source, like you do!

But it's hard to be visible sometimes! Right?

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

What do you think?

Do you want to be informed about it?
::BETA:: => https://reactnative.gallery 📬

Or chat about it?
::SLACK:: => https://slack.reactnative.gallery 💬

Question: What is the reasoning for using cached images of the PDF? + Possible solution to zooming

@xcarpentier I've been tinkering around with this Repo locally for the past few days for a project that requires Android PDF viewing with zoom capabilities using Expo without linking. I wanted to ask you why you set up the project to cache a base64 image of the PDF after the page initially loads for the first time? It's difficult to figure out which is being rendered and zooming logic would have to be doubled for images and the <Page /> elements. I ask, because I've found a possible solution to zooming, but wanted to feel out how needed those cached elements are to you.

Here's what I got in gif form:
gif
link https://thumbs.gfycat.com/DeadPoisedBrownbutterfly-max-14mb.gif

I've hacked up this a lot, and I essentially removed all of your cached imaging functions and am now directly rendering the <Page /> and editing the scale prop of the <Page /> element from react-pdf via two small buttons in the bottom corner. I've also edited your styling to make the canvas scroll-able and the buttons and stuff fixed in the webView.

One of the issues I ran into when testing was with clicking the zoom buttons extra fast caused the rendering of Page to fail and cause the whole app to crash. Fixing this was easier than I thought though. <Page /> has another function prop called onRenderSuccess that let's me set a class variable I dubbed __isPageRendering and set it to true whenever the user clicks the zoom button within my scale requirements and I'm not already rendering. Then set it to false once that onRenderSuccess is called allowing the user to zoom again. It's really seamless and has worked flawlessly so far.

I did attempt to get pinch zoom working via Hammer.js, but it had a lot of side effects that I wasn't willing to work it through 😞 .

When I found this repo and saw what was possible via webpack in a webview I was really impressed. I'm surprised no one else has seen this idea, but I wish it was documented a little better in case anyone wanted to edit the styling of your buttons and such like I had to.

Let me know what I can do to help
~Colin

¿How pass uri for state?

Hi

I am trying pass the uri for the state but not works
I need than uri will be dynamic

  render() {
    //string of the route
    // 'https://dev.fundacionidi.org/admin-app-cuc/index.php/archivo/?f=app_reglamento/rutaArchivo_1_20181126170006.pdf'
    const { route } = this.state
    return (
      <PdfReader source={{ uri: route }} />
    );
  }

Only rendering 2nd page of PDF on Android

Thanks for making this! It's working great for me on iOS, but I'm having a weird issue where only the second page is rendering on Android. It only seems to happen with PDF's being generated by a postcard company's API we're trying to use, example:

https://s3.us-west-2.amazonaws.com/assets.lob.com/psc_c6054c7d048d585d.pdf?AWSAccessKeyId=AKIAIILJUBJGGIBQDPQQ&Expires=1532565500&Signature=Gu86u4f6n2rjnrmewFIz3UNnA0k%3D

Full code:

<View style={styles.container}>
          <PDFReader
            source={{
              uri: "https://s3.us-west-2.amazonaws.com/assets.lob.com/psc_c6054c7d048d585d.pdf?AWSAccessKeyId=AKIAIILJUBJGGIBQDPQQ&Expires=1532565500&Signature=Gu86u4f6n2rjnrmewFIz3UNnA0k%3D"
            }}
          />
</View>

Style:

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 0,
    backgroundColor: "#525659"
  }
});

Display simple pdf on android like iOS when there is only one screeen

Thanks for the awesome component. Is there possible to remove the extra file option on android like remove plus and minus buttons and up, down arrow buttons on bottom and page counter on top.

iOS seems okay. It is happening on android because of allowFileAccess webView props. but is there any workaround to remove the extra content.

Thanks

Add to reactnative.gallery :)

Hi @xcarpentier!

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I try to help community when I can: sharing my works on open-source, like you do! :)

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

Do you want to be informed about it?
::BETA:: => https://reactnative.gallery 📬

Typescript Support

Hey!
I liked the work done here just one piece is missing Typing for typescript.
Plese add it.

Thanks!

IOS Padding Still Exists

I am using v0.2.1 and it seems that this error hasn't been fixed. I am attaching a screenshot and the
code.

https://gyazo.com/6b2bbf4056e9c6b1daad2e7e6bb4d6cb

render function dumbed down

    render () {
      return (
        <LoggedIn title='Recruiting Calendars' {...this.props} hideBack={true} onBack={this.state.current !== null ? () => this.backToList() : undefined}>
          <View style={style.horizontalContainer}>
            <Animatable.View style={style.horizontalContainerChild} ref={'_slide1'}>
              <KeyboardAwareScrollView bounces={false}>
                <Calendars />
              </KeyboardAwareScrollView>
            </Animatable.View>
            <Animatable.View style={style.horizontalContainerChild} ref={'_slide2'}>
              {this.state.current !== null &&
                <PDFReader
                  source={{ uri: this.state.current !== null ? this.state.current.file.data.url : null }}
                />
              }
            </Animatable.View>
          </View>
        </LoggedIn>
      )
    }

styles

const style = StyleSheet.create({
  horizontalContainer: {
    flex: 1,
    flexDirection: 'row',
    margin: 0,
    padding: 0
  },
  horizontalContainerChild: {
    flex: 0,
    width: width,
    padding: 0,
    margin: 0
  },
  calendar: {
    backgroundColor: Colors.white,
    padding: 20,
    paddingTop: 20,
    paddingBottom: 20,
    borderBottomColor: 'rgba(0,0,0,0.1)'
  },
  calendarText: {
    color: Colors.black,
    fontFamily: Fonts.header,
    fontSize: 20,
    marginBottom: -10,
    textTransform: 'uppercase'
  },
})

No PDF displayed on click

I have a screen in which when you click on the touchable, a PDF is supposed to render. I can make the PDF render if I manually put in the PDF code. But, when I use the touchable, all that is displayed is a small grey bar. I have been trying to fix this for over 3 weeks now, but I can not find a solution. Here's my code. Any ideas on how to fix this?

import React from 'react';
import Touchable from 'react-native-platform-touchable';
import {
	Dimensions,
	Image,
	ListView,
	Platform,
	ScrollView,
	SectionList,
	StyleSheet,
	Text,
	TouchableOpacity,
	View,
} from 'react-native';

import {
	WebBrowser,
	Constants,
	Icon,
} from 'expo';

import {
	MonoText
} from '../components/StyledText';

import firebase from "firebase";
import PDFReader from 'rn-pdf-reader-js';
import TabBarIcon from '../components/TabBarIcon';
import Colors from '../constants/Colors';

/*import {
	articleList,
	storageRef,
	allArticlesRef,
	addArticlesToList,
} from '../data/GetArticles';
*/

// Initialize Firebase

var config = {
	apiKey: "...",
	authDomain: "....firebaseapp.com",
	databaseURL: "https://....firebaseio.com",
	projectId: "...",
	storageBucket: "....appspot.com",
	messagingSenderId: "..."
};
firebase.initializeApp(config);
var storage = firebase.storage();
var database = firebase.database();
var storageRef = storage.ref();

var articleList = [];
var currentMag = storageRef.child('issue 6 2.pdf');
var source = {uri:'https://s2.q4cdn.com/235752014/files/doc_downloads/test.pdf',cache:true};

class PDF extends React.Component {
	constructor(props) {
		super(props);
		this.state = {PDF: false};

		console.log('Current Mag: ' + currentMag);
		
		currentMag.getDownloadURL().then(function(url) {
			var xhr = new XMLHttpRequest();
			xhr.responseType = 'blob';
			xhr.onload = function(event) {
				var blob = xhr.response;
				console.log('blob from xhr: ' + JSON.stringify(blob));
				var reader = new FileReader();
				reader.onload = function() {
					source.uri = reader.result;
					this.setState(previousState => (
						{PDF: !previousState.PDF}
					))
				}.bind(this);
				reader.readAsDataURL(blob);
			}.bind(this);
			xhr.open('GET', url);
			xhr.send();
			
			
		}.bind(this)).catch(function(error) {
			return (
				<View style={styles.container}>
					<Text>Error: {error}</Text>
				</View>
			);
		});
	}
	
	render() {
		if (!this.state.PDF) {
			return (
				<View style={{flex: 1, justifyContent: "center", alignItems: "center"}}>
					<Text>Loading Articles...</Text>
				</View>
			);
		}
		
		return (
			<View style={styles.container}>
				<PDFReader
					source={source}
					onLoadComplete={(numberOfPages,filePath)=>{
						console.log(`number of pages: ${numberOfPages}`);
					}}
					onPageChanged={(page,numberOfPages)=>{
						console.log(`current page: ${page}`);
					}}
					onError={(error)=>{
						console.log(error);
					}}
					style={styles.pdf}/>
			</View>
			//const source = require('https://firebasestorage.googleapis.com/v0/b/bulletin-magazine.appspot.com/o/issue%206%202.pdf?alt=media&token=e9e915db-1a70-47a2-ba56-63ae8404d606');  // ios only
			//const source = {uri:'bundle-assets://https://firebasestorage.googleapis.com/v0/b/bulletin-magazine.appspot.com/o/issue%206%202.pdf?alt=media&token=e9e915db-1a70-47a2-ba56-63ae8404d606'};

			//const source = {uri:'file:///sdcard/test.pdf'};
			//const source = {uri:"data:application/pdf;base64,..."};
		);
	}	
}

class SectionListItem extends React.Component {
	constructor(props) {
		super(props);
		this.state = {openArticle: false};
		this.getValue = this.getValue.bind(this);
    }

    getValue() {
        return this.state.openArticle;
    }
	
	_openArticle = (articleName) => {
		console.log('Clicked ' + articleName);
		currentMag = storageRef.child(articleName);
		this.setState(previousState => (
			{openArticle: !previousState.openArticle}
		));
	}
	
	_goBack = () => {
		return (
			<View style={styles.container}>
				<ArticleList/>
			</View>
		);
	}
	
	render() {
		if (this.state.openArticle) {
			console.log('Beginning main article render');
			return(
				<View style={{
					position: 'relative',
					flex: 0
				}}>
					<Touchable
						style={styles.option}
						background={Touchable.Ripple('#ccc', false)}
						onPress={() => this._goBack()}>
						<View style={{
							flex: 1,
							flexDirection: 'column',
							backgroundColor: '#FFFFFF'
						}}>
							<Icon.Ionicons
								name={
								Platform.OS === 'ios'? 
									`ios-arrow-back`
									: 'md-arrow-back'
								}
								size={26}
								style={{ marginBottom: -3 }}
								color={Colors.tabIconDefault}
							/>
							<Text style={{
								color: '#122EFF',
								fontSize: 16,
							}}>
								Back
							</Text>
						</View>
					</Touchable>
					<PDF/>
				</View>
			);
		}
		
		return (
			<View>
				<Touchable
					style={styles.option}
					background={Touchable.Ripple('#ccc', false)}
					onPress={() => this._openArticle(this.props.item.fileName)}>
					<View style={{
						flex: 1,
						flexDirection: 'column',
						backgroundColor: '#FFFFFF'
					}}>
						<Text style={{
							fontSize: 16,
							fontWeight: 'bold',
							color: '#000000',
							marginLeft: 15,
							marginRight: 10,
						}}>
							{this.props.item.title}
						</Text>
						<Text style={{
							fontSize: 16,
							color: '#000000',
							marginLeft: 20,
							marginRight: 10,
						}}>
							{this.props.item.date}
						</Text>
						<View style={{
							backgroundColor: '#CCCCCC',
							height: 1,
							margin: 6,
							marginLeft: 15,
							marginRight: 10
						}}>				
						</View>
					</View>
				</Touchable>
			</View>
		);
	}
}

class SectionHeader extends React.Component {
	render() {
		return (
			<View style={{
				flex: 1,
				backgroundColor: '#222222',
			}}>
				<Text style={{
					fontSize: 16,
					fontWeight: 'bold',
					color: 'white',
					marginTop: 30,
					marginLeft: 20,
					marginBottom: 15
				}}>{this.props.section.title}
				</Text>
			</View>
		);
	}
}

class ArticleList extends React.Component {
	constructor(props) {
		super(props);
		this.state = {articleListAquired: false};
		
		var allArticles;
		var allArticlesRef = firebase.database().ref('articles').once('value').then(function(snapshot) {
			allArticles = snapshot.val();
			console.log('All articles: ' + JSON.stringify(allArticles));
			var tempArticleObj = {data:[], title: 'Articles'};
			Object.keys(allArticles).forEach(function (item) {
				tempArticleObj['data'].push({
					title: allArticles[item].title,
					date: allArticles[item].formatDate,
					fileName: allArticles[item].fileName
				});
			});
			articleList.push(tempArticleObj);
			this.setState(previousState => (
				{articleListAquired: !previousState.articleListAquired}
			))
		}.bind(this));
	}
	
	render() {
		if (!this.state.articleListAquired) {
			return (
				<View style={{flex: 1, justifyContent: "center", alignItems: "center"}}>
					<Text>Loading Article...</Text>
				</View>
			);
		}
		
		return (
			<View style={styles.container}>
				<SectionList
					renderItem={({item, index}) => {
						return (
							<SectionListItem
								item={item}
								index={index}/>
						);
					}}
					renderSectionHeader={({section}) => {
						return (
							<SectionHeader section={section}/>
						);
					}}
					sections={articleList}
					keyExtractor={(item, index) => item.title}
				>
				</SectionList>
			</View>
		);
	}
}

export default class HomeScreen extends React.Component {
	static navigationOptions = {
		title: 'Articles',
		header: null,
	};
	
	render() {
		/*if (!this.state.articleListAquired) {
			return (
				<View style={styles.container}>
					<Text>Loading Articles...</Text>
				</View>
			);
		}*/
		
        return (
            <View style={styles.container}>
				<ArticleList/>
            </View>
        );
	}
}

//App styling, similar to CSS
const styles = StyleSheet.create({
	container: {
		flex: 1,
		backgroundColor: '#fff',
	},
	pdf: {
        flex:1,
        width:Dimensions.get('window').width,
    },
	developmentModeText: {
		marginBottom: 20,
		color: 'rgba(0,0,0,0.4)',
		fontSize: 14,
		lineHeight: 19,
		textAlign: 'center',
	},
	contentContainer: {
		paddingTop: 30,
	},
	welcomeContainer: {
		alignItems: 'center',
		marginTop: 10,
		marginBottom: 20,
	},
	welcomeImage: {
		width: 100,
		height: 80,
		resizeMode: 'contain',
		marginTop: 3,
		marginLeft: -10,
	},
	getStartedContainer: {
		alignItems: 'center',
		marginHorizontal: 50,
	},
	homeScreenFilename: {
		marginVertical: 7,
	},
	codeHighlightText: {
		color: 'rgba(96,100,109, 0.8)',
	},
	codeHighlightContainer: {
		backgroundColor: 'rgba(0,0,0,0.05)',
		borderRadius: 3,
		paddingHorizontal: 4,
	},
	getStartedText: {
		fontSize: 17,
		color: 'rgba(96,100,109, 1)',
		lineHeight: 24,
		textAlign: 'center',
	},
	tabBarInfoContainer: {
		position: 'absolute',
		bottom: 0,
		left: 0,
		right: 0,
		...Platform.select({
			ios: {
				shadowColor: 'black',
				shadowOffset: {
					height: -3
				},
				shadowOpacity: 0.1,
				shadowRadius: 3,
			},
			android: {
				elevation: 20,
			},
		}),
		alignItems: 'center',
		backgroundColor: '#fbfbfb',
		paddingVertical: 20,
	},
	tabBarInfoText: {
		fontSize: 17,
		color: 'rgba(96,100,109, 1)',
		textAlign: 'center',
	},
	navigationFilename: {
		marginTop: 5,
	},
	helpContainer: {
		marginTop: 15,
		alignItems: 'center',
	},
	helpLink: {
		paddingVertical: 15,
	},
	helpLinkText: {
		fontSize: 14,
		color: '#2e78b7',
	},
	optionsTitleText: {
		fontSize: 16,
		marginLeft: 15,
		marginTop: 9,
		marginBottom: 12,
	},
	optionIconContainer: {
		marginRight: 9,
	},
	option: {
		backgroundColor: '#fdfdfd',
		borderBottomWidth: StyleSheet.hairlineWidth,
		borderBottomColor: '#EDEDED',
	},
	optionText: {
		fontSize: 15,
		marginTop: 1,
	},
});

Correct usage of the base64 string option?

According to the documentation, you can display a pdf based on either a uri of a file, or a base64 encoded string. After reading the code, it's (probably) looking for a string like this: data:JVBERi0xLjMKJcT.... where JVBERi0xL is the usual start of a pdf in base64. However, WebKit is giving a WebKitInternal error: DataURL decoding failed. Is there a working example of this functionality, or what am I doing wrong?

If I'm faithful to the documentation (which says to prepend with data without the :, giving dataJVBERi0xLjMKJcT...) then I get a -1100 requested url not found on server error.

Thanks!

Add rn-pdf-reader-js to reactnative.gallery 🎨

Hi @xcarpentier!

Sorry, this is not an issue...

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I try to help community when I can: sharing my works on open-source, like you do!

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

https://reactnative.gallery

Add support for Incognito mode

Hello, Kudos to the team of rn-pdf-reader-js I love it!.
I wanted to ask that since this lib uses WebView, will it be possible to add support for incognito mode?. Cause am trying to stop users from taking screenshots some pdf's, If is possible I will be willing to do the PR myself if the team is too busy to do that.

Need a tutorial

I'm not understand about this code because I'm beginner on react native, can you make tutorial video for this please ?

functionalities of the pdf

i need to create a pdf reader including fallowing functions.
getcurrentpage
nextpage
previouspage

how to make the pdf to scroll horizontally. The pages should move horizontally, rather than vertically when moving to the(scroll) next page.

is it possible to create those function with this library

Add rn-pdf-reader-js to reactnative.gallery :)

Hi @xcarpentier!

Sorry, this is not an issue...

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I try to help community when I can: sharing my works on open-source, like you do!

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

https://reactnative.gallery

Add rn-pdf-reader-js to reactnative.gallery :)

Hi @xcarpentier!

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I try to help community when I can: sharing my works on open-source, like you do! :)

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

Do you want to know more?
https://reactnative.gallery

Add rn-pdf-reader-js to reactnative.gallery :)

Hi @xcarpentier!

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I try to help community when I can: sharing my works on open-source, like you do! :)

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

https://reactnative.gallery

Action required: Greenkeeper could not be activated 🚨

🚨 You need to enable Continuous Integration on all branches of this repository. 🚨

To enable Greenkeeper, you need to make sure that a commit status is reported on all branches. This is required by Greenkeeper because it uses your CI build statuses to figure out when to notify you about breaking changes.

Since we didn’t receive a CI status on the greenkeeper/initial branch, it’s possible that you don’t have CI set up yet. We recommend using Travis CI, but Greenkeeper will work with every other CI service as well.

If you have already set up a CI for this repository, you might need to check how it’s configured. Make sure it is set to run on all new branches. If you don’t want it to run on absolutely every branch, you can whitelist branches starting with greenkeeper/.

Once you have installed and configured CI on this repository correctly, you’ll need to re-trigger Greenkeeper’s initial pull request. To do this, please delete the greenkeeper/initial branch in this repository, and then remove and re-add this repository to the Greenkeeper App’s white list on Github. You'll find this list on your repo or organization’s settings page, under Installed GitHub Apps.

On iOS, pdf does not render

On Android, it works totally fine. But on iOS fullscreen and wrapped PDFReader in view, it will display nothing. I tried it on safari url actually takes me to download as opposed to loading the pdf. Any ideas?

Here is what i did:

      <View style={styles.container}>
        <PDFReader
          source={{uri: 'https://littlefleets-assets.s3.amazonaws.com/uploads/5acb2218-fd61-4cda-ab07-7e683a02f845/intro_to_npc.pdf'}}
        />
      </View>

expo version is 27

Network request failed

Why does the component give "Network request failed" error although I am connected to the internet.

Extra padding at top of PdfViewer

Hi, thank you for this library 😃

I have an issue with additional padding at the top of the component. Using the following code:

const WebScreen = props => (
  <View style={styles.container}>
    <MyHeader name={props.navigation.getParam('name')} />
    <View style={{ flex: 1 }}>
      <PdfReader
        style={{ flex: 1, padding: 0, margin: 0 }}
        source={{ uri: props.navigation.getParam('uri') }}
      />
    </View>
    <BottomBar />
  </View>
);

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
  },
});

export default WebScreen;

I get the following result, with an extra 24px padding at the top.
photo_2018-07-26_01-42-56

After some inspection, I found the extra padding to be due to this line. By changing paddingTop to 0, I was able to achieve the following:
photo_2018-07-26_01-45-05

Would it be possible for us to control paddingTop via a prop? I believe #22 is a related issue (have not tested on iOS)

View doc, xls, ppt, etc

Hi, I thought it'd be great if there'd be something like react-native-doc-viewer compatible with expo,
Your component is the only available to view pdf and compatible with expo,
So, may be you may like to consider extending to other formats :)

Download Option

Is there any possibility that this library can provide a download feature (e.g. a UI button or method) that we can not only display PDF and also allows ppl to download and save it for later usage (e.g use their own application to open this PDF)
Thanks!

component doesn't render

Hi i have following versions:

"devDependencies": {
"jest-expo": "27.0.0",
"react-native-scripts": "1.11.1",
"react-test-renderer": "16.2.0"
},
"dependencies": {
"expo": "^27.0.0",
"react": "^16.3.1",
"react-native": "^0.55.4"
}

"expo": {
"sdkVersion": "27.0.0",
}

The component doesn't give any error just nothing. The problem is not in uri/base64 they are fine, i tried uri from your example

This is the code:
KeyboardAvoidingView keyboardVerticalOffset={80} behavior="padding" style={{ flex: 1 }}
ScrollView style={{ flex: 1 }}
View style={{ flex: 1,
paddingTop: Constants.statusBarHeight}}>
<PDFReader
source={{ uri: "http://gahp.net/wp-content/uploads/2017/09/sample.pdf" }}
/>
View
ScrollView
KeyboardAvoidingView

Thank you

upd: the full code not displayed i don't know why, it displays only in edit mode

base64 doesn't work on Android

The source parameter below works on iOS, but not on Android

source={{ base64: "data:application/pdf;base64,JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwogIC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0KPj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAgL1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9udAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2JqCgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJUCjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVuZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4gCjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAwMDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9vdCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G==" }}

On iOS, padding top is incorrect

import React from 'react';
import { StyleSheet, View } from 'react-native';
import PDFReader from 'rn-pdf-reader-js';

export default class PdfPage extends React.Component {
    render() {
        const { source } = this.props.navigation.state.params;;
        
        return (
            <View style={styles.container}>
                <PDFReader source={source} />
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#ecf0f1',
    },
});  

37209754_2009532672433052_538383882949492736_n

Notice the padding at the top of the size of the status bar

Publish to npm

The current npm version has out of date imports and hasn't been published in 4 months.

Is it possible for the latest to be published to npm?

Add to reactnative.gallery :)

Hi @xcarpentier!

I'm Xavier and I’ve been working as a freelance React Native developer for more than 2 years.
I help community when I can: sharing my works on open-source, like you do!

But it's hard to be visible sometimes! Right?

Good news: I want to help developers to have more visibility.
So, I've created a website where developers can share with entire
world their React Native projects, components, apps...

This website allow developers to show their works and get feedback.
Just like a Dribbble but for React Native developers.

What do you think?

Do you want to be informed about it?
::BETA:: => https://reactnative.gallery 📬

Or chat about it?
::SLACK:: => https://slack.reactnative.gallery 💬

Use headers in the source

This looks like a great solution for me, but i have to authenticate my user in order to allow them to see documents. I do this in iOS by passing in additional headers with a Bearer accessToken.

Can this be added to the fetching of the PDF document for Android? I had a brief look under the hood and looks like you do use the WebView in there at some point, so we should be able to pass in additional headers if required?

Scrolling issue on Android

Hi,
I'm having a strange issue with the latest version (0.2.1) on Android when I try to scroll down I see the following:

screenshot at feb 12 16-51-22

The first page of the PDF loads properly but when I try scrolling up/down to see the next page it doesn't work and instead I see the text "Loading ..." over a grey background, the only way to get to the next page is to press the up/down arrows (which seem to work properly)

Any suggestions?

Thanks!

Unable to use `style` prop

Hi there, just wanted to start by saying great work with the module, it's really helping me get around the problem of loading PDF's without additional Native Libraries etc.

I'm just experiencing a problem with the use of the style prop against the component. I had look through the source code in this repo and can see that in index.js (on lines 181 and 193) that the component is merging styles from the supplied style prop. However, when using this within the application the changes aren't reflected, my code:

import PDFView from 'rn-pdf-reader-js';
...
  <PDFView
    source={{ uri: url }}
    style={{ paddingTop: 0 }}
/>

I was hoping this would close the extra gap that appears as per #24 but it doesn't seem to be the case.

I also found that when inspecting the definition of the component in VS Code the code looks like this...

Screenshot 2019-03-25 at 16 49 13

Which looks different to the code on GH. I wasn't sure if there was a discrepancy between the code on GH versus code on NPM?

Thanks again!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.