[java] Android에서 PDF를 렌더링하는 방법

내 응용 프로그램에서 바이트 스트림을 받아 전화 메모리의 pdf 파일로 변환합니다. 그것을 pdf로 어떻게 렌더링합니까? 그리고 활동에서 보여줄까요?



답변

Nexus One과 같은 일부 휴대 전화에는 Quickoffice 버전이 사전 설치되어 제공되므로 SD 카드에 파일을 저장 한 후 적절한 인 텐트를 보내는 것만 큼 쉬울 수 있습니다.

public class OpenPdf extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.OpenPdfButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File file = new File("/sdcard/example.pdf");

                if (file.exists()) {
                    Uri path = Uri.fromFile(file);
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(path, "application/pdf");
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                    try {
                        startActivity(intent);
                    }
                    catch (ActivityNotFoundException e) {
                        Toast.makeText(OpenPdf.this,
                            "No Application Available to View PDF",
                            Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }
}


답변

webview에서 pdf 파일을 엽니 다 .

public class MyPdfViewActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView mWebView=new WebView(MyPdfViewActivity.this);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setPluginsEnabled(true);
    mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+LinkTo);
    setContentView(mWebView);
  }
}


답변

Android-Lollipop (API 21)은 새로운 API를 소개합니다 : PdfRenderer

이 API를 사용하면 PDF 문서의 페이지에서 비트 맵을 만들 수 있습니다.

곧 :

  • PDF 문서에서 검색 가능한 파일 설명자를 가져옵니다.

      ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    
  • PdfRenderer 만들기

      PdfRenderer renderer = new PdfRenderer(fd);
    
  • 비트 맵 준비

      Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
    
  • 렌더링 할 PdfRenderer.Page 가져 오기

      PdfRenderer.Page page = renderer.openPage(pageIndex);
    
  • 준비된 비트 맵에서 페이지 렌더링

      page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • 이제 비트 맵으로 원하는 작업을 수행 할 수 있습니다.

  • 2 개의 null 인수를 사용하면 페이지의 일부를 자르고 클립의 변형 ( Matrix 사용 )을 수행 할 수 있습니다.

  • 다른 렌더링 모드가 있습니다. RENDER_MODE_FOR_PRINT . 이 모드가 필요한 경우 올바르게 사용하기위한 몇 가지 지침이 있습니다 . 자세한 내용 은 다음과 같습니다 .


답변

이 라이브러리는 간단하고 잘 작동합니다 :
Android Pdf Viewer
https://github.com/barteksc/AndroidPdfViewer

이전 답변 …

나는 Joan Zapata가 우리에게 더 좋고 간단한 해결책을 제공한다고 생각합니다.

https://github.com/JoanZapata/android-pdfview

나는 그것이 작동한다고 확신합니다!

1 : https://github.com/JoanZapata/android-pdfview


답변

로컬 pdf 파일의 경우 타사 라이브러리를 통해 렌더링 할 수 있습니다. 예를 들어 MuPDF 라이브러리를 사용합니다. 지원되는 파일 유형에는 PDF, PNG 및 JPEG가 포함됩니다.

MuPDF의 한 가지 단점은 기본 라이브러리를 사용하여 목표를 달성하므로 나중에 BlackBerry 플랫폼에 응용 프로그램을 이식하기가 쉽지 않다는 것입니다.


답변

바이트 배열에서 pdf를 열려면을 사용 RadaeePDF하고 활동에 다음을 수행 할 수 있습니다.

private PDFReader m_vPDF = null;
private Document doc = new Document();

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Global.Init(this);

    m_vPDF = new PDFReader(this);
    doc.Close();

    int ret = m_doc.OpenMem(data, password);
        switch( ret )
        {
            case -1://need input password
                finish();
                break;
            case -2://unknown encryption
                finish();
                break;
            case -3://damaged or invalid format
                finish();
                break;
            case -10://access denied or invalid file path
                finish();
                break;
            case 0://succeeded, and continue
                break;
            default://unknown error
                finish();
                break;
        }

    m_vPDF.open(doc);

    setContentView( m_vPDF );
}


답변