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


답변:


115

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();
                    }
                }
            }
        });
    }
}

1
내일 시도해보세요. 그래서 바이트 스트림에서 파일로 저장 한 다음 해당 코드를 시도해야합니다.
Mikey

18
Android에 QuickOffice가 설치되어 있지 않으면 어떻습니까?
Mikey

2
그래서? QuickOffice가 없으면 어떻게합니까?
Necronet 2011-08-30

전화에 빠른 Office가 없다면?
Tofeeq Ahmad

6
서버에서 직접 PDF 파일을 여는 방법은 무엇입니까? 장치에 저장 한 다음 여는 대신.
EnthuDeveloper 2011

16

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);
  }
}

이미지 만 제공하기 때문에 Google 뷰어 링크에서만 작동한다고 생각합니다. pdf에 대한 링크를 직접 사용하면 작동하지 않습니다. 그 맞습니까 ?
나단 마

이것은 로컬 파일에서 작동하지 않고 원격 파일에서만 작동하는 것으로 보입니다.
Alfie Hanssen

2
링크가 변경되면 어떻게됩니까?
Shuhrat Akramov

3
"2 일 동안 지속적으로 테스트 한 후 Google 문서에서 Google 문서 형식이 아닌 파일을 보거나 다운로드 할 수있는 대역폭 한도에 도달했다는 오류가 발생했습니다 ..... 따라서 신뢰할 수없는 것 같습니다." stackoverflow.com/questions/2655972/...
Wédney 유리에게

9

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 . 이 모드가 필요한 경우 올바르게 사용하기위한 몇 가지 지침이 있습니다 . 자세한 내용 은 다음과 같습니다 .


3
전화에 파일을 저장하지 않고이를 수행 할 수있는 방법이 있습니까? PDF를 바이트 스트림으로 받고 있으며 휴대 전화에 저장하지 않고 사용자에게 표시해야합니다.
Gokhan Arik

제약 조건은 검색 가능한 파일 설명자를 생성자에 전달하는 것입니다. 소켓 스트림에서 fd를 찾을 수 없습니다. 스트림의 모든 바이트를 버퍼에 저장하고 거기에서 검색 가능한 fd를 얻을 수 있습니다.
ben75 2015-06-15

5

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

이전 답변 ...

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

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

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

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


1
Alecs : pdfName에 무엇을 사용 했 pdfView.fromAsset(pdfName)습니까? 절대 경로를 사용해 보았지만 파일을 찾을 수 없었습니다 (그리고 거기에 있다고 확신합니다). 예 : /data/data/package.name/files/images/filename.pdf
h-bomb

1
@ h-bomb 님, pdf가 프로젝트의 자산 기반에있을 때 fromasset 메서드 를 사용해야 합니다. 장치에서 pdf를로드하려면 fromFile 메서드를 사용할 수 있습니다 .
Alecs

1
정말 고마워. Android의 FileProvider 를 사용하고 외부 앱이 PDF를 열도록 허용했습니다. 놀랍게도 FileProvider 개발 문서의 문서와 샘플 코드는 훌륭했습니다.
h-bomb

3

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

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


0

바이트 배열에서 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 );
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.