[英]how to display online pdf file within app
我需要在我的應用程序中顯示在線 pdf 文件。 我正在使用第三方 API,但問題是它沒有顯示在線文件,這是我的代碼
compile 'com.github.barteksc:android-pdf-viewer:2.5.1'
compile 'org.apache.commons:commons-io:1.3.2'
我的 xml 文件
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
這是我在 PDFview 中呈現在線 pdf 文件的最終代碼
Uri uri = Uri.parse("http://www.pdf995.com/samples/pdf.pdf");
mypdfview =(PDFView)findViewById(R.id.pdfView);
mypdfview.fromUri(uri)
.pages(0, 2, 1, 3, 3, 3) // all pages are displayed by default
.enableSwipe(true) // allows to block changing pages using swipe
.swipeHorizontal(false)
.enableDoubletap(true)
.defaultPage(0)
.onDraw(this) // allows to draw something on a provided canvas, above the current page
.onLoad(this) // called after document is loaded and starts to be rendered
.onPageChange(this)
.onPageScroll(this)
.onError(this)
.onRender(this) // called after document is rendered for the first time
.enableAnnotationRendering(false) // render annotations (such as comments, colors or forms)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true) // improve rendering a little bit on low-res screens
.load();
我面臨的問題是我可以顯示資產文件夾中的文件。 但是當我通過uri時它沒有顯示任何內容。 我還在menifest中授予了互聯網權限和外部數據讀取權限。
或者,您可以使用 Webview 加載 pdf
webView.loadUrl(" http://docs.google.com/gview?embedded=true&url= " +pdfUrl);
WebView webView = (WebView) findViewById(R.id.my_webview);
webView.setWebViewClient(new MyWebViewClient());
webView.addView(webView.getZoomControls());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://docs.google.com/gview?embedded=true&url=" +pdfUrl);
您可以使用 webview 來查看應用程序中的 pdf,而不是使用其他一些控件
String url = "http://docs.google.com/gview?embedded=true&url=" + yourURL;
String doc="<iframe src='"+url+"' width='100%' height='100%' style='border: none;'></iframe>";
WebView web=(WebView)findViewById(R.id.webViewpdf);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadData(doc, "text/html", "UTF-8");
首先,您應該使用 Asynctask 讀取 pdf 文件,然后加載...
這是對我有用的代碼......
注意這里我使用 pdfview 庫來顯示 pdf
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
!!!online_pdf 是包含 pdf 網址的字符串變量
首先使 LOADURL 類擴展 AsyncTask
public class LOADURL extends AsyncTask<String,Void,InputStream>
{
private ProgressDialog progressDialog;
public LOADURL(LoadPDF loadPdf) {
progressDialog = new ProgressDialog(loadPdf);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setTitle("Please wait");
progressDialog.setMessage("Fetching PDF from server...");
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
}
@Override
protected InputStream doInBackground(String... strings) {
InputStream inputStream = null;
try
{
URL url = new URL(strings[0]);
HttpURLConnection urlConnection = (HttpURLConnection)
url.openConnection();
if (urlConnection.getResponseCode()==200)
{
inputStream = new
BufferedInputStream(urlConnection.getInputStream());
}
} catch (IOException e) {
return null;
}
return inputStream;
}
@Override
protected void onPostExecute(InputStream inputStream) {
pdfFileName = getFileName(mypdf);
pdfViewer.fromStream(inputStream)
.defaultPage(pageNumber)
.onPageChange(LoadPDF.this)
.enableAnnotationRendering(true)
.onLoad(LoadPDF.this)
.scrollHandle(new DefaultScrollHandle(LoadPDF.this))
.spacing(10) // in dp
.onPageError(LoadPDF.this)
.onError(LoadPDF.this)
.onPageError(LoadPDF.this)
.enableAnnotationRendering(false)
.enableAntialiasing(true)
.onRender(LoadPDF.this)
.load();
progressDialog.dismiss();
}
}
之后調用 onCreate View 中的類...
LOADURL loadurl = new LOADURL(LoadPDF.this);
loadurl.execute(online_pdf);
這將幫助您如何在沒有外部應用程序的情況下打開/顯示文檔(.pdf、.doc)?
在您的成績中添加此依賴項:
compile 'com.github.barteksc:android-pdf-viewer:2.0.3'
活動_main.xml
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
xmlns:android="http://schemas.android.com/apk/res/android" >
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorPrimaryDark"
android:text="View PDF"
android:textColor="#ffffff"
android:id="@+id/tv_header"
android:textSize="18dp"
android:gravity="center"></TextView>
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_below="@+id/tv_header"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
主活動.java
public class MainActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener{
private static final String TAG = MainActivity.class.getSimpleName();
public static final String SAMPLE_FILE = "android_tutorial.pdf";
PDFView pdfView;
Integer pageNumber = 0;
String pdfFileName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdfView= (PDFView)findViewById(R.id.pdfView);
displayFromAsset(SAMPLE_FILE);
}
private void displayFromAsset(String assetFileName) {
pdfFileName = assetFileName;
pdfView.fromAsset(SAMPLE_FILE)
.defaultPage(pageNumber)
.enableSwipe(true)
.swipeHorizontal(false)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.load();
}
@Override
public void onPageChanged(int page, int pageCount) {
pageNumber = page;
setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
}
@Override
public void loadComplete(int nbPages) {
PdfDocument.Meta meta = pdfView.getDocumentMeta();
printBookmarksTree(pdfView.getTableOfContents(), "-");
}
public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
for (PdfDocument.Bookmark b : tree) {
Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));
if (b.hasChildren()) {
printBookmarksTree(b.getChildren(), sep + "-");
}
}
}
}
您可以使用 Android SDK 提供的PDFRenderer (在 API 級別 21 中添加)在您的 Android 應用程序中呈現 PDF。 下載 PDF 並將其保存在本地存儲中,然后使用以下代碼在您的應用程序中呈現它。
PdfRendererAdapter.kt
class PdfRendererAdapter(
private val renderer: PdfRenderer?,
private val pageWidth: Int
) : RecyclerView.Adapter<PdfRendererAdapter.ViewHolder>() {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val imageView: ImageView = view.imageView
fun bind(bitmap: Bitmap) = imageView.setImageBitmap(bitmap)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.pdf_page_item, parent, false)
)
override fun getItemCount() = renderer!!.pageCount
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentPage = renderer?.openPage(position)
val bitmap = currentPage!!.render(pageWidth)
holder.bind(bitmap)
}
}
PDFRendererExtensions.kt
fun PdfRenderer.Page.render(width: Int): Bitmap {
val bitmap = createBitmap(width)
render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
close()
return bitmap
}
private fun PdfRenderer.Page.createBitmap(bitmapWidth: Int): Bitmap {
val bitmap = Bitmap.createBitmap(
bitmapWidth, (bitmapWidth.toFloat() / width * height).toInt(), Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.WHITE)
canvas.drawBitmap(bitmap, 0f, 0f, null)
return bitmap
}
PDFRendererActivity.kt
class PdfRenderActivity : AppCompatActivity() {
private var pdfRenderer: PdfRenderer? = null
private var currentPage: PdfRenderer.Page? = null
private var parcelFileDescriptor: ParcelFileDescriptor? = null
companion object {
const val FILE_NAME = "testPDF.pdf"
private const val INTENT_PDF_FILE = "pdf_file"
fun getCallingIntent(context: Context, pdfFile: File): Intent {
val intent = Intent(context, PdfRenderActivity::class.java)
intent.putExtra(INTENT_PDF_FILE, pdfFile)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_pdf_renderer)
openRenderer()
showPagesInRecyclerView()
}
private fun showPagesInRecyclerView() {
currentPage = pdfRenderer!!.openPage(0)
val pdfAdapter = PdfRendererAdapter(renderer = pdfRenderer, pageWidth = currentPage!!.width)
currentPage!!.close()
pdf_rv.adapter = pdfAdapter
pdf_rv.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
}
public override fun onStop() {
try {
closeRenderer()
} catch (e: IOException) {
e.printStackTrace()
}
super.onStop()
}
private fun openRenderer() {
val file = intent.extras?.get(INTENT_PDF_FILE) as File
parcelFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
if (parcelFileDescriptor != null) {
pdfRenderer = PdfRenderer(parcelFileDescriptor!!)
}
}
private fun closeRenderer() {
pdfRenderer!!.close()
parcelFileDescriptor!!.close()
}
}
這是在應用程序中加載遠程 pdf 的最佳方式
WebView wv = (WebView)findViewById(R.id.webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient());
wv.getSettings().setAllowFileAccess(true);
String src="http://docs.google.com/gview?embedded=true&url=https://firebasestorage.googleapis.com/v0/b/tuloenaseerapp.appspot.com/o/2_arsh_e_naaz_hq_compressed.pdf?alt=media&token=607c124b-ac28-4560-9854-1fe7d023f813";
wv.loadUrl(src);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.