Как сделать PDF в Android


в моем приложении я получу поток байтов и преобразую его в pdf-файл в памяти телефона. Как я могу отобразить это в pdf? И показать его на мероприятии?

6 76

6 ответов:

некоторые телефоны (например, 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();
                    }
                }
            }
        });
    }
}

открыть pdf файл в webview.

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.Страница оказать

    PdfRenderer.Page page = renderer.openPage(pageIndex);
    
  • отобразить страницу на подготовленном растровом изображении

    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • теперь вы можете делать то, что вы хотите с растрового изображения.

  • обратите внимание, что 2 нулевых аргумента могут позволить вам обрезать некоторую часть страницы и выполнить преобразование (используя Матрица) клипа
  • есть еще один режим отображения : RENDER_MODE_FOR_PRINT. Если вы нужен этот режим есть некоторые рекомендации, чтобы использовать его правильно: вот подробности.

вот полный пример того, как использовать этот новый API

эта библиотека проста и хорошо работает: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

Старый Ответ...

Я думаю, что Джоан Сапата дает нам лучшее и простое решение:

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