Giter Site home page Giter Site logo

voghdev / pdfviewpager Goto Github PK

View Code? Open in Web Editor NEW
1.7K 64.0 329.0 15.18 MB

Android widget that can render PDF documents stored on SD card, linked as assets, or downloaded from a remote URL.

License: Apache License 2.0

Java 100.00%
pdf-document pdf-book android library rendering pdf testing ui espresso ui-automated-tests

pdfviewpager's Introduction

PdfViewPager

Download Android Arsenal Build Status

Android widget to display PDF documents in your Activities or Fragments.

Important note: PDFViewPager uses PdfRenderer class, which works only on API 21 or higher. See Official doc for details.

If you are targeting pre-Lollipop devices, have a look at the legacy sample

Installation

Add this line in your app/build.gradle

implementation 'es.voghdev.pdfviewpager:library:1.1.2'

If you want to use the old android.support instead of androidx, add this dependency

implementation 'es.voghdev.pdfviewpager:library:1.0.6'

Usage

Use PDFViewPager class to load PDF files from assets or SD card

Screenshot Screenshot

1.- Copy your assets to cache directory if your PDF is located on assets directory

CopyAsset copyAsset = new CopyAssetThreadImpl(context, new Handler());
copyAsset.copy(asset, new File(getCacheDir(), "sample.pdf").getAbsolutePath());

2a.- Create your PDFViewPager passing your PDF file, located in assets (see sample)

pdfViewPager = new PDFViewPager(this, "sample.pdf");

2b.- Or directly, declare it on your XML layout

<es.voghdev.pdfviewpager.library.PDFViewPager
    android:id="@+id/pdfViewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:assetFileName="sample.pdf"/>

It will automatically have zooming and panning capability

3.- Release adapter in onDestroy

@Override
protected void onDestroy() {
    super.onDestroy();

    ((PDFPagerAdapter) pdfViewPager.getAdapter()).close();
}

PDF's on SD card

1.- Create a PDFViewPager object, passing the file location in your SD card

PDFViewPager pdfViewPager = new PDFViewPager(context, getPdfPathOnSDCard());

protected String getPdfPathOnSDCard() {
    File f = new File(getExternalFilesDir("pdf"), "adobe.pdf");
    return f.getAbsolutePath();
}

2.- Don't forget to release the adapter in onDestroy

    @Override
    protected void onDestroy() {
        super.onDestroy();

        ((PDFPagerAdapter) pdfViewPager.getAdapter()).close();
    }

Remote PDF's from a URL

Screenshot

1.- Add INTERNET, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions on your AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.- Make your Activity or Fragment implement DownloadFile.Listener

public class RemotePDFActivity extends AppCompatActivity implements DownloadFile.Listener {

3.- Create a RemotePDFViewPager object

String url = "http://www.cals.uidaho.edu/edComm/curricula/CustRel_curriculum/content/sample.pdf";

RemotePDFViewPager remotePDFViewPager =
      new RemotePDFViewPager(context, url, this);

4.- Configure the corresponding callbacks and they will be called on each situation.

@Override
public void onSuccess(String url, String destinationPath) {
    // That's the positive case. PDF Download went fine

    adapter = new PDFPagerAdapter(this, "AdobeXMLFormsSamples.pdf");
    remotePDFViewPager.setAdapter(adapter);
    setContentView(remotePDFViewPager);
}

@Override
public void onFailure(Exception e) {
    // This will be called if download fails
}

@Override
public void onProgressUpdate(int progress, int total) {
    // You will get download progress here
    // Always on UI Thread so feel free to update your views here
}

5.- Don't forget to close adapter in onDestroy to release all resources

@Override
protected void onDestroy() {
    super.onDestroy();

    adapter.close();
}

Usage in Kotlin

As you might figure out, the library is fully usable in Kotlin programming language. You can find example code here.

Just import the library as a gradle dependency as you would do in Java.

TODOs

