У моїй програмі я отримаю потік байтів і перетвору його у файл 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();
}
}
}
});
}
}
Відкрийте файл 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 = 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 . Якщо вам потрібен цей режим, є кілька рекомендацій щодо його правильного використання: ось деталі .
Ця бібліотека проста і добре працює: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer
Стара відповідь ...
Я думаю, що Джоан Сапата дає нам краще та простіше рішення:
https://github.com/JoanZapata/android-pdfview
Запевняю, це працює!
pdfView.fromAsset(pdfName)
? Я спробував використати абсолютний шлях, але файл не знайшов (і я впевнений, що він є). Приклад: /data/data/package.name/files/images/filename.pdf
Для локальних 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 );
}