如何恢复在 PDF 视图中加载的最后一页?

Posted

技术标签:

【中文标题】如何恢复在 PDF 视图中加载的最后一页?【英文标题】:How to restore the last page was loaded in a PDF View? 【发布时间】:2019-09-20 20:40:14 【问题描述】:

我是一名初学者,这是我第一次发帖。

我的应用提供了一个 PDF 电子书,我使用了这个库:

com.github.barteksc:android-pdf-viewer:2.8.2

当我重新打开我的应用程序时,pdfView 加载第一页“pageNumber=0”,我希望它加载我离开它的最后一页。

我发现在 SO 上针对此问题提出了大多数解决方案,但对我没有任何帮助。

我认为有一个简单的解决方案,例如使用:

SavedPage = pdfView.getCurrentPage()onSavedInstanceState 中,然后在onCreate 中恢复该整数。

但我不知道该怎么做。因此,请您指导我使用最简单的方法让我的 pdfView 加载我正在阅读的最后一页。

这是我的阅读活动的代码:

package com.turquoise.jeebalalhasanat;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;
import java.util.List;

public class ReadingActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener 

    private static final String TAG = ReadingActivity.class.getSimpleName();
    public static final String PDF_FILE = "my_book.pdf";

    PDFView pdfView ;
    Integer pageNumber;
    String pdfFileName;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reading);

        pdfView = (PDFView)findViewById(R.id.pdfView);
        displayFromAsset(PDF_FILE);
    

    private void displayFromAsset(String assetFileName) 
        pdfFileName = assetFileName;

        pdfView.fromAsset(PDF_FILE)
                .defaultPage(pageNumber)
                .enableSwipe(true)
                .swipeHorizontal(false)
                .onPageChange(this)
                .enableAnnotationRendering(true)
                .onLoad(this)
                .scrollHandle(new DefaultScrollHandle(this))
                .load();
        

    @Override
    public void onPageChanged(int page, int pageCount) 

        pageNumber = page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));

    

    @Override
    public void loadComplete(int nbPages) 
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        printBookmarksTree(pdfView.getTableOfContents(), "-");

    

    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) 
        for (PdfDocument.Bookmark b : tree) 

            Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

            if (b.hasChildren()) 
                printBookmarksTree(b.getChildren(), sep + "-");
            
        
    

感谢任何帮助!

【问题讨论】:

【参考方案1】:

感谢上帝,我找到了解决方案! Google 的 Android 开发者文档仍将是开发者最好的朋友。

我想分享它,以帮助每个在此问题上需要帮助的初学者开发人员。

以下是如何恢复您在 PDF 视图中加载的最后一页: 第一步:在你的活动中声明一个整数变量:

Integer savedPage;

第二步:在onStop()里面:

@Override
protected void onStop() 
    super.onStop();


savedPage = pdfView.getCurrentPage();

\\ create a shared preference file

    SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);


\\ to write to this shared preference file

    SharedPreferences.Editor myEditor = mySharedPreferences.edit();



\\ store the page number you left it 

    myEditor.putInt("retrievedPage",savedPage);



\\ to save changes

 myEditor.apply();





第三步:在onCreate()里面:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reading);


\\ To retrieve the  number of the last page from your shared preferences file

 SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);

savedPage = mySharedPreferences.getInt("retrievedPage",0);

    pageNumber = savedPage;


这是完整的活动代码:

import android.os.Bundle;
import android.util.Log;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;
import java.util.List;






public class ReadingActivity extends Activity  implements OnPageChangeListener,OnLoadCompleteListener 


    private static final String TAG = ReadingActivity.class.getSimpleName();
    public static final String PDF_FILE = "my_book.pdf";


    PDFView pdfView ;
    Integer pageNumber;
    String pdfFileName;

Integer currentPageNumber;
Integer savedPage;







    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reading);






SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);

savedPage = mySharedPreferences.getInt("retrievedPage",0);

pageNumber = savedPage;







        pdfView = (PDFView)findViewById(R.id.pdfView);
        displayFromAsset(PDF_FILE);


    










    private void displayFromAsset(String assetFileName) 
        pdfFileName = assetFileName;

        pdfView.fromAsset(PDF_FILE)
                .defaultPage(pageNumber)
                .enableSwipe(true)
                .swipeHorizontal(false)
                .onPageChange(this)
                .enableAnnotationRendering(true)
                .onLoad(this)
                .scrollHandle(new DefaultScrollHandle(this))
                .load();




        





    @Override
    public void onPageChanged(int page, int pageCount) 

        pageNumber = page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));

            




    @Override
    public void loadComplete(int nbPages) 
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        printBookmarksTree(pdfView.getTableOfContents(), "-");

    


    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) 
        for (PdfDocument.Bookmark b : tree) 

            Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

            if (b.hasChildren()) 
                printBookmarksTree(b.getChildren(), sep + "-");
            
        
    



@Override
protected void onStop() 
    super.onStop();

    SharedPreferences mySharedPreferences = getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor myEditor = mySharedPreferences.edit();


savedPage = pdfView.getCurrentPage();
myEditor.putInt("retrievedPage",savedPage);
myEditor.apply();





现在你应该实现你的目标了。快乐编码^^!

【讨论】:

如果我只有一本书,这将非常有效。如果我在单个应用程序中有多本书以及如何恢复这些书籍的页面怎么办。我尝试使用 HashSet 将页码保存在 SharedPreferences 中,但没有奏效。只能检索一本书的最后阅读页。非常感谢任何帮助。 我还需要在将当前页面加载为默认页面时出现动画。我找不到在哪里设置它,我想要的是滚动动画显示为打开的 pdf 转到最后阅读页面。非常感谢任何帮助。【参考方案2】:

如果我只有一本书,这将非常有效。 如果我在单个应用程序中有多本书以及如何恢复这些书籍的页面怎么办? 通过在 OnpageChanged 方法中使用此代码,我找到了此问题的完美答案

   SharedPreferences.Editor editor = getSharedPreferences("shared", MODE_PRIVATE).edit();
    switch(BookId)
        case 1:
            arr[0]=page;
            setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
            editor.putInt("id1", arr[0]);
            editor.apply();
            break;

    case 2:
        arr[1]=page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
        editor.putInt("id2", arr[1]);
        editor.apply();
            break;


//add cases as the numbers of Books or use ( for Loop )

这对我有用,任何问题评论我都会回答

【讨论】:

我是通过 LinkedIn 来到这里的。坚持下去【参考方案3】:

对于多本书,您需要拥有每本书的唯一标识符。如果书名是唯一的,您可以使用它。否则你必须有这本书的 id。

获取 ID 后,您需要将其用作键,然后将页码保存到共享首选项中。这使您可以简单地使用唯一标识符从共享首选项中查询上次保存的页面。

【讨论】:

以上是关于如何恢复在 PDF 视图中加载的最后一页?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的 PDF 上绘制一些东西?

如何在用户退出时暂停我的应用程序,并在他们重新进入应用程序时恢复它?

javax.faces.application.ViewExpiredException:无法恢复视图

如何使用状态恢复来恢复视图控制器的子视图

如何在我自己的 Joomla 组件中存储和恢复网格的滚动位置?

如何在 PhpMyAdmin 中恢复加载?