  • Make initial Pdf scale setable by code (requested by various users on issues)
  • Load PDF documents from SD card
  • Make PDF documents zoomable with pinch and double tap (two approaches, ImageViewZoom and photoview)
  • Unify all features in only one PDFViewPager and PDFPagerAdapter class
  • Support API Levels under 21, by downloading PDF and invoking system native intent.
  • UI tests
  • Add checkstyle, refactor & improve code quality

See changelog for details

Developed By

Follow me on Twitter Find me on Linkedin

Support

This repository has been supported by JetBrains with free licenses for all JetBrains products

License

Copyright 2016 Olmo Gallegos Hernández

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Contributing

For noobs (like me some months ago)

fork the project into your GitHub account
now clone your GitHub repo for this project
implement your changes
commit your changes, push them into your repo
review your code and send me a pull request if you consider it

For not-so-noobs

Please make sure that your changes pass both checkstyle and UI tests before submitting them

./gradlew checkstyle

./gradlew test

And with your Android device connected

./gradlew connectedCheck

pdfviewpager's People

Contributors

4brunu avatar pddstudio avatar voghdev 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  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

pdfviewpager's Issues

Problem merging library's Manifest: "android:allowBackup"

In my app, I need "android:allowBackup" to be false, but it seems that it has been set to true in the library's AndroidManifest.
This is similar to the issue reported here: #11

While there is a workaround for this, it might be worthwhile to make the change to remove it as well. It is set to true by default, which is probably why it shows up in the generated AndroidManifest, even though you have not explicitly set it as such.

I would be happy to provide with a PR if that works for you.

Thanks for the library, btw! Extremely useful and handy!

download PDF don't have watermark

123

Hi, the left pdf is from iOS and web site,both of them can show the watermark.
while the right pdf is using PdfViewPager,as u see,don't have watermark.
can you give me some suggestions? Thank you very much

Handling a click on the viewpager object.

First of all, really cool widget. Easy to implement and not too complicated.
What I would like to know is can you set a click listener (A single regular click/tap) to the pdfviewpager. Current page position/number doesn't matter.

I attempted attaching a regular onClickListener and an onTouchListener (with MotionEvents). But both didn't work.

Some help would be great!
Thanks a lot!

How to use library lower than API 21

Hello,

Min SDK 15 (Android 4.0.3–4.0.4 Ice Cream Sandwich)

code

if (Build.VERSION.SDK_INT >= 21) {
adapter = new PDFPagerAdapter(this, file.getAbsolutePath(), pdfViewPager.getOffscreenPageLimit());
pdfViewPager.setAdapter(adapter);
}
else {
pdfViewPager = new PDFViewPager(context, file.getAbsolutePath());
setContentView(pdfViewPager);

        }

error

E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: android.graphics.pdf.PdfRenderer
at es.voghdev.pdfviewpager.library.adapter.BasePDFPagerAdapter.init(BasePDFPagerAdapter.java:62)
at es.voghdev.pdfviewpager.library.adapter.BasePDFPagerAdapter.(BasePDFPagerAdapter.java:56)
at es.voghdev.pdfviewpager.library.adapter.PDFPagerAdapter.(PDFPagerAdapter.java:37)
at es.voghdev.pdfviewpager.library.PDFViewPager.initAdapter(PDFViewPager.java:62)
at es.voghdev.pdfviewpager.library.PDFViewPager.init(PDFViewPager.java:41)
at es.voghdev.pdfviewpager.library.PDFViewPager.(PDFViewPager.java:31)
at com.example.golfyzzz.pdfviewer.SignatureActivity.initViewPDF(SignatureActivity.java:149)
at com.example.golfyzzz.pdfviewer.SignatureActivity.onActivityResult(SignatureActivity.java:483)
at android.app.Activity.dispatchActivityResult(Activity.java:5466)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3550)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3597)
at android.app.ActivityThread.access$1100(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1434)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5434)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:838)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)

Problem compiling class

After adding "compile 'es.voghdev.pdfviewpager:library:0.3.0" to my app, when I try to sync the gradle files I get the following error.

Error:Execution failed for task ':app:processDebugManifest'.
Manifest merger failed : Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest.xml:11:9-43 is also present at [es.voghdev.pdfviewpager:library:0.3.0] AndroidManifest.xml:13:9-49 value=(@drawable/ic_pdfviewpager).
Suggestion: add 'tools:replace="android:icon"' to element at AndroidManifest.xml:9:5-35:19 to override.

Pdf not displaying correctly .......

When i open pdf on button click it is not displayed in first attempt, blank activity is showing when i click on button.... need to go back and need to click again on button then pdf is displayed ...... please anyone have solution.....

Here are contents of my MainActivity.java

package com.beqpapers.activities;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.beqpapers.R;

public class MainActivity extends AppCompatActivity {
Button b1;
@OverRide
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}
public void btnOpen(View view){
    Intent i = new Intent(MainActivity.this, SecondActivity.class);
    startActivity(i);
}

}

