Trong ứng dụng của tôi, tôi sẽ nhận một luồng byte và chuyển nó thành tệp pdf trong bộ nhớ điện thoại. Làm cách nào để kết xuất nó thành pdf? Và hiển thị nó trên một hoạt động?
Câu trả lời:
Một số điện thoại (như Nexus One) được cài đặt sẵn phiên bản Quickoffice nên việc gửi Ý định phù hợp có thể dễ dàng như gửi Ý định thích hợp sau khi bạn đã lưu tệp vào thẻ 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();
}
}
}
});
}
}
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) giới thiệu một API mới: PdfRenderer
API này cho phép bạn tạo Bitmap từ một trang trong tài liệu PDF.
Ngắn gọn:
lấy bộ mô tả tệp có thể tìm kiếm từ tài liệu pdf của bạn:
ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
tạo PdfRenderer
PdfRenderer renderer = new PdfRenderer(fd);
chuẩn bị Bitmap
Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
lấy trang PdfRenderer.P để kết xuất
PdfRenderer.Page page = renderer.openPage(pageIndex);
hiển thị trang trên bitmap đã chuẩn bị
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
bây giờ bạn có thể làm những gì bạn muốn với bitmap.
lưu ý rằng 2 args rỗng có thể cho phép bạn cắt một số phần trong trang và thực hiện chuyển đổi (sử dụng Ma trận ) của clip
có một chế độ kết xuất khác: RENDER_MODE_FOR_PRINT . Nếu bạn cần chế độ này, có một số hướng dẫn để sử dụng nó đúng cách: đây là chi tiết .
Thư viện này đơn giản và hoạt động tốt: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer
Trả lời cũ ...
Tôi nghĩ rằng Joan Zapata cung cấp cho chúng tôi giải pháp tốt hơn và đơn giản:
https://github.com/JoanZapata/android-pdfview
Tôi đảm bảo với bạn rằng nó hoạt động!
pdfView.fromAsset(pdfName)
gì? Tôi đã thử sử dụng đường dẫn tuyệt đối, nhưng không tìm thấy tệp (và tôi chắc chắn rằng nó ở đó). Ví dụ: /data/data/package.name/files/images/filename.pdf
Đối với các tệp pdf cục bộ, bạn có thể hiển thị chúng thông qua các thư viện của bên thứ ba. ví dụ: sử dụng thư viện MuPDF , các loại tệp được hỗ trợ của nó bao gồm PDF, PNG và JPEG.
Một điểm thiếu sót của MuPDF là nó sử dụng thư viện gốc để thực hiện mục tiêu, vì vậy sẽ không dễ dàng để chuyển ứng dụng trên nền tảng BlackBerry sau này.
Để mở một pdf từ một mảng byte, bạn có thể sử dụng RadaeePDF
, bạn có thể thực hiện như sau trong hoạt động của mình:
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 );
}