2017-12-24 13 views
0

를 사용하여 렌더링 :어떻게 인터넷에서 PDF 파일을 다운로드하고 난 다음 코드를 사용하여 PDF 파일을 다운로드하려고 PdfRenderer

try { 
       URL url = new URL(urls[0]); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       conn.connect(); 

       if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
        return "Server returned HTTP " + conn.getResponseCode() + " " 
          + conn.getResponseMessage(); 
       } 

       //Useful to display progress 
       int fileLength = conn.getContentLength(); 


       //Download the mFile 
       InputStream input = new BufferedInputStream(conn.getInputStream()); 


       //Create a temp file cf. https://developer.android.com/training/data-storage/files.html 
//    mFile = File.createTempFile(FILENAME, "pdf", mContext.getCacheDir()); 
       mFile = new File(getFilesDir(), "temp.pdf"); 
       FileOutputStream fos = openFileOutput("temp.pdf",MODE_PRIVATE); 




       byte[] buffer = new byte[10240]; 
       long total = 0; 
       int count; 
       while ((count = input.read(buffer)) != -1) { 
        if (isCancelled()) { 
         input.close(); 
         return null; 
        } 
        total += count; 

        //Publish the progress 
        if (fileLength > 0) { 
         publishProgress((int) (total * 100/fileLength)); 
        } 
        fos.write(buffer); 

       } 
       Log.i(LOG_TAG, "File path: " + mFile.getPath()); 



       fos.flush(); 
       fos.close(); 
       input.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

다음, 나는 PdfRenderer를 사용하여 다운로드 한 파일을 렌더링 할 수 있습니다. 위의 코드를 사용하여 만든 File 객체를 PdfRenderer 클래스의 ParcelFileDescriptor.open()에 전달할 때마다 예외 : PDF 형식 또는 파일 형식이 아닌 파일이 나타납니다.

mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 
      // This is the PdfRenderer we use to render the PDF. 
      mPdfRenderer = new PdfRenderer(mFileDescriptor); 

가 어떻게이 문제를 해결 할 수 있습니다
렌더링 코드는 PdfRenderer를 생성하기 위해 수신 된 파일 개체에 다음과 같은합니까? createTempFile 및 많은 StackOverFlow 게시물을 사용하여 임시 파일을 만드는 것과 같은 많은 옵션을 시도했지만 모두 시도하지 못했습니다. 아무도 내 문제가 무엇에 의해 발생하는지 알 수 있습니까?

+1

나는 MuPDF를 시도하는 것이 좋습니다. 이것은 제 의견입니다. 필자가 마지막으로 PDF 렌더러를 사용했을 때, 일부 파일과 큰 파일에서도 이상한 문제가 발생했지만, MuPDF를 사용하면 매우 좋았습니다. –

+0

먼저 'PdfRenderer'는 임의의 PDF 파일을 렌더링 할 수 없습니다. 인쇄 미리보기 전용입니다. 'FileProvider'를 사용하여 사용자가 원하는 PDF 리더에서 문서를 볼 수있게하십시오. 또는 [기타 PDF 렌더링 옵션] (https://commonsware.com/blog/2017/01/04/options-viewing-pdfs.html)을 사용하십시오. 그 외에도'mFile'으로 식별 된'File'으로 다운로드하고 있지만'ParcelFileDescriptor.open()'호출은'file'을 사용하고 있습니다. 아마도'mFile'과'file'은 같은 지점을 가리키고 있지 않습니다. – CommonsWare

+0

@CoolGuyCG NDP로 MuPDF를 컴파일 했습니까? 내가 볼 수있는 한 MuPDF 소스 코드를 Android 앱에 적용하는 데 많은 노력이 있습니다. 내가 잘못? – JasonStack

답변

0

먼저 당신이 안드로이드에서 파일을 만들고 해당하는 출력 파일 스트림을 열 필요가 :

 mFile = new File(getFilesDir(), "temp.pdf"); 
     FileOutputStream fos = openFileOutput("temp.pdf",MODE_PRIVATE); 

다음, 당신은 출력 스트림에 기록 할 때 피하려고하는 아주 일반적인 자바 글리치 (이 예 : this post) 스트림 작성기를 다음으로 변경하십시오.

  fos.write(buffer, 0, count);