SecondActivity.java

package com.beqpapers.activities;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.beqpapers.R;

import java.io.File;

import es.voghdev.pdfviewpager.library.asset.CopyAsset;
import es.voghdev.pdfviewpager.library.asset.CopyAssetThreadImpl;

public class SecondActivity extends AppCompatActivity {
final String[] sampleAssets = {"DWM_May_2016.pdf"};
@OverRide
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

    initSampleAssets();
}

private void initSampleAssets() {
    CopyAsset copyAsset = new CopyAssetThreadImpl(this, new Handler());
    for (String asset : sampleAssets) {
        copyAsset.copy(asset, new File(getCacheDir(), asset).getAbsolutePath());
    }
}

}

activity_second.xml

<es.voghdev.pdfviewpager.library.PDFViewPager
    android:id="@+id/pdfViewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:assetFileName="DWM_May_2016.pdf"/>

Please help me to resolve this issue.......

Make RemotePDFActivity zoombale

Hi, I was looking for PDF parser project, like download from API without save in SD/anywhere and found RemotePDFActivity, its simple to implement.. I have tried to set Zoom effect in 'RemotePDFActivity' but cant do it as expected..Can you help me on this..It will be helpful for others too..

out of memory

Remote PDF's from a URL

when the pdf page more than 50 ,out of memory

change max zoom level

Hi.

I have an application wich it has large-width pdf files and very small text size (provided by the WS). So I need to be capable of doing a great maximum zoom, more the default 3x in the PhotoViewAttacher class.

¿Could you add in the future this feature, for example in the PDFPagerAdapter builder class?

Thanks a lot!

Problem rendering some PDFs on Android 6.0

Hey,

Thanks for the awesome lib, I've been testing it for some time now and it works perfectly on some devices, but on some, it doesn't completely render some of my PDF files.

I've attached a file, where the very top of the PDF is correctly rendered, but not the rest.

It renders correctly on Huawei 5.0.1 amd LG G4 5.1

Version: 1.0.1
Tested devices: - Nexus 5 / Android 6.0.0
Nexus 5 / Android 6.0.1

RenderingError.pdf

Page Counter

HI All...
Please tell me how to add the functionally to jump to any page and count the total page and show the number of page..
And how to vertically swipe to go to next page

Crash on a lot of mobile phones

Crash log:
java.lang.NoClassDefFoundError: android.graphics.pdf.PdfRenderer at es.voghdev.pdfviewpager.library.adapter.BasePDFPagerAdapter.init(BasePDFPagerAdapter.java:75) at es.voghdev.pdfviewpager.library.adapter.BasePDFPagerAdapter.<init>(BasePDFPagerAdapter.java:57) at es.voghdev.pdfviewpager.library.adapter.PDFPagerAdapter.<init>(PDFPagerAdapter.java:44) at com.jrj.tougu.td.activity.ResearchesDetailActivity.onSuccess(ResearchesDetailActivity.java:70) at es.voghdev.pdfviewpager.library.RemotePDFViewPager.onSuccess(RemotePDFViewPager.java:66) at es.voghdev.pdfviewpager.library.remote.DownloadFileUrlConnectionImpl$2.run(DownloadFileUrlConnectionImpl.java:95) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5315) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680) at dalvik.system.NativeStart.main(Native Method)

qq 20161116103058

all console log file:
issue.txt

Exception java.lang.IllegalArgumentException: pointerIndex out of range

I'm loading PDF from URL and sometimes when I scroll file it's fine sometimes it's crashing. I tested this on several phones and it's the same. Here is the log:

