当前位置: 首页 > wzjs >正文

张掖专业做网站的公司Wordpress虚拟资源下载类主题

张掖专业做网站的公司,Wordpress虚拟资源下载类主题,购物优惠券网站怎么做,东莞网络推广哪家公司好最近需要的需求需要Android调用系统打印机,并打印文件,类似如下的功能: Android 调用打印机 实现的逻辑如下: 因为我们这个是 pdf 文件,首先需要将 pdf转化为 Bitmap 位图,然后向调用打印机传递位图即可。 …

最近需要的需求需要Android调用系统打印机,并打印文件,类似如下的功能:

Android 调用打印机

实现的逻辑如下:
因为我们这个是 pdf 文件,首先需要将 pdf转化为 Bitmap 位图,然后向调用打印机传递位图即可。

首先我们需要创建 pdf 转 Bitmap 功能:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.pdf.PdfDocument;
import android.graphics.pdf.PdfRenderer;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.print.PageRange;
import android.print.PrintAttributes;
import android.print.PrintDocumentAdapter;import android.os.CancellationSignal;
import android.print.PrintDocumentInfo;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class BitmapPrintAdapter extends PrintDocumentAdapter {private Context context;private final String pdfPath;private PdfRenderer pdfRenderer;private PrintAttributes printAttributes;private final List<Bitmap> pagesBitmap = new ArrayList<>();public BitmapPrintAdapter(Context context, String pdfPath) {this.context = context;this.pdfPath = pdfPath;}@Overridepublic void onLayout(PrintAttributes oldAttributes,PrintAttributes newAttributes,CancellationSignal cancellationSignal,LayoutResultCallback callback,Bundle extras) {if (cancellationSignal.isCanceled()) {callback.onLayoutCancelled();return;}try {// 释放之前可能存在的资源if (pdfRenderer != null) {for (Bitmap bitmap : pagesBitmap) {if (bitmap != null && !bitmap.isRecycled()) {bitmap.recycle();}}pagesBitmap.clear();pdfRenderer.close();}// 打开PDF文件ParcelFileDescriptor fileDescriptor =ParcelFileDescriptor.open(new File(pdfPath), ParcelFileDescriptor.MODE_READ_ONLY);pdfRenderer = new PdfRenderer(fileDescriptor);// 检查PDF第一页的宽高比来确定方向PdfRenderer.Page firstPage = pdfRenderer.openPage(0);int pdfWidth = firstPage.getWidth();int pdfHeight = firstPage.getHeight();firstPage.close();// 如果宽度大于高度,则为横向// 记录PDF是否为横向boolean isLandscape = pdfWidth > pdfHeight;// 创建新的打印属性,并设置正确的方向PrintAttributes.Builder builder = new PrintAttributes.Builder();if (null != newAttributes){if (null != newAttributes.getMediaSize()){builder.setMediaSize(newAttributes.getMediaSize());}builder.setColorMode(newAttributes.getColorMode());if (null != newAttributes.getResolution()){builder.setResolution(newAttributes.getResolution());}if (null != newAttributes.getMinMargins()){builder.setMinMargins(newAttributes.getMinMargins());}builder.setDuplexMode(newAttributes.getDuplexMode());}if (isLandscape) {// 横向A4builder.setMediaSize(PrintAttributes.MediaSize.ISO_A4.asLandscape());} else {// 纵向A4builder.setMediaSize(PrintAttributes.MediaSize.ISO_A4);}this.printAttributes = builder.build();int pageCount = pdfRenderer.getPageCount();// 对每一页进行预渲染for (int i = 0; i < pageCount; i++) {PdfRenderer.Page page = pdfRenderer.openPage(i);// 创建适合打印尺寸的位图,保持原始比例int pageWidth = page.getWidth();int pageHeight = page.getHeight();// 提高分辨率float scale = 2.5f;int bitmapWidth = (int) (pageWidth * scale);int bitmapHeight = (int) (pageHeight * scale);Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);bitmap.eraseColor(Color.WHITE);  // 白色背景// 渲染PDF页面到位图page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT);pagesBitmap.add(bitmap);page.close();}// 使用正确的方向信息创建文档信息PrintDocumentInfo.Builder infoBuilder = new PrintDocumentInfo.Builder("print_bitmap.pdf").setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).setPageCount(pageCount);PrintDocumentInfo info = infoBuilder.build();// 通知布局完成,并指示打印参数已更改callback.onLayoutFinished(info, newAttributes!= null && !newAttributes.equals(this.printAttributes));} catch (IOException e) {CrashReport.postCatchedException(new RuntimeException("bitmapCreate", e));callback.onLayoutFailed("无法渲染PDF: " + e.getMessage());}}@Overridepublic void onWrite(PageRange[] pageRanges, ParcelFileDescriptor destination,CancellationSignal cancellationSignal,WriteResultCallback callback) {if (cancellationSignal.isCanceled() || pagesBitmap.isEmpty()) {callback.onWriteCancelled();return;}try {// 创建PDF文档输出PdfDocument pdfDocument = new PdfDocument();int totalPages = pagesBitmap.size();// 获取需要打印的实际页面List<Integer> writtenPages = new ArrayList<>();for (PageRange range : pageRanges) {final int start = range.getStart();final int end = range.getEnd();for (int i = start; i <= end && i < totalPages; i++) {writtenPages.add(i);}}// 创建每一页for (int i : writtenPages) {if (cancellationSignal.isCanceled()) {callback.onWriteCancelled();pdfDocument.close();return;}Bitmap bitmap = pagesBitmap.get(i);// 使用位图实际尺寸创建页面信息,确保保持原始方向PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(bitmap.getWidth(),bitmap.getHeight(),i).create();PdfDocument.Page page = pdfDocument.startPage(pageInfo);// 在页面画布上绘制位图Canvas canvas = page.getCanvas();canvas.drawBitmap(bitmap, 0, 0, null);pdfDocument.finishPage(page);}// 写入PDF文档到输出流pdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor()));pdfDocument.close();// 构建实际打印的页面范围PageRange[] actualPages = new PageRange[writtenPages.size()];for (int i = 0; i < writtenPages.size(); i++) {int page = writtenPages.get(i);actualPages[i] = new PageRange(page, page);}callback.onWriteFinished(actualPages);} catch (IOException e) {           callback.onWriteFailed("打印失败: " + e.getMessage());}}@Overridepublic void onFinish() {// 释放资源if (pdfRenderer != null) {pdfRenderer.close();}for (Bitmap bitmap : pagesBitmap) {if (bitmap != null && !bitmap.isRecycled()) {bitmap.recycle();}}pagesBitmap.clear();}}

创建完 Adapter 之后,调用系统代码就比较简单了:

public void printPDF(String savePDFFilePath){PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);PrintAttributes.MediaSize mediaSize = PrintAttributes.MediaSize.ISO_A4;if(detectPdfOrientationIsLandscape()){mediaSize = PrintAttributes.MediaSize.ISO_A4.asLandscape();}// 创建初始打印属性PrintAttributes printAttributes = new PrintAttributes.Builder()// 让打印适配器自动检测方向.setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME).setResolution(new PrintAttributes.Resolution("pdf", "PDF Document", 300, 300)).setMinMargins(PrintAttributes.Margins.NO_MARGINS).setMediaSize(mediaSize).build();printManager.print("BitmapPrintJob_" + System.currentTimeMillis(),new BitmapPrintAdapter(this, savePDFFilePath),printAttributes);}

其中 detectPdfOrientationIsLandscape()为:

private boolean detectPdfOrientationIsLandscape()  {ParcelFileDescriptor fileDescriptor = null ;try {fileDescriptor  =ParcelFileDescriptor.open(new File(savePDFFilePath), ParcelFileDescriptor.MODE_READ_ONLY);PdfRenderer renderer = new PdfRenderer(fileDescriptor);if (renderer.getPageCount() > 0) {PdfRenderer.Page page = renderer.openPage(0);int width = page.getWidth();int height = page.getHeight();BLog.d("PDF Orientation detection: Width=" + width + ", Height=" + height + ", isLandscape=" + (width > height));page.close();return  width > height;}renderer.close();fileDescriptor.close();}catch (IOException e){e.printStackTrace();}finally {FileUtils.INSTANCE.closeQuite(fileDescriptor);}return false;}

OK.


文章转载自:

http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://00000000.ffydh.cn
http://www.dtcms.com/wzjs/603745.html

相关文章:

  • 网站建设质量体系审核指导济南网站建设首选传承网络
  • 如何创建个人网站英语作文wordpress app中文版下载
  • 贵阳网站开发zu97上海协会网站建设
  • 检察门户网站 建设意义怎样提交网站地图
  • 做书法网站的目的网站建设哪家好知道万维科技
  • 做网站的优化价格wordpress作品主题
  • 网站建设牜金手指花总十五辽宁营商环境建设网站
  • 河南建设安全监督网站网页版传奇怎么开
  • 连云港网站seo建网站的支付安全
  • 网站的标准网站换域名影响吗
  • 怎么做学校子网站网站需要做实名认证如何做
  • 上海高端建站网站建设与网页制作案例
  • 怎么判断一个网站做的好不好免费下载app软件下载安装到手机
  • 医院网站建设公司网站建设大题
  • 什么网站做专利检索报告高端网站建设方案报价
  • 网站建设(信科网络)dw超链接自己做的网站
  • 平原网站建设价格魔域网页游戏官网
  • 注册的空间网站python自学
  • 购物网站设计欣赏下列 是计算机网页制作工具
  • 广东省建设教育协会官方网站首页房屋装饰
  • 网站建设找云尚网络做普通网站公司吗
  • 做外贸用哪些网站电商培训机构哪家好
  • 网站域名 安全开发系统软件
  • 做竞品分析的网站网站设计需要在哪方面提升
  • 北京网站seo费用修改wordpress路径
  • 网站分为几种类型做分析图用的地图网站
  • 购物网站首页图片动漫电影做英语教学视频网站
  • 网站建设公司的服务网站建设现状
  • 海南所有的网站建设类公司公司建立网站的好处
  • wordpress文章功能关键词优化是什么意思?