Як відобразити PDF в Android


Відповіді:


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
хмм погано спробуйте це завтра. так що з байтових потоків я отримаю, мені потрібно зберегти їх як файл, а потім спробувати зробити цей код.
Майкі

18
хм, як щодо того, якщо на моєму Android не встановлено QuickOffice?
Майкі

2
так? що робити, якщо у вас немає QuickOffice?
Necronet

Якщо телефон не має швидкого Office, то?
Tofeeq Ahmad

6
Як відкрити файл PDF безпосередньо з сервера? Замість того, щоб зберігати його на пристрої, а потім відкривати.
EnthuDeveloper

16

Відкрийте файл 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 viewer, оскільки воно обслуговує лише зображення. Якщо ми використовуємо посилання на PDF безпосередньо, це не буде працювати. Це правильно ?
Натан До

Здається, це не працює для локальних файлів, лише для віддалених.
Alfie Hanssen,

2
Що робити, якщо посилання зміниться?
Шухрат Акрамов

3
"Після постійного тестування протягом 2 днів, у документах Google з’явилася помилка із повідомленням, що ви досягли обмеження пропускної здатності для перегляду або завантаження файлів, які не мають формату Google Docs ..... Тому не здається надійним." 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 = 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 нульові аргументи можуть дозволити вам відсікти якусь частину сторінки та виконати перетворення (за допомогою матриці ) кліпу

  • є інший режим візуалізації: RENDER_MODE_FOR_PRINT . Якщо вам потрібен цей режим, є кілька рекомендацій щодо його правильного використання: ось деталі .


3
Чи є спосіб досягти цього, не зберігаючи файл на телефоні? Я отримую PDF як bytestream, і мені потрібно показати його користувачеві, не зберігаючи його на телефоні.
Гохан Арік

обмеження полягає в тому, щоб передати конструктор файлу, що шукає файл; і fd з потоку сокетів не видно. Ви можете спробувати зберегти всі байти з потоку в буфері і отримати з цього доступний fd.
ben75

5

Ця бібліотека проста і добре працює: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

Стара відповідь ...

Я думаю, що Джоан Сапата дає нам краще та простіше рішення:

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, вам доведеться використовувати метод fromasset, коли ваш pdf знаходиться у коді активів вашого проекту. Для завантаження PDF-файлу з пристрою можна скористатися методом fromFile .
Alecs

1
Дуже дякую. Я вирішив використовувати FileProvider для Android і дозволити зовнішньому додатку відкривати 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 );
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.