android.view.MotionEvent.nativeGetAxisValue (MotionEvent.java) android.view.MotionEvent.getX (MotionEvent.java:1983) android.support.v4.view.MotionEventCompatEclair.getX (MotionEventCompatEclair.java:32) android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX (MotionEventCompat.java:116) android.support.v4.view.MotionEventCompat.getX (MotionEventCompat.java:496) android.support.v4.view.ViewPager.onInterceptTouchEvent (ViewPager.java:2056) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2201) android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2583) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2315) android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2583) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2315) android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2583) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2315) android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2583) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2315) android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2583) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2315) android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2583) android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2315) com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent (PhoneWindow.java:2502) com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1729) android.app.Activity.dispatchTouchEvent (Activity.java:2786) android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent (WindowCallbackWrapper.java:60) com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent (PhoneWindow.java:2463) android.view.View.dispatchPointerEvent (View.java:8671) android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:4096) android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:3959) android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3521) android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:3574) android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:3540) android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:3650) android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:3548) android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:3707) android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3521) android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:3574) android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:3540) android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:3548) android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3521) android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:5793) android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:5767) android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:5738) android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:5883) android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:185) android.view.InputEventReceiver.nativeConsumeBatchedInputEvents (InputEventReceiver.java) android.view.InputEventReceiver.consumeBatchedInputEvents (InputEventReceiver.java:176) android.view.ViewRootImpl.doConsumeBatchedInput (ViewRootImpl.java:5854) android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run (ViewRootImpl.java:5906) android.view.Choreographer$CallbackRecord.run (Choreographer.java:767) android.view.Choreographer.doCallbacks (Choreographer.java:580) android.view.Choreographer.doFrame (Choreographer.java:548) android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:753) android.os.Handler.handleCallback (Handler.java:739) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:135) android.app.ActivityThread.main (ActivityThread.java:5536) java.lang.reflect.Method.invoke (Method.java) java.lang.reflect.Method.invoke (Method.java:372) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1397) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1192)

Sometimes Can't read assets folder's pdf file

i m using the same code for assets folder that are given in the pdfViewPager example.
This code sometimes read assets folder's pdf file but sometime it can not read the file and screen is shown blank and it gives error file is not available.
file from sd card always read and successfully show in app and when the sd card file shows than i change the code to show file through assets folder without taking sd card read permission and the file successfully shows..
will you please tell me the right way to read assets folder file.
i am using this code for copy assets sometime it successfully read the file but sometimes fail.

final String[] sampleAssets = {"adobe.pdf","sample.pdf"};
@OverRide
public void onCreate() {
super.onCreate();
initSampleAssets();
}
private void initSampleAssets() {
CopyAsset copyAsset = new CopyAssetThreadImpl(this, new Handler());
for(String asset : sampleAssets){
copyAsset.copy(asset, new File(getCacheDir(), asset).getAbsolutePath());
}
}

PDFs are displayed only 1/2 the screen size by default

Hey Olmo,
I really like this lib! :)
I played a bit with it but PDFs are displayed quite small on my test-devices.
I had to call pdfViewPager.setScaleX(2) to make them appear fullscreen.
Is this an intended behaviour?

Best regards
Carsten

zooming in remote pdf

I have integrate your library in my app. But am facing an issue when am populating the downloaded pdf from remote server. The issue is that the pdf is not zoomable.

Part of the xml is :

     <es.voghdev.pdfviewpager.library.PDFViewPagerZoom
        android:id="@+id/pdfViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.55"
      />

Am able to download and view the pdf in the activity. The portion of the code is given below:

public class Pdf extends AppCompatActivity implements DownloadFile.Listener{
  RemotePDFViewPager remotePDFViewPager;
 PDFPagerAdapter adapter;
   PDFViewPager pdfViewPager;


 @Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
remotePDFViewPager = new RemotePDFViewPager(getBaseContext(), "http://partners.adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf",this);
           pdfViewPager = (PDFViewPager) findViewById(R.id.pdfViewPager);
}

public static void open(Context context){
    Intent i = new Intent(context, Pdf.class);
    context.startActivity(i);
}

  @Override
    public void onSuccess(String url, String destinationPath) {

    adapter = new PDFPagerAdapter(this, FileUtil.extractFileNameFromURL(url));
     pdfViewPager.setAdapter(adapter);
 }

In onSucces if am using PDFPagerAdapterZoom , the pdf which gets loaded to activity is so small, then too am able to zoom it. But I want the pdf to be as the size when I use PDFPagerAdapter and with zooming option in it.
How to make pdf as the size of when it loads via PDFPagerAdapter with zooming ?

onSuccess Error

java.lang.NoClassDefFoundError: android.graphics.pdf.PdfRenderer
help.

Android.graphics.pdf.PdfRenderer.finalize() timed out after 10

I have already implemented open pdf file from SD card, but sometimes it crashes.
EXCEPTION:

