精华内容
下载资源
问答
  • 由于H5手机端页面,苹果ios手机端支持在线预览,而安卓手机端不行。 解决方案: 使用pdf.js插件。 官网地址:https://mozilla.github.io/pdf.js/ 第一步:下载整个文件 第二步:渲染页面 (1):引入相关js文件和...

    由于H5手机端页面,苹果ios手机端支持在线预览,而安卓手机端不行。

    解决方案: 使用pdf.js插件。

    官网地址:https://mozilla.github.io/pdf.js/

    第一步:下载整个文件

    第二步:渲染页面

    (1):引入相关js文件和css文件

    {{--pdfjs在线预览pdf--}}
    <script src="{{ asset('assets/js/pdfjs/build/pdf.js?v=20190218')}}"></script>
    <script src="{{ asset('assets/js/pdfjs/build/pdf.js?v=20190218')}}"></script>
    <script src="{{ asset('assets/js/pdfjs/web/viewer.js?v=20190218')}}"></script>
    <link rel="stylesheet" href="{{ asset('assets/js/pdfjs/web/viewer.css?v=20190218')}}">

    (2):渲染页面,以a标签,套viewer.html页面,{{$article->pdf}}是pdf文件地址。

    <div>
        <a target="_blank" href="/assets/js/pdfjs/web/viewer.html?file={{$article->pdf}}">查看文件.PDF</a>
    </div>

     

    展开全文
  • android中webview不能直接加载pdf文件

    千次阅读 2016-11-22 17:52:52
    很气愤,凭什么同样的需求,给个pdf网页,ios就可以直接打开,android偏偏不能,本来就挺大的app,为了这一个小功能,不值得再去导jar包,求助我们的大神,最终做成的结果是——先下载到本地,再利用本地支持pdf的...

    很气愤,凭什么同样的需求,给个pdf网页,ios就可以直接打开,android偏偏不能,本来就挺大的app,为了这一个小功能,不值得再去导jar包,求助我们的大神,最终做成的结果是——先下载到本地,再利用本地支持pdf的应用打开。

    废话不多说,上代码!

    					URL url = null;
    					try {
    						url = new URL(docUrl);//docUrl为pdf地址
    						String path = Environment.getExternalStorageDirectory()
    								+ "/Download/";
    						String[] splitStrings = docUrl.split("/");
    						String[] nameStrings = splitStrings[splitStrings.length - 1]
    								.split(".pdf");
    
    						String fileName = nameStrings[0] + ".pdf";//当pdf的url带签名时,文件名过长下载会失败
    						File file = new File(path + fileName);
    
    						ExecutorService executorService = Executors
    								.newSingleThreadExecutor();
    						Downloader downloader = new Downloader();
    						downloader.setUrlAndFile(url, file);
    						File downloadFile = executorService.submit(downloader)
    								.get();
    						// loadingDialog.dismiss();
    						Uri path1 = Uri.fromFile(downloadFile);
    						Intent intent = new Intent(Intent.ACTION_VIEW);
    						intent.addCategory(Intent.CATEGORY_DEFAULT);
    						intent.setDataAndType(path1, "application/pdf");
    						intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
    						try {
    							context.startActivity(intent);
    						} catch (ActivityNotFoundException e) {
    							ToastUtil.showToast(context, "打开失败");
    						}
    					} catch (MalformedURLException e) {
    						e.printStackTrace();
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					} catch (ExecutionException e) {
    						e.printStackTrace();
    					}
    				
    其中用到的两个工具类:

    package com.md.apic.utils;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.concurrent.Callable;
    
    public class Downloader implements Callable<File> {
    	protected int connectTimeout = 30 * 1000;
    	protected int readTimeout = 1 * 1000 * 1000;
    
    	protected int speedRefreshInterval = 500;
    
    	protected byte[] buffer;
    
    	private URL url;
    	private File file;
    
    	private float averageSpeed;
    	private float currentSpeed;
    
    	public Downloader() {
    		buffer = new byte[8 * 1024];
    	}
    
    	public void setUrlAndFile(URL url, File file) {
    		this.url = url;
    		this.file = file;
    		this.averageSpeed = 0;
    		this.currentSpeed = 0;
    	}
    
    	public URL getUrl() {
    		return url;
    	}
    
    	public File getFile() {
    		return file;
    	}
    
    	public float getAverageSpeed() {
    		return averageSpeed;
    	}
    
    	public float getCurrentSpeed() {
    		return currentSpeed;
    	}
    
    	@Override
    	public File call() throws Exception {
    		StopWatch watch = new StopWatch();
    		watch.start();
    
    		InputStream in = null;
    		OutputStream out = null;
    		try {
    			URLConnection conn = url.openConnection();
    			conn.setConnectTimeout(connectTimeout);
    			conn.setReadTimeout(readTimeout);
    			conn.connect();
    
    			in = conn.getInputStream();
    			out = new FileOutputStream(file);
    
    			int time = 0;
    			int bytesInTime = 0;
    			for (;;) {
    				watch.split();
    				int bytes = in.read(buffer);
    				if (bytes == -1) {
    					break;
    				}
    				out.write(buffer, 0, bytes);
    
    				time += watch.getTimeFromSplit();
    				if (time >= speedRefreshInterval) {
    					currentSpeed = getSpeed(bytesInTime, time);
    					time = 0;
    					bytesInTime = 0;
    				}
    			}
    		} catch (IOException e) {
    			file.delete();
    			throw e;
    		} finally {
    			if (in != null) {
    				try {
    					in.close();
    				} catch (IOException e) {
    				}
    			}
    			if (out != null) {
    				try {
    					out.flush();
    					out.close();
    				} catch (IOException e) {
    				}
    			}
    		}
    
    		watch.stop();
    		averageSpeed = getSpeed(file.length(), watch.getTime());
    
    		return file;
    	}
    
    	private static float getSpeed(long bytesInTime, long time) {
    		return (float) bytesInTime / 1024 / ((float) time / 1000);
    	}
    }

    package com.md.apic.utils;
    
    import java.util.concurrent.TimeUnit;
    
    public class StopWatch {
    	private long startTime;
    	private long stopTime;
    
    	private State state;
    	private boolean split;
    
    	public StopWatch() {
    		reset();
    	}
    
    	public void start() {
    		if (state == State.UNSTARTED) {
    			startTime = System.nanoTime();
    			state = State.RUNNING;
    			return;
    		}
    		throw new RuntimeException("Stopwatch already started or stopped.");
    	}
    
    	public void stop() {
    		switch (state) {
    		case RUNNING: {
    			stopTime = System.nanoTime();
    		}
    		case SUSPENDED: {
    			state = State.STOPPED;
    			split = false;
    			return;
    
    		}
    		}
    		throw new RuntimeException("Stopwatch is not running.");
    	}
    
    	public void reset() {
    		state = State.UNSTARTED;
    		split = false;
    	}
    
    	public void split() {
    		if (state == State.RUNNING) {
    			stopTime = System.nanoTime();
    			split = true;
    			return;
    		}
    		throw new RuntimeException("Stopwatch is not running.");
    	}
    
    	public void suspend() {
    		if (state == State.RUNNING) {
    			stopTime = System.nanoTime();
    			state = State.SUSPENDED;
    			return;
    		}
    		throw new RuntimeException("Stopwatch must be running to suspend.");
    	}
    
    	public void resume() {
    		if (state == State.SUSPENDED) {
    			startTime += System.nanoTime() - stopTime;
    			state = State.RUNNING;
    			return;
    		}
    		throw new RuntimeException("Stopwatch must be suspended to resume.");
    	}
    
    	public long getTime() {
    		return TimeUnit.NANOSECONDS.toMillis(getNanoTime());
    	}
    
    	public long getNanoTime() {
    		switch (state) {
    		case RUNNING: {
    			return System.nanoTime() - startTime;
    		}
    		case STOPPED:
    		case SUSPENDED: {
    			return stopTime - startTime;
    		}
    		case UNSTARTED: {
    			return 0;
    		}
    		}
    		throw new RuntimeException("Should never get here.");
    	}
    
    	public long getSplitTime() {
    		return TimeUnit.NANOSECONDS.toMillis(getSplitNanoTime());
    	}
    
    	public long getSplitNanoTime() {
    		if (split) {
    			return stopTime - startTime;
    		}
    		throw new RuntimeException(
    				"Stopwatch must be running and split to get the split time.");
    	}
    
    	public long getTimeFromSplit() {
    		return TimeUnit.NANOSECONDS.toMillis(getNanoTimeFromSplit());
    	}
    
    	public long getNanoTimeFromSplit() {
    		if (state == State.RUNNING && split) {
    			return System.nanoTime() - stopTime;
    		}
    		throw new RuntimeException(
    				"Stopwatch must be running and split to get the time from split.");
    	}
    
    	enum State {
    		UNSTARTED, RUNNING, STOPPED, SUSPENDED
    	}
    
    }
    由于代码是大神给的,出处不可考证了,若有人发现,望告知,谢谢啦!


    展开全文
  • Android实现搜索手机内的PDF文件

    千次阅读 热门讨论 2019-09-23 18:01:58
    最近在做结算功能,需要上传发票功能,发票有电子和图片发票...刚开始使用的文件管理器搜索手机内的PDF文件,在4.4系统上面打开文件管理器可以过滤掉非.pdf格式文件,在6.0及以上系统没有过滤掉,用的是intent打开u...

          最近在做结算功能,需要上传发票功能,发票有电子和图片发票两种,技术这边有两种方案,一种是上传图片文件,还有一种是上传PDF格式发票文件,但是结算时财务说图片文件上面没有公司盖章,是无效的,于是把方案改为电子发票PDF和纸质发票,刚开始使用的文件管理器搜索手机内的PDF文件,在4.4系统上面打开文件管理器可以过滤掉非.pdf格式文件,在6.0及以上系统没有过滤掉,用的是intent打开url的方式打开文件管理器,在返回的结果中根据URL转化为文件,然后上传。

    先上效果图,无图无真相,图能说明一切:

    1.Intent方式打开pdf格式文件:

      Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("application/pdf");
            try {
               startActivityForResult(intent, REQUEST_CODE);
           } catch (ActivityNotFoundException e) {
                //alert user that file manager not working
                ToastUtils.ToastShort(Utils.getContext().getResources().getString(R.string.toast_pick_file_error));
            }
    

    这种方式也可以拿到.pdf格式的文件,但是在小米手机上有个最近文件记录打开时返回报错,由于时间和项目着急上线,所以没有适配6.0及以上系统的手机,采用了第2种方式----通过ContentProvider搜索手机内的.pdf格式文件

    2.通过ContentProvider搜索pdf格式文件核心代码如下:

    博主中搜索的是.pdf格式的文件,如果想搜索其他格式文件方法类似,改后缀名比如.txt,.doc,.png等等,小伙伴们可以自行尝试下,看看效果如何,这里就不一一尝试和介绍了.

    /**
     * 获取手机文档数据
     *
     * @param
     */
    public void getDocumentData() {
    
        String[] columns = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.SIZE, MediaStore.Files.FileColumns.DATE_MODIFIED, MediaStore.Files.FileColumns.DATA};
    
        String select = "(_data LIKE '%.pdf')";
    
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Files.getContentUri("external"), columns, select, null, null);
    
        int columnIndexOrThrow_DATA = 0;
        if (cursor != null) {
            columnIndexOrThrow_DATA = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
        }
    
        if (cursor != null) {
            while (cursor.moveToNext()) {
    
                String path = cursor.getString(columnIndexOrThrow_DATA);
    
                PDFFileInfo document = PDFUtil.getFileInfoFromFile(new File(path));
    
                pdfData.add(document);
                Log.d(TAG, " pdf " + document);
            }
        }
        cursor.close();
    }

    3.PDFSearchActivity代码:

    public class PDFSearchActivity extends AppCompatActivity {
        private RecyclerView mRecyclerView;
        private ProgressDialog progressDialog;
        private PDFAdapter pdfAdapter;
        private ImageView imgBack;
        private TextView tvTitle;
        private TextView tvFinish;
        private ArrayList<PDFFileInfo> pdfData = new ArrayList<>();
        private String TAG = PDFSearchActivity.class.getSimpleName();
    
    
        @SuppressLint("HandlerLeak")
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    initRecyclerView();
                }
            }
        };
    
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_pdf_select);
            initViews();
            initListener();
        }
    
        private void initViews() {
            mRecyclerView = findViewById(R.id.rv_pdf);
            imgBack = findViewById(R.id.iv_back);
            tvTitle = findViewById(R.id.tv_title);
            tvFinish = findViewById(R.id.tv_right);
            tvTitle.setText("PDF文件搜索");
    
            imgBack.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
    
            showDialog();
    
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    getFolderData();
                }
            }.start();
        }
    
        private void initListener() {
    
        }
    
        private void showDialog() {
            progressDialog = new ProgressDialog(this, ProgressDialog.THEME_HOLO_LIGHT);
            progressDialog.setMessage("正在加载数据中...");
            progressDialog.setCanceledOnTouchOutside(false);
            progressDialog.show();
        }
    
    
        private void initRecyclerView() {
            pdfAdapter = new PDFAdapter(this);
            View notDataView = getLayoutInflater().inflate(R.layout.pdf_empty_view, (ViewGroup) mRecyclerView.getParent(), false);
    
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
            mRecyclerView.setAdapter(pdfAdapter);
    
            pdfAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
    
                    if (!pdfData.get(position).isSelect()) {
                        if (getSelectNumber() >= 3) {
                            Toast.makeText(PDFSearchActivity.this, "最多可选择3个文件", Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
    
                    for (int i = 0; i < pdfData.size(); i++) {
                        if (i == position) {
                            if (pdfData.get(i).isSelect()) {
                                pdfData.get(i).setSelect(false);
                            } else {
                                pdfData.get(i).setSelect(true);
                            }
                        }
                    }
                    adapter.notifyDataSetChanged();
    
                    tvFinish.setText("完成(" + getSelectNumber() + ")");
    
    
                }
            });
            if (pdfData != null && pdfData.size() > 0) {
    
                for (int i = 0; i < pdfData.size(); i++) {
                    pdfData.get(i).setSelect(false);
                }
                pdfAdapter.setNewData(pdfData);
            } else {
                pdfAdapter.setEmptyView(notDataView);
            }
            progressDialog.dismiss();
        }
    
    
        /**
         * 遍历文件夹中资源
         */
        public void getFolderData() {
            getDocumentData();
            handler.sendEmptyMessage(1);
        }
    
        /**
         * 获取手机文档数据
         *
         * @param
         */
        public void getDocumentData() {
    
            String[] columns = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.SIZE, MediaStore.Files.FileColumns.DATE_MODIFIED, MediaStore.Files.FileColumns.DATA};
    
            String select = "(_data LIKE '%.pdf')";
    
            ContentResolver contentResolver = getContentResolver();
            Cursor cursor = contentResolver.query(MediaStore.Files.getContentUri("external"), columns, select, null, null);
    
            int columnIndexOrThrow_DATA = 0;
            if (cursor != null) {
                columnIndexOrThrow_DATA = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
            }
    
            if (cursor != null) {
                while (cursor.moveToNext()) {
    
                    String path = cursor.getString(columnIndexOrThrow_DATA);
    
                    PDFFileInfo document = PDFUtil.getFileInfoFromFile(new File(path));
    
                    pdfData.add(document);
                    Log.d(TAG, " pdf " + document);
                }
            }
            cursor.close();
        }
    
        private int getSelectNumber() {
            int k = 0;
            for (int i = 0; i < pdfData.size(); i++) {
                if (pdfData.get(i).isSelect()) {
                    k++;
                }
            }
            return k;
        }
    
    }
    

    4.activity_pdf_select.xml代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <include
            layout="@layout/toolbar"/>
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_pdf"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </androidx.recyclerview.widget.RecyclerView>
    
    </LinearLayout>

    5.PDFAdapter代码:

    /**
     * @作者: njb
     * @时间: 2019/9/11 20:31
     * @描述: pdf文件适配器类
     */
    public class PDFAdapter extends BaseQuickAdapter<PDFFileInfo, BaseViewHolder> {
    
        public PDFAdapter(@Nullable List<PDFFileInfo> data) {
            super(R.layout.item_pdf,data);
        }
    
    
        @Override
        protected void convert(BaseViewHolder helper, PDFFileInfo item) {
            if(item == null){
                return;
            }
            helper.setText(R.id.tv_name , item.getFileName());
            helper.setText(R.id.tv_size , PDFUtil.FormetFileSize(item.getFileSize()));
            helper.setText(R.id.tv_time , item.getTime());
            if (item.isSelect()){
                helper.getView(R.id.img_select).setBackgroundResource(R.mipmap.reward_selection_ok);
            }else {
                helper.getView(R.id.img_select).setBackgroundResource(R.mipmap.reward_selection_no);
    
            }
        }
    }

    6.PDFUtil

    public class PDFUtil {
    
        /**
         * 读取文件的最后修改时间的方法
         */
        public static String getFileLastModifiedTime(File f) {
            Calendar cal = Calendar.getInstance();
            long time = f.lastModified();
            SimpleDateFormat formatter = new
                    SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            cal.setTimeInMillis(time);
            return formatter.format(cal.getTime());
        }
    
    
    
    
        public static PDFFileInfo getFileInfoFromFile(File file) {
            PDFFileInfo fileInfo = new PDFFileInfo();
            fileInfo.setFileName(file.getName());
            fileInfo.setFilePath(file.getPath());
            fileInfo.setFileSize(file.length());
    //        fileInfo.setDirectory(file.isDirectory());
            fileInfo.setTime(PDFUtil.getFileLastModifiedTime(file));
            int lastDotIndex = file.getName().lastIndexOf(".");
            if (lastDotIndex > 0) {
                String fileSuffix = file.getName().substring(lastDotIndex + 1);
    //            fileInfo.setSuffix(fileSuffix);
            }
            return fileInfo;
        }
    
        public static String FormetFileSize(long fileS) {
            DecimalFormat df = new DecimalFormat("#.00");
            String fileSizeString = "";
            String wrongSize = "0B";
            if (fileS == 0) {
                return wrongSize;
            }
            if (fileS < 1024) {
                fileSizeString = df.format((double) fileS) + "B";
            } else if (fileS < 1048576) {
                fileSizeString = df.format((double) fileS / 1024) + "KB";
            } else if (fileS < 1073741824) {
                fileSizeString = df.format((double) fileS / 1048576) + "MB";
            } else {
                fileSizeString = df.format((double) fileS / 1073741824) + "GB";
            }
            return fileSizeString;
        }
    
        /**
         * 利用文件url转换出文件名
         *
         * @param url
         * @return
         */
        public static String parseName(String url) {
            String fileName = null;
            try {
                fileName = url.substring(url.lastIndexOf("/") + 1);
            } finally {
                if (TextUtils.isEmpty(fileName)) {
                    fileName = String.valueOf(System.currentTimeMillis());
                }
            }
            return fileName;
        }
    
    
        /**
         * 将url进行encode,解决部分手机无法下载含有中文url的文件的问题(如OPPO R9)
         *
         * @param url
         * @return
         * @author xch
         */
        public static String toUtf8String(String url) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < url.length(); i++) {
                char c = url.charAt(i);
                if (c >= 0 && c <= 255) {
                    sb.append(c);
                } else {
                    byte[] b;
                    try {
                        b = String.valueOf(c).getBytes("utf-8");
                    } catch (Exception ex) {
                        System.out.println(ex);
                        b = new byte[0];
                    }
                    for (int j = 0; j < b.length; j++) {
                        int k = b[j];
                        if (k < 0)
                            k += 256;
                        sb.append("%" + Integer.toHexString(k).toUpperCase());
                    }
                }
            }
            return sb.toString();
        }
    
        public static String parseFormat(String fileName) {
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        }
    }
    

    7.PDFAdapter的Item代码

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="@dimen/space_10">
    
        <ImageView
            android:id="@+id/img"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:src="@mipmap/pdf" />
    
        <ImageView
            android:id="@+id/img_select"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:background="@mipmap/reward_selection_no"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="深入浅出nodejs.pdf"
            android:layout_marginLeft="6dp"
            android:layout_marginRight="6dp"
            app:layout_constraintLeft_toRightOf="@+id/img"
            app:layout_constraintRight_toLeftOf="@+id/img_select"/>
    
        <TextView
            android:id="@+id/tv_size"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:text="KB"
            android:textSize="@dimen/text_size_11"
            app:layout_constraintTop_toBottomOf="@+id/tv_name"
            app:layout_constraintLeft_toRightOf="@+id/img"
            android:layout_marginLeft="6dp"/>
    
        <TextView
            android:id="@+id/tv_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="6dp"
            android:text="2019-09-21"
            android:textSize="@dimen/text_size_11"
            app:layout_constraintLeft_toRightOf="@+id/img"
            app:layout_constraintBottom_toBottomOf="parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>

    8.pdf_search_shape.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <solid android:color="@color/colorPrimary"/>
        <corners android:radius="@dimen/space_10"/>
    </shape>

    9.pdf_empty_view.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:gravity="center"
        android:background="@color/white"
        android:orientation="vertical"
        android:layout_height="match_parent">
        <ImageView
            android:layout_gravity="center"
            android:id="@+id/iv_nodata"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/no_date_without_text"
            android:visibility="visible" />
        <TextView
            android:id="@+id/tvTip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/str_blank"
            />
    </LinearLayout>

    10.Manifast加上权限申请

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    11.在MainActivity动态申请权限

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "RxPermissionTest";
        private Button btnUpload;
        private ImageView ivBack;
        private TextView tvTitle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
            requestPermission();
    
        }
    
        private void initViews() {
            btnUpload = findViewById(R.id.tv_upload);
            ivBack = findViewById(R.id.iv_back);
            tvTitle = findViewById(R.id.tv_title);
            tvTitle.setText("PDFSearch");
            ivBack.setVisibility(View.GONE);
            btnUpload.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(MainActivity.this, PDFSearchActivity.class));
    
                }
            });
        }
    
        @SuppressLint("InlinedApi")
        private void requestPermission() {
            RxPermissions rxPermissions = new RxPermissions(this);
            rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
            .subscribe(new Consumer<Permission>() {
                @Override
                public void accept(Permission permission) {
                    if (permission.granted) {
                        // 用户已经同意该权限
                        Log.d(TAG, permission.name + " is granted.");
                    } else if (permission.shouldShowRequestPermissionRationale) {
                        // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框
                        Log.d(TAG, permission.name + " is denied. More info should be provided.");
                    } else {
                        // 用户拒绝了该权限,并且选中『不再询问』
                        Log.d(TAG, permission.name + " is denied.");
                    }
    
                }
            });
        }
    }
    

    12.后面会给出源码地址,实现PDF预览功能.欢迎小伙伴们留言,有问题提出,及时改进.

    csdn下载地址:https://download.csdn.net/download/u012556114/11839439,由于现在csdn默认的下载都要积分,不能修改,所以很抱歉哈~~

    没有积分的同学也可以去码云下载源码,地址为:https://gitee.com/jackning_admin/PDFSearch

     

     

    展开全文
  • 微信或手机浏览器在线显示pdf文件

    万次阅读 2018-10-26 15:37:40
    在之前的文章中提到了如何在手机上显示office文件,这里提一下pdf文件如何在手机上展示。问题发生情况是,公司企业号会从OA系统定时获取信息,并且解析内网文章中的图片、文件,展示在微信中,后台发现程序报错,...

    问题及解决

    在之前的文章中提到了如何在手机上显示office文件,这里提一下pdf文件如何在手机上展示。问题发生情况是,公司企业号会从OA系统定时获取信息,并且解析内网文章中的图片、文件,展示在微信中,后台发现程序报错,为什么呢?因为文件的在线预览只处理office软件的,对于pdf文件未处理,导致程序处理时在安卓机的情况下异常,现在使用pdf2html工具进行转换,流程如下:

    (苹果设备无需特殊处理,直接通过文件流设置头部信息application/msword、application/msexcel、application/pdf 内置浏览器能够识别)

    相关链接:

    微信或手机浏览器在线显示office文件:https://blog.csdn.net/myfmyfmyfmyf/article/details/46326329

    pdf2html工具使用:https://www.cnblogs.com/goldenVip/p/6104051.html

     

    效果图

    pdf2html工具转码出来的html很清晰,如果直接放在手机端高度、宽度太大、样式异常,需要对转码后的html进行格式化后展示,后面的示例码,只是简单的处理展示,需要针对进一步优化。

    (其实可以更简单,转码后对html文件进行处理,使用nginx反向代理转码目录,详细页面通过iframe直接连接nginx代理后的url)

     

    示例代码

    -------------------从OA获取图片-----------------

    /**
    	 * 从OA上抓取文件
    	 * @return
    	 */
    	public String getFileFromOa(){	
    		
    		HttpServletRequest req = ServletActionContext.getRequest();
    		String userAgent=req.getHeader("User-Agent");//里面包含了设备类型
    
    		//获得文件地址
    		 String fileUrl = ServletActionContext.getRequest().getParameter("fileUrl");
    		 fileUrl.replaceAll("%2B", "\\+");//转换加号
    		 String fileTypeTemp=fileUrl.substring(fileUrl.lastIndexOf(".")+1,fileUrl.length());
    		 System.out.println("-----------------   "+fileTypeTemp);
    		 //判断是否苹果手机、是否office文件
    		if(-1!=userAgent.indexOf("iPhone")||-1!=fileTypeTemp.indexOf("txt")){
    			//-----------------//
    			//此方法需要浏览器自己能够打开,ios可以但是微信andriod版内置浏览器不支持
    			//-----------------//
    			//如果是苹果手机
    			 fileUrl.replaceAll("%20", "\\+");//转换加号
    			 String strURL = MessageUtil.oaUrl+fileUrl;
    			 String fileType=strURL.substring(strURL.lastIndexOf(".")+1,strURL.length());
    			//获得图片的数据流
    			try {
    				URL oaUrl = new URL(strURL);
    				HttpURLConnection httpConn = (HttpURLConnection) oaUrl.openConnection();
    				InputStream in = httpConn.getInputStream();
    				//获取输出流
    				HttpServletResponse response = ServletActionContext.getResponse();
    				req.setCharacterEncoding("UTF-8");
    				response.setCharacterEncoding("UTF-8");
    				String name=fileUrl.substring(fileUrl.lastIndexOf("/")+1, fileUrl.length());
    	
    				response.setHeader("Content-Disposition",  
    					                   "attachment;filename=" +  
    					                		   new String( (name ).getBytes(),  
    						                                "iso-8859-1"));
    				if("doc".equals(fileType)||"docx".equals(fileType)){
    					response.setContentType("application/msword");
    				}else if("xls".equals(fileType)||"xlsx".equals(fileType)){
    					response.setContentType("application/msexcel"); 
    				}else{
    					response.setContentType("application/"+fileType);
    				}
    				OutputStream out = response.getOutputStream();
    				//输出图片信息
    				byte[] bytes = new byte[1024];  
    				int cnt=0;  
    				while ((cnt=in.read(bytes,0,bytes.length)) != -1) {  
    					out.write(bytes, 0, cnt);  
    				}  
    				out.flush();
    				out.close();
    				in.close();
    	
    			} catch (MalformedURLException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			return null;
    		}else{
    			//如果非苹果手机,自己处理文档
    			
    			 //获得OAuth2验证
    	  		String code=req.getParameter("code");
    	  		String state=req.getParameter("state");
    	  		//根据code获得人员
    	  		MessageUtil msgUtil=new MessageUtil();
    	  		String userId=msgUtil.getUserIdByCode(code);
    			//生成微信js授权
    			String jsapi_ticket=msgUtil.getJsapiTicketFromWx();//签名
    			String url = MessageUtil.webUrl+"/wx/oaNewsMobileAction.do?action=getFileFromOa&fileUrl="+fileUrl;
    	        System.out.println(url);
    			Map<String, String> ret = MessageUtil.sign(jsapi_ticket, url);
    	        
    			req.setAttribute("str1", ret.get("signature"));
    			req.setAttribute("time", ret.get("timestamp"));
    			req.setAttribute("nonceStr", ret.get("nonceStr"));
    			
    			fileUrl.replaceAll("%2B", "\\+");//转换加号
    			String strURL = MessageUtil.oaUrl+fileUrl;
    			//在本地存放OA文件,然后转换成html,再对文档中的图片路径进行修改,最后输出到页面
    			try {
    				URL oaUrl = new URL(strURL);
    				HttpURLConnection httpConn = (HttpURLConnection) oaUrl.openConnection();
    				InputStream in = httpConn.getInputStream();
    				//获取输出流
    				HttpServletResponse response = ServletActionContext.getResponse();
    				req.setCharacterEncoding("UTF-8");
    				response.setCharacterEncoding("UTF-8");
    				String name=fileUrl.substring(fileUrl.lastIndexOf("/")+1, fileUrl.length());
    				
    				//首先判断本地是否存在
    				String path=req.getRealPath("");
    				path=path.substring(0, path.lastIndexOf("\\")+1);
    				File htmlFile=new File(path +  "OaFileToHtml\\"+name+".html");
    				if(!htmlFile.exists()){
    					//判断文件夹是否存在,创建文件夹
    					String oaFilePath=path + "OaFile";//存放OA文档的文件夹路径;
    					File oaFiles=new File(oaFilePath);
    					if(!oaFiles.exists()){
    						//如果文件夹不存在创建文件夹
    						oaFiles.mkdirs();
    					}
    					//将OA消息存入本地
    					File oafile=new File(oaFiles+ File.separator +name);
    					OutputStream out = new FileOutputStream(oafile);
    					//输出图片信息
    					byte[] bytes = new byte[1024];  
    					int cnt=0;  
    					while ((cnt=in.read(bytes,0,bytes.length)) != -1) {  
    						out.write(bytes, 0, cnt);  
    					}  
    					out.flush();
    					out.close();
    					in.close();
    					//转换成html
    					String htmlFilePath =path + "OaFileToHtml";//OA文件转成html的位置
    
    					if(-1!=fileTypeTemp.indexOf("pdf")){
    						//如果是pdf文件
    						String htmlcontext = Pdf2htmlEXUtil.pdf2html_oa("D:\\pdf2htmlEX-v1.0\\pdf2htmlEX.exe",oafile.getPath(),htmlFilePath,oafile.getName());
    						req.setAttribute("htmlcontext", htmlcontext);
    					}else{
    						//如果是office文件
    						String htmlcontext=ConvertFileToHtml.toHtmlString(oafile, htmlFilePath);
    						req.setAttribute("htmlcontext", htmlcontext);
    					}
    					
    				}else{
    					//已经存在转换成功的文档
    					StringBuffer htmlSb = new StringBuffer();
    					try {
    						BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(htmlFile),Charset.forName("gb2312")));
    						while (br.ready()) {
    							htmlSb.append(br.readLine());
    						}
    						br.close();
    						// 删除临时文件
    						//htmlFile.delete();
    					} catch (FileNotFoundException e) {
    						e.printStackTrace();
    					} catch (IOException e) {
    						e.printStackTrace();
    					}
    					// HTML文件字符串
    					String htmlStr = htmlSb.toString();
    					//System.out.println("htmlStr=" + htmlStr);
    					if(-1!=fileTypeTemp.indexOf("pdf")){
    						//如果是pdf文件
    						req.setAttribute("htmlcontext", Pdf2htmlEXUtil.clearFormat(htmlStr,""));
    					}else{
    						//如果是office文件
    						// 返回经过清洁的html文本
    						req.setAttribute("htmlcontext", ConvertFileToHtml.clearFormat(htmlStr, ""));
    					}
    					
    				}
    				
    			} catch (MalformedURLException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			return "lookfile";
    		}
    		
    	}

    -------------------pdf2html将pdf转成html文件-----------------

    package com.wx.util;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class Pdf2htmlEXUtil {
        /**
         * 调用pdf2htmlEX将pdf文件转换为html文件
         * 
         * @param exeFilePath
         *            pdf2htmlEX.exe文件路径
         * @param pdfFile
         *            pdf文件绝对路径
         * @param [destDir] 生成的html文件存放路径
         * @param htmlName
         *            生成的html文件名称
         * @return
         */
        public static boolean pdf2html(String exeFilePath, String pdfFile,
                String destDir, String htmlFileName) {
            if (!(exeFilePath != null && !"".equals(exeFilePath) && pdfFile != null
                    && !"".equals(pdfFile) && htmlFileName != null && !""
                        .equals(htmlFileName))) {
                System.out.println("传递的参数有误!");
                return false;
            }
            Runtime rt = Runtime.getRuntime();
            StringBuilder command = new StringBuilder();
            command.append(exeFilePath).append(" ");
            if (destDir != null && !"".equals(destDir.trim()))// 生成文件存放位置,需要替换文件路径中的空格
                command.append("--dest-dir ").append(destDir.replace(" ", "\" \""))
                        .append(" ");
            command.append("--optimize-text 1 ");// 尽量减少用于文本的HTML元素的数目 (default: 0)
            command.append("--zoom 1.4 ");
            command.append("--process-outline 0 ");// html中显示链接:0——false,1——true
            command.append("--font-format woff ");// 嵌入html中的字体后缀(default ttf)
                                                    // ttf,otf,woff,svg
            command.append(pdfFile.replace(" ", "\" \"")).append(" ");// 需要替换文件路径中的空格
            if (htmlFileName != null && !"".equals(htmlFileName.trim())) {
                command.append(htmlFileName);
                if (htmlFileName.indexOf(".html") == -1)
                    command.append(".html");
            }
            try {
                System.out.println("Command:" + command.toString());
                Process p = rt.exec(command.toString());
                StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(),
                        "ERROR");
                // 开启屏幕标准错误流
                errorGobbler.start();
                StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(),
                        "STDOUT");
                // 开启屏幕标准输出流
                outGobbler.start();
                int w = p.waitFor();
                int v = p.exitValue();
                if (w == 0 && v == 0) {
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        public static boolean pdf2html_linux(String pdfFile, String destDir,
                String htmlFileName) {
            if (!(pdfFile != null && !"".equals(pdfFile) && htmlFileName != null && !""
                    .equals(htmlFileName))) {
                System.out.println("传递的参数有误!");
                return false;
            }
            Runtime rt = Runtime.getRuntime();
            StringBuilder command = new StringBuilder();
            command.append("pdf2htmlEX").append(" ");
            if (destDir != null && !"".equals(destDir.trim()))// 生成文件存放位置,需要替换文件路径中的空格
                command.append("--dest-dir ").append(destDir.replace(" ", "\" \""))
                        .append(" ");
            command.append("--optimize-text 1 ");// 尽量减少用于文本的HTML元素的数目 (default: 0)
            command.append("--process-outline 0 ");// html中显示链接:0——false,1——true
            command.append("--font-format woff ");// 嵌入html中的字体后缀(default ttf)
                                                    // ttf,otf,woff,svg
            command.append(pdfFile.replace(" ", "\" \"")).append(" ");// 需要替换文件路径中的空格
            if (htmlFileName != null && !"".equals(htmlFileName.trim())) {
                command.append(htmlFileName);
                if (htmlFileName.indexOf(".html") == -1)
                    command.append(".html");
            }
            try {
                System.out.println("Command:" + command.toString());
                Process p = rt.exec(command.toString());
                StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(),
                        "ERROR");
                // 开启屏幕标准错误流
                errorGobbler.start();
                StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(),
                        "STDOUT");
                // 开启屏幕标准输出流
                outGobbler.start();
                int w = p.waitFor();
                int v = p.exitValue();
                if (w == 0 && v == 0) {
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
        
        
        
        //转换OA的pdf文件
        public static String pdf2html_oa(String exeFilePath, String pdfFile,String destDir, String htmlFileName) {
        	boolean flag =pdf2html(exeFilePath,pdfFile,destDir,htmlFileName);
        	//
        	if(true == flag){
        		String htmlFile = destDir+File.separator+htmlFileName;
    	    	// 获取html文件流
    			StringBuffer htmlSb = new StringBuffer();
    			try {
    				BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(htmlFile),Charset.forName("gb2312")));
    				while (br.ready()) {
    					htmlSb.append(br.readLine());
    				}
    				br.close();
    				// 删除临时文件
    				//htmlFile.delete();
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			// HTML文件字符串
    			String htmlStr = htmlSb.toString();
    			//System.out.println("htmlStr=" + htmlStr);
    			// 返回经过清洁的html文本
    			return Pdf2htmlEXUtil.clearFormat(htmlStr,"");
        	}
        	else{
        		return "";
        	}
        }
        
    	/**
    	 * 
    	 * 清除pdf中一些不需要的html标记
    	 * 
    	 * 
    	 * 
    	 * @param htmlStr
    	 * 
    	 *            带有复杂html标记的html语句
    	 * 
    	 * @return 去除了不需要html标记的语句
    	 */
    
    	public static String clearFormat(String htmlStr, String docImgPath) {
    
    		
    //		htmlStr = htmlStr.replaceFirst("<BODY", "<DIV style='width:100%' ").replaceAll("</BODY>", "</DIV>");
    //		htmlStr = htmlStr.replaceFirst("<body", "<div style='width:100%' ").replaceAll("</body>", "</div>");
    //		htmlStr = htmlStr.replaceFirst("<img", "<img style='width:100%' ").replaceAll("</img>", "</img>");
    //		htmlStr = htmlStr.replaceAll("<!DOCTYPE html>", "").replaceAll("<html>", "").replaceAll("</html>", "");
    //		htmlStr = htmlStr.replaceAll("<head>", "").replaceAll("</head>", "");
    //		htmlStr = htmlStr.replaceAll("<meta[\\s\\S]*>","");
    //		htmlStr = htmlStr.replaceAll("<title[^)]*>","");
    		
    		// 获取body内容的正则
    		String bodyReg = "<body .*</body>";
    		Pattern bodyPattern = Pattern.compile(bodyReg);
    		Matcher bodyMatcher = bodyPattern.matcher(htmlStr);
    		if (bodyMatcher.find()) {
    			// 获取BODY内容,并转化BODY标签为DIV
    			htmlStr = bodyMatcher.group().replaceFirst("<body", "<DIV").replaceAll("</body>", "</DIV>");
    		}
    		htmlStr = htmlStr.replaceAll("<img", "<img style='width:100vw;height:100vh' ");
    //
    //		// 把<P></P>转换成</div></div>保留样式
    //		// content = content.replaceAll("(<P)([^>]*>.*?)(<\\/P>)",
    //		// "<div$2</div>");
    //		// 把<P></P>转换成</div></div>并删除样式
    //		htmlStr = htmlStr.replaceAll("(<P)([^>]*)(>.*?)(<\\/P>)", "<p$3</p>");
    //		// 删除不需要的标签
    //		htmlStr = htmlStr.replaceAll("<[/]?(font|FONT|span|SPAN|xml|XML|del|DEL|ins|INS|meta|META|[ovwxpOVWXP]:\\w+)[^>]*?>","");
    //		// 删除不需要的属性
    //		htmlStr = htmlStr.replaceAll("<([^>]*)(?:lang|LANG|class|CLASS|style|STYLE|size|SIZE|face|FACE|[ovwxpOVWXP]:\\w+)=(?:'[^']*'|\"\"[^\"\"]*\"\"|[^>]+)([^>]*)>","<$1$2>");
    //		//处理图片height
    //		//htmlStr = htmlStr.replaceAll("(<img[^>]*?)\\s+width\\s*=\\s*\\S+","$1"); 
    //		htmlStr = htmlStr.replaceAll("(<img[^>]*?)\\s+height\\s*=\\s*\\S+","$1"); 
    //		htmlStr = htmlStr.replaceAll("(<IMG[^>]*?)\\s+HEIGHT\\s*=\\s*\\S+","$1"); 
    		return htmlStr;
    
    	}
        
        public static void main(String[] args) {
        	//测试转换工具
            pdf2html("D:\\pdf2htmlEX-v1.0\\pdf2htmlEX.exe","G:\\20181024.pdf","D:\\pdf2htmlEX-v1.0\\HTML","my.html");
        
        	//测试转换OA文件
            pdf2html_oa("D:\\pdf2htmlEX-v1.0\\pdf2htmlEX.exe","G:\\20181024.pdf","D:\\pdf2htmlEX-v1.0\\HTML","my.html");
        }
    }
    

    -------------------转码线程,可以不用线程,也可以同步转换-----------------

    package com.haiyisoft.wx.util;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    /**
     * 
     * 
     * @author muyunfei
     * 
     * <p>Modification History:</p> 
     * <p>Date       Author      Description</p>
     * <p>------------------------------------------------------------------</p>
     * <p>Oct 25, 2018           牟云飞       		 新建</p>
     */
    public class StreamGobbler extends Thread  {
    	InputStream is;
        String type;
        OutputStream os;
    
        public StreamGobbler(InputStream is, String type) {
            this(is, type, null);
        }
    
        StreamGobbler(InputStream is, String type, OutputStream redirect) {
            this.is = is;
            this.type = type;
            this.os = redirect;
        }
    
        public void run() {
            InputStreamReader isr = null;
            BufferedReader br = null;
            PrintWriter pw = null;
            try {
                if (os != null)
                    pw = new PrintWriter(os);
                isr = new InputStreamReader(is);
                br = new BufferedReader(isr);
                String line = null;
                while ((line = br.readLine()) != null) {
                    if (pw != null)
                        pw.println(line);
                    System.out.println(type + ">" + line);
                }
                if (pw != null)
                    pw.flush();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } finally {
                try {
                    if (pw != null)
                        pw.close();
                    if (br != null)
                        br.close();
                    if (isr != null)
                        isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

     

    展开全文
  • 微信公众号,点击按钮打开pdf文件流,安卓跳转到浏览器里下载,ios可预览但默认不能下载 注:在pc上开始时采用这两种方式是没有效果的,或者打开的是空页面,但上线到公众号是没有问题的!!!!!!!!! 方法一...
  • 手机收到了PDF文件,那么我们如何去用手机PDF阅读器来查看PDF文件中的文字批注呢?其实查阅PDF文件中的批注是一件很简单的事情,就看你是否使用了正确的PDF阅读器了! PDF阅读器下载http://qingkuaipdf.com 1.先...
  • 有时为了工作需要我们要将PDF...1:首先打开手机,在AppStore里搜索需要的文件转换工具PDF转换器; 2:其次运行工具,在“PDF转换器”页面选择文件转换格式,今天需要用到的是“PDF转换其他格式”。 3:点击“PDF...
  • iPhone手机怎么把PDF文件转为JPG图片

    千次阅读 2019-09-17 17:36:37
    PDF格式是最近比较流行的一种文件格式,很多时候会遇到PDF文件格式转换其他文件,那苹果手机给怎么让PDF文件转换JPG文件呢?知道的朋友可以看看下面的方法。 1:首先打开手机,在AppStore里搜索需要的文件...
  • oss 浏览器访问pdf文件不能预览

    千次阅读 2020-04-13 11:58:17
    检查以下两项 1,http头Content-Type:application/pdf 2,文件名不能带();
  • 关于ios系统的bug这块也是快把柚子给逼疯了啊,ios系统是没有文件管理的,柚子用了很多办法,最后终于确定管用什么办法ios都是实现下载的,只能实现在线查看。所以没办法,如果考虑兼容ios的话,是很简单就...
  • iPhone手机如何将PDF文件转化成图片

    千次阅读 2018-09-07 16:12:57
    这也是最近比较流行的一种文件格式,但是有时候会将这种文件的格式进行转换,一遇到PDF文件转换很多人都苦恼,今天小编就告诉大家苹果手机只需要用迅捷PDF转换器,就可以轻轻松松的实现PDF文件转图片,信的朋友就...
  • 如何将手机CAJ转换成PDF文件的方法

    千次阅读 2020-10-26 11:46:22
    从知网搜索下载的资源原文档都是caj格式,但是如果我们是在手机上面操作,下载后想要打开CAJ阅览就比较难,手机CAJ阅读器比较少,而PDF阅读器就比较多了,所以一般我们会将手机里的CAJ转换成PDF。 既然是手机转换,...
  • PDFhttp://mozilla.github.io/pdf.js/ 下载地址:http://mozilla.github.io/pdf.js/getting_started/#download Stable (v2.0.943)稳定版 下载解压 build web 然后配置我们服务器上(注:本地会提示我们) ...
  • 在网上下载了可预览pdf的Demo,自己改了些,用在了小程序的项目里,自用没问题。
  • pdf文件在线预览,兼容多浏览器和手机

    万次阅读 热门讨论 2018-11-06 12:18:44
    最近学习了一下网页在线预览pdf文件的实现方式,主要有: PDFObject:使用起来非常方便,电脑端兼容性好,试过兼容ie9,也很快,但在手机上一些浏览器无法在线. jquery.media.js:使用起来非常方便,支持ie。ie的...
  • Android下载并打开PDF文件

    千次阅读 2017-07-06 16:27:38
    1.下载PDF文件到本地 private void downFile(){ String urlString = "http://14.215.72.79/file3.data.weipan.cn/61710973/8e6cfb727a439608032a222755e9c8e366cfb252?ip=1499330937,183.14.31.194&ssig=gpMUwX
  • Image 图像转化 PDF 文件

    千次阅读 2018-04-12 10:44:04
    开发中如果有这样的需求把 Image 图像转化 PDF 文件你会怎么做呢?你可能会在网上狂找资料寻找解决方案,但是事实上网上这方面的资料非常少,有的作者没有给出一个完整的内容或者给出的内容适合现在的需求、有...
  • pdf.js实际应用pdf文件手机版浏览

    千次阅读 2017-05-20 16:03:04
    pdf.js实际应用pdf文件手机版浏览 之前百度pdf.js怎么用,找到的基本都不能用,后来研究了一下研究出来了直接粘贴代码就可以用,小白适用,大神请跳过 这个要在线上测试,线下是不能成功 //pdf.js文件 //...
  • 关于 Safari 无法下载 pdf 文件的问题

    千次阅读 2018-12-19 01:05:00
    找了很长时间,使用了各种方法,后来在一开源下载工具FileSaver.js的讨论中了解到苹果这边目前暂支持 相关讨论帖 https://github.com/eligrey/FileSaver.js/issues/12 ...
  • php使浏览器直接下载pdf文件的方法

    千次阅读 2013-11-16 07:14:11
    本文介绍如何让用户打开pdf文件时不是直接在浏览器浏览而是直接以下载文件形式把pdf文件下载到电脑有的浏览器安装了pdf打开程序关联到浏览器,所以直接写上pdf路径时是打开pdf而不是下载,下面我就说下如果让他们...
  • http://mozilla.github.io/pdf.js/getting_started/#download  下载网址 选择 Stable(v11.9.426)版本 在AndroidStudio 建立的工程的app下的main目录 右键--new--Folder--Assets Folder.  在main 目录下会...
  • 众所周知,android的原生程序或者HTML 5在android手机不能直接打开pdf文件。如何用一个替代的方案解决这个问题呢?我在HTML 5上是这样解决的,使用pdf.js框架。网上关于pdf.js介绍有很多,比如这个: ...
  • 直接使用a标签,将href属性的值赋你想要展示的文件的路径地址。 我用自己的手机测试(android)时,主要要经过下面的流程 打开----->首先下载QQ浏览器(手机没有安装的情况下)----->点击下载文件(这个文件...
  • 小程序之wx.downloadFile、wx.openDocument组合使用(二) 应中间还要接手其他的项目,所以时间间隔有点尴尬,接...,然后产品问能不能 直接使用pdf在线预览(苦笑。。。),当时是懵的,因为没用过,而且小程...
  • Android 在线PDF文件加载

    千次阅读 2018-09-12 16:19:16
    Android加载PDF文件,webview没有直接提供相关的API方法,不像IOS webview可以直接加载PDF文件,不管本地文件或者在线文件,而Android 的webview却不能加载,那么就需要借助第三方或者其他解决方案来实现加载PDF。...
  • pdf文件如何在线转换jpg图片

    千次阅读 2019-02-25 10:39:16
    那么问题来了,PDF转图片是个什么操作?很多人会说,直接截图就好了。的确截图很方便快捷,但是这种方法可能会导致源图片尺寸改变或者色彩失真。那怎么做才能保证PDF转图片内容发生变化呢?今天小编就分享PDF转...
  • 1.插件下载地址:https://mozilla.github.io/pdf.js/ 下载后解压pdfjs-1.10.88-dist.zip文件后得到: 2.把pdfjs-1.10.88-dist放到项目静态资源中... 3.访问自己的页面,默认就是本地文件的方式打开PDF文件,可...
  • Android加载预览PDF文件

    千次阅读 2017-10-20 11:32:44
    Android加载预览PDF文件
  • 在浏览网页时,若您想将一些页面内容收藏,那您可选择保存书签。...为了随时查看页面内容,您可选择保存为PDF文件。下面将详细介绍HTML转换PDF文件的多种方法,您可随意选择最适合自己的方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,938
精华内容 5,575
关键字:

为什么手机不能下载pdf文件