08-10 15:11:03.952 1617-1635/com.notviz.android E/AndroidRuntime: FATAL EXCEPTION: FinalizerWatchdogDaemon
Process: com.notviz.android, PID: 1617
java.util.concurrent.TimeoutException: android.graphics.pdf.PdfRenderer.finalize() timed out after 10 seconds
at android.graphics.pdf.PdfRenderer.nativeClose(Native Method)
at android.graphics.pdf.PdfRenderer.doClose(PdfRenderer.java:223)
at android.graphics.pdf.PdfRenderer.finalize(PdfRenderer.java:212)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:191)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:174)
at java.lang.Thread.run(Thread.java:818)
08-10 15:11:13.739 1617-1638/com.notviz.android D/ANRAppManager: !!! It is not under singleton mode, U can't use it. !!!
08-10 15:11:13.740 1617-1638/com.notviz.android W/Binder: Caught a RuntimeException from the binder stub implementation.
java.lang.NullPointerException: Attempt to invoke interface method 'android.os.IBinder com.mediatek.anrappmanager.IFrameworks.serviceManagerGetService(java.lang.String)' on a null object reference
at com.mediatek.anrappmanager.ANRManagerNative$1.b(SourceFile:77)
at com.mediatek.anrappmanager.ANRManagerNative$1.c(SourceFile:75)
at ...

Scrollbars and Fast Scrolling

First of all thankyou for this awesome library.
If any of you are getting the SIGSEGV error, try converting your pdf to doc and back to pdf again. In my case it fixed the error.

Secondly, is there a way to implement scrollbar in the viewpager and enable fast scrolling like google docs where we can zoom out and scroll quickly to the page of choice or scroll by dragging the scrollbar.

Scroll Vertically

thanks to your library, I want to ask if this library can support scroll vertically?

java.lang.IllegalArgumentException: pointerIndex out of range

java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nativeGetAxisValue(Native Method) at android.view.MotionEvent.getX(MotionEvent.java:2014) at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2092) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1961) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2372) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1722) at android.app.Activity.dispatchTouchEvent(Activity.java:2786) at com.jinxuanjin.jxgold.tougu.activity.BaseActivity.dispatchTouchEvent(BaseActivity.java:627) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2333) at android.view.View.dispatchPointerEvent(View.java:8753) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4136) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4002) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3610) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3576) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3693) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3584) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3750) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3610) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3576) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3584) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5820) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5794) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5765) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5910) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5881) at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5933) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:548) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:211) at android.app.ActivityThread.main(ActivityThread.java:5373) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

PDFViewPager not showing highlighted text in the PDF

Hi Vogh,

I'm working on an application that requires highlighting text in a PDF and then open it using PDFViewPager. When I open it through PDFViewPager it does not show the highlighted text but otherwise opening via chrome shows highlighted text.

Just wondering what could be the cause of this issue? I'm attaching the sample PDF that highlights "basic" keyword 7 times in the document but not showing up using PDFViewPager. Pls help.
chemical_classification_periodicity_in_properties (7).pdf

Height of all pages are the same size as the first one

Hi,

In versions 0.3.0 and 1.0.1, if a PDF has multiple pages, and the pages are not the same height, there are display problems.

For example, if the first page is 500dp high, and the second one is 700dp high, the second page will appear compressed to fit in 500dp. I have also noticed severe lags in opening and flipping between pages.

This issue does not occur in 0.2.1.

I believe it might have something to do with the extractPdfParamsFromFirstPage method in BasePDFPagerAdapter.

Do you have an idea?

Tested on LG G4 / Android 5.1

Cheers

App crashes with OutOfMemory issue

I have a pdf with 2 MB size. I am downloading the file from server first time and then storing it in Application Memory with MODE_PRIVATE. I can open and read the file easily with normal flow.

But, when I play to and fro with this fragment quickly I get crash with following exception.

java.lang.OutOfMemoryError: Failed to allocate a 7755276 byte allocation with 4194208 free bytes and 5MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
at android.graphics.Bitmap.createBitmap(Bitmap.java:756)
at es.voghdev.pdfviewpager.library.adapter.SimpleBitmapPool.createBitmapAtIndex(SimpleBitmapPool.java:83)
at es.voghdev.pdfviewpager.library.adapter.SimpleBitmapPool.getBitmap(SimpleBitmapPool.java:49)
at es.voghdev.pdfviewpager.library.adapter.SimpleBitmapPool.get(SimpleBitmapPool.java:59)
at es.voghdev.pdfviewpager.library.adapter.PDFPagerAdapter.instantiateItem(PDFPagerAdapter.java:59)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1248)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:540)

I guess there are multiple threads opened to load file in memory and due to which app goes to OutOfMemory. How can I clear memory when I move away from PDF Viewer Fragment?

Problem with installing

Hello, I'm trying to install PdfViewPager but I'm getting an error as below

Attribute application@label value=(@string/comp_app_name) from AndroidManifest.xml:18:9-50
	is also present at [es.voghdev.pdfviewpager:library:1.0.1] AndroidManifest.xml:13:9-41 value=(@string/app_name).
	Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:14:5-99:19 to override.

Problem is that I 'laready have tools:replace="icon, theme" in my Manifest. I already tried valious combinations but none of them works. Could you please advice?

Thanks

Provide vertical View pager within the library using ViewPager from support library

First, thank you for taking the time to create this library.

I ran into this other project: https://github.com/castorflex/VerticalViewPager, which provides with a VerticalViewPager without RecyclerView, and I was wondering if:

  • This would be feasible (I know that combining Recyclerview & PdfRenderer has limitations for large files).
  • How easy it would be to combine with your library.

If you think it is possible, I would happy to provide with a PR.

Make a phone call after clicking on phone number

Hi Olmo,

How can I trigger a intent to make a phone call, after clicking on specific number in pdf OR open a mail client after clicking on email id from pdf ? Not sure whether it is possible or not.

zoom level below 1f

Hi,
is it possible to set zoom level below 1f?

      adapter = new PDFPagerAdapter.Builder(this)
                                     .setScale(.6f)
                                     .setPdfPath(FileUtil.extractFileNameFromURL(url))
                                     .create();

        remotePDFViewPager.setAdapter(adapter);
        pdf_container.addView(remotePDFViewPager);

Possible security issue

This was brought up after a static scan by Veracode when using your library. Just FYI

BasePDFPagerAdapter.java: line 102

Attack Vector: java.io.File.!operator_javanewinitNumber of Modules Affected: 1Description: This call to java.io.File.!operator_javanewinit() contains a path manipulation flaw. The argument to the function is a filename constructed using untrusted input. If an attacker is allowed to specify all or part of the filename, it may be possible to gain unauthorized access to files on the server, including those outside the webroot, that would be normally be inaccessible to end users. The level of exposure depends on the effectiveness of input validation routines, if any. The first argument to !operator_javanewinit() contains tainted data from the variable path. The tainted data originated from an earlier call to .getintent.Remediation: Validate all untrusted input to ensure that it conforms to the expected format, using centralized data validation routines when possible. When using black lists, be sure that the sanitizing routine performs a sufficient number of iterations to remove all instances of disallowed characters.

Error when try "Zoom out" and "Zoom in" very Quick

Process: com.jatim, PID: 23510
java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2031)
at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:116)
at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:496)
at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2058)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1961)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2372)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1719)
at android.app.Activity.dispatchTouchEvent(Activity.java:2801)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2333)
at android.view.View.dispatchPointerEvent(View.java:8686)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4168)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4034)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3584)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3637)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3603)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3720)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3611)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3777)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3584)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3637)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3603)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3611)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3584)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5852)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5826)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5797)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5942)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at android.os.Looper.loop(Looper.java:122)
at android.app.ActivityThread.main(ActivityThread.java:5298)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:708)

in API 22, Marshmellow, please help me, thanks 👍 👍 👍

I can not understand the difference between "PDFViewPagerIVZoom" and "PDFViewPager"

From the code

public class PDFViewPagerIVZoom extends PDFViewPager {
    public PDFViewPagerIVZoom(Context context, String pdfPath) {
        super(context, pdfPath);
    }

    public PDFViewPagerIVZoom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void initAdapter(Context context, String pdfPath){
        setAdapter(new PDFPagerAdapter(context, pdfPath, getOffscreenPageLimit()));
    }
}

All method in *PDFViewPagerIVZoom * are inherited from *PDFViewPager *.

Low Quality

Rendered PDF's has really bad quality especially when text is colored.

Crash when rendering some pdfs.

I downloaded the pdf from https://tools.ietf.org/pdf/rfc7519.pdf . Then replace adobe.pdf with rfc7519.pdf. It is very slow when rendering rfc7519.pdf. And crashed after a while. I found the culprit:
return renderer.openPage(position);
But other pdfs is fine, witch is evan larger than rfc7519.pdf.
You can reproduce it with the rfc7519.pdf.

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.