手机文件打印上的文档怎么打印

Android官方开发文档Training系列课程中文版:打印内容之自定义文档打印
对于一些应用,比如绘图类APP,版面设计类APP以及其它APP,这些APP都关注图形的输出,有一个漂亮的打印页面是它们的关键特性。在这种情况下,就不单单是打印一张图片或者是HTML文档这么简单了。这些程序对于这种类型的打印需要对页面中每样事物的控制都特别的精细,包括字体、文本流、页面间距、页眉、页脚以及图形元素。
创建打印输出对于程序来说是完全自定义的,这需要更多设计上的投入,就像上面讨论的那样。你必须构建一些可以与打印框架交流的,并且还可以用来调整打印设置,绘制页面元素及管理多个页面的打印。
这节课展示了如何与打印管理者进行连接、创建打印适配器和构建打印内容。
连接打印管理者
当程序需要直接管理打印进程时,在收到用户的打印请求之后,第一步就是连接的打印框架,以及操作类的实例。这个类允许你实例化一个打印工作并开始打印的生命过程。下面的代码展示了如何获得一个打印管理者和启动打印进程。
private void doPrint() {
// Get a PrintManager instance
PrintManager printManager = (PrintManager) getActivity()
.getSystemService(Context.PRINT_SERVICE);
// Set job name, which will be displayed in the print queue
String jobName = getActivity().getString(R.string.app_name) + & Document&;
// Start a print job, passing in a PrintDocumentAdapter implementation
// to handle the generation of a print document
printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),
上面的代码演示了如何命名一个打印工作并设置一个的实例,这个对象可以处理打印过程的每一个步骤。打印适配器的实现会在下面的章节中讨论到。
Note: 方法的最后一个参数需要一个对象。你可以使用这个参数给打印框架提供一些提示及给原先的打印周期预先设置一些选项,这可以改进用户体验。你还可以使用这个参数来设置一些选项,这些选项更适用于内容的打印,比如当打印照片的时候可以设置打印的方向为照片本身的方向。
创建打印适配器
打印适配器会与Android的打印框架相连接,并会处理打印过程的每一个步骤。这个过程要求用户在创建文档打印之前选择打印机及相关的打印选项。这些过程会影响最终的输出结果,就像用户选择了不同打印能力,不同的页面尺寸,不同的页面方向一样。随着这些选项的设置,打印框架会要求适配器展示并生成一个打印文稿,为最终的打印做准备。一旦用户按下了打印按钮,打印框架会拿到最终的打印文档然后交付给打印提供者以便打印。在打印的过程中,用户可以选择取消打印行为,所以打印适配器必须监听并响应取消请求。
抽象类PrintDocumentAdapter被设计为用来处理打印过程的生命周期,它拥有4个主要的回调方法。你必须在打印适配器中实现这些方法,以便可以与打印框架进行适当的交互:
- 会在打印进程开始的时候调用一次,如果应用对任务有任何的单次预处理任务,比如获取要打印的数据段,就可以在这里执行。实现这个方法并不是必须要求的。
- 会在用户每次更改打印设置的时候调用一次,这会影响到最终的输出结果,比如不同的页面尺寸,或者页面方向,提供给程序一个机会来估算页面的版面。在最低限度下,这个方法必须返回将要打印的文档有多少页。
- 该方法被用来将要打印的页面作用到一个文件中,然后再被打印。这个方法可能会在onLayout()方法每次调用之后被调用一次或者多次,
- 该方法会在打印过程结束的时候调用一次。如果程序对打印任务需要任何的销毁工作,那可以在这里执行。这个方法不是必须要求被实现的。
下面的章节会描述如何实现layout和write方法,这两个方法实现了打印适配器的决定性功能。
Note: 适配器方法会在程序的主线程中被调用。如果你认为执行这些方法会消耗大量时间的话,那么可以在单独的线程中实现它们。举个例子,你可以将layout或者打印文档的writing工作放入单独的AsyncTask对象中。
计算文档信息
在的实现中,程序必须指定文档的类型,它还需要创建并计算打印工作的总页数,获得被打印页的尺寸信息。onLayout()方法应该进行这些计算并且将要输出的文档信息放入一个对象中,包括页面数量以及内容类型。下面的代码展示onLayout()方法的最基础实现:
public void onLayout(PrintAttributes oldAttributes,
PrintAttributes newAttributes,
CancellationSignal cancellationSignal,
LayoutResultCallback callback,
Bundle metadata) {
// Create a new PdfDocument with the requested page attributes
mPdfDocument = new PrintedPdfDocument(getActivity(), newAttributes);
// Respond to cancellation request
if (cancellationSignal.isCancelled() ) {
callback.onLayoutCancelled();
// Compute the expected number of printed pages
int pages = computePageCount(newAttributes);
if (pages & 0) {
// Return print information to print framework
PrintDocumentInfo info = new PrintDocumentInfo
.Builder(&print_output.pdf&)
.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(pages);
// Content layout reflow is complete
callback.onLayoutFinished(info, true);
// Otherwise report an error to the print framework
callback.onLayoutFailed(&Page count calculation failed.&);
的执行会有三个结果:完成、取消或者失败,失败的情况就是说不能够完成版面的计算。你必须通过调用对象的适当方法来指定其中一个结果。
Note: 方法的布尔参数指示了从最后一次请求开始版面的内容是否有实质上的改变。适当的设置这个参数可以允许打印框架避免对方法进行不必要的调用,实质上会缓存原先的书面打印文档并改善性能。
的主要工作是计算页码,这个页面会作为打印机的输出属性。至于如何计算页码这高度依赖程序如何排版打印页。下面的代码展示了一个实现,这个实现的页码取决于打印的方向:
private int computePageCount(PrintAttributes printAttributes) {
int itemsPerPage = 4; // default item count for portrait mode
MediaSize pageSize = printAttributes.getMediaSize();
if (!pageSize.isPortrait()) {
// Six items per page in landscape orientation
itemsPerPage = 6;
// Determine number of print items
int printItemCount = getPrintItemCount();
return (int) Math.ceil(printItemCount / itemsPerPage);
写入打印文档文件
当写入打印结果到文件中时,Android打印框架会调用方法。这个方法的参数指明了哪一页需要被写入以及被使用到的输出文件。你的实现必须将每个请求内容页渲染到一个多页的PDF文档文件中。这个过程完成以后,你需要调用回调对象的方法。
Note: 由于Android打印框架可能会在每次调用onLayout()方法之后调用若干次onWrite()方法,所以在打印页面并没有发生实质上的改变时设置onLayoutFinished()方法的布尔参数为false是很重要的,这样可以避免对打印文档进行不必要的重复写入。
Note: 方法的布尔参数指示了从最后一次请求开始版面的内容是否有实质上的改变。适当的设置这个参数可以允许打印框架避免对方法进行不必要的调用,实质上会缓存原先的书面打印文档并改善性能。
下面简要演示了使用PrintedPdfDocument类创建PDF文件过程的基本技术细节:
public void onWrite(final PageRange[] pageRanges,
final ParcelFileDescriptor destination,
final CancellationSignal cancellationSignal,
final WriteResultCallback callback) {
// Iterate over each page of the document,
// check if it's in the output range.
for (int i = 0; i & totalP i++) {
// Check to see if this page is in the output range.
if (containsPage(pageRanges, i)) {
// If so, add it to writtenPagesArray. writtenPagesArray.size()
// is used to compute the next output page index.
writtenPagesArray.append(writtenPagesArray.size(), i);
PdfDocument.Page page = mPdfDocument.startPage(i);
// check for cancellation
if (cancellationSignal.isCancelled()) {
callback.onWriteCancelled();
mPdfDocument.close();
mPdfDocument =
// Draw page content for printing
drawPage(page);
// Rendering is complete, so page can be finalized.
mPdfDocument.finishPage(page);
// Write PDF document to file
mPdfDocument.writeTo(new FileOutputStream(
destination.getFileDescriptor()));
} catch (IOException e) {
callback.onWriteFailed(e.toString());
} finally {
mPdfDocument.close();
mPdfDocument =
PageRange[] writtenPages = computeWrittenPages();
// Signal the print framework the document is complete
callback.onWriteFinished(writtenPages);
这个示例将PDF页的内容委派给了drawPage()方法,这会在下面的章节中讨论。
和layout一样,onWrite()的执行过程也有三个结果:完成、取消或是失败。在失败情况下不能再写入内容。你必须通过对象的适当方法指明结果。
Note: 文档打印的过程是个资源密集型的操作。为了避免阻塞UI线程,你应该考虑在单独的线程中执行这些事情,比如在中。有关更多关于比如异步任务的工作执行线程,请参见 。
绘制PDF页面内容
当程序要打印时,程序必须先生成一个PDF文档,然后将文档交付给Android打印框架来打印。你可以使用任何的PDF生成库来实现这个目的。这节课展示了如何使用类来生成PDF页。
类使用了一个对象来绘制元素到PDF页上,这与Activity的布局绘制很类似。你可以使用Canvas的绘制方法来绘制页面元素。下面的代码演示了如何使用这些方法来绘制一些简单的元素到PDF文档页上:
private void drawPage(PdfDocument.Page page) {
Canvas canvas = page.getCanvas();
// units are in points (1/72 of an inch)
int titleBaseLine = 72;
int leftMargin = 54;
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setTextSize(36);
canvas.drawText(&Test Title&, leftMargin, titleBaseLine, paint);
paint.setTextSize(11);
canvas.drawText(&Test paragraph&, leftMargin, titleBaseLine + 25, paint);
paint.setColor(Color.BLUE);
canvas.drawRect(100, 100, 172, 172, paint);
当使用Canvas绘制PDF页面时,元素由一些点来指定位置,这个点的大小是英寸的72分之一。要确保使用这个测量单位来指明元素的尺寸。对于绘制元素的定位,坐标会从页面的左上角0,0点开始。
Tip: 虽然Canvas对象允许你将打印元素放置到PDF文档的边上,但很多打印机并没有能力可以将边上的元素打印到纸上去。要确保在使用这个类构建打印文档时要保留一定的页面边距。机器是富士施乐。手机里有些Word文档,怎么通过无线方式打印出来。
来自宽带山官方安卓客户端
来自宽带山官方安卓客户端
虹中路川普
不是每个无线打印机都支持AirPrint的。如果支持的话你的iPhone会自己发现,否则就没戏。
来自宽带山官方安卓客户端
不是每个无线打印机都支持AirPrint的。如果支持的话你的iPhone会自己发现,否则就没戏。
图片可以无线打印,就是文档不行
来自宽带山官方安卓客户端
装个printer share 破解版-==kds官方Android客户端==-
来自宽带山官方安卓客户端
局域网的话,手机qq和电脑版qq同步一下,可以直接打印-==kds官方iPhone客户端==-
来自宽带山官方安卓客户端
引用: 局域网的话,手机qq和电脑版qq同步一下,可以直接打印-==kds官方iPhone客户端==-就是不想开电脑才希望手机直接打印
来自宽带山官方安卓客户端
首先你要有个无线打印机,最近家里准备买个EPSON L455-==kds官方iPhone客户端==-
来自宽带山官方安卓客户端
引用: 装个printer share 破解版-==kds官方Android客户端==-一下子找不到,只有收费版的
来自宽带山官方安卓客户端
电脑上链接好打印机,然后上QQ;打开手机端,发现“设备”里面有打印的;
来自宽带山官方安卓客户端
电脑上链接好打印机,然后上QQ;
打开手机端,发现“设备”里面有打印的;
这样就没有意义了
来自宽带山官方安卓客户端
手机上安装富士施乐的print App后,以后图片也好文档也好,菜单里都会出现打印命令。
来自宽带山官方安卓客户端
引用: 手机上安装富士施乐的print App后,以后图片也好文档也好,菜单里都会出现打印命令。引用自11楼:对的,但是文档的话搞不定。要什么service hub之类的东东
来自宽带山官方安卓客户端
装个printer share 破解版-==kds官方Android客户端==-引用自4楼:搞定了!谢谢!
来自宽带山官方安卓客户端
装个printer share 破解版-==kds官方Android客户端==-引用自4楼:就是没搞定双面打印,没有驱动
来自宽带山官方安卓客户端
衰哥好多年
装个手机WPS,剩下来自己琢磨下-==kds官方iPhone客户端==-
来自宽带山官方安卓客户端
引用: 装个printer share 破解版-==kds官方Android客户端==-引用自4楼:就是没搞定双面打印,没有驱动引用自14楼:也搞定了!虽然没驱动,但也完美!
来自宽带山官方安卓客户端
引用: 装个手机WPS,剩下来自己琢磨下-==kds官方iPhone客户端==-没用。他的打印是打印为PDF
来自宽带山官方安卓客户端||||||||||||||||||
查看: 9|回复: 9
在线时间1 小时经验值761 最后登录注册时间帖子阅读权限70UID
学士, 积分 761, 距离下一级还需 339 积分
TA的每日心情慵懒 23:20签到天数: 288 天[LV.8]以坛为家I
G币992 最后登录注册时间
云打印和HP插件怎么用,或者推荐个其他的打印机的应用
在线时间1095 小时经验值5680 最后登录注册时间帖子阅读权限120UID1771692
导师, 积分 5680, 距离下一级还需 420 积分
TA的每日心情开心 19:30签到天数: 520 天[LV.9]以坛为家II
G币6225 最后登录注册时间
你首先要有个能蓝牙或者NFC连上手机的打印机 你有吗
在线时间1 小时经验值761 最后登录注册时间帖子阅读权限70UID
学士, 积分 761, 距离下一级还需 339 积分
TA的每日心情慵懒 23:20签到天数: 288 天[LV.8]以坛为家I
G币992 最后登录注册时间
blgtr 发表于
你首先要有个能蓝牙或者NFC连上手机的打印机 你有吗
可以用wifi连吗,像电脑那样
在线时间0 小时经验值910 最后登录注册时间帖子阅读权限70UID
学士, 积分 910, 距离下一级还需 190 积分
TA的每日心情怒 11:50签到天数: 334 天[LV.8]以坛为家I
G币966 最后登录注册时间
打印机必须得支持呀!
在线时间35 小时经验值1078 最后登录注册时间帖子阅读权限1UID
头像被屏蔽
该用户从未签到
G币0 最后登录注册时间
提示: 作者被禁止或删除 内容自动屏蔽,只有管理员或有管理权限的成员可见
看完了这么强的文章,我想说楼主真牛啊
在线时间1 小时经验值1527 最后登录注册时间帖子阅读权限80UID
研究生, 积分 1527, 距离下一级还需 173 积分
TA的每日心情无聊 16:33签到天数: 657 天[LV.9]以坛为家II
G币5014 最后登录注册时间
好像试用版不支持吧。
在线时间468 小时经验值1030 最后登录注册时间帖子阅读权限70UID1593691
学士, 积分 1030, 距离下一级还需 70 积分
该用户从未签到
G币1 最后登录注册时间
手机qq就可以&&不过好像只有iphone版可以
在线时间21 小时经验值259 最后登录注册时间帖子阅读权限50UID5867435
大学专科, 积分 259, 距离下一级还需 141 积分
TA的每日心情无聊 15:27签到天数: 11 天[LV.3]偶尔看看II
G币7 最后登录注册时间
RE: 怎么用手机打印文件啊?
内容看看…
在线时间64 小时经验值1291 最后登录注册时间帖子阅读权限80UID
研究生, 积分 1291, 距离下一级还需 409 积分
TA的每日心情怒 14:26签到天数: 101 天[LV.6]常住居民II
G币2164 最后登录注册时间
打印机得是惠普的,支持无线或蓝牙连接
在线时间3 小时经验值29 最后登录注册时间帖子阅读权限20UID5421996
小学生, 积分 29, 距离下一级还需 21 积分
该用户从未签到
G币0 最后登录注册时间
可以哦,我的惠普打印机,手机和打印机连接路由器,直接打印。
浏览过的版块
Powered by扫码连接手机后即可打印文件,一张黑白A4纸只要3毛钱_网易新闻
扫码连接手机后即可打印文件,一张黑白A4纸只要3毛钱
用微信扫码二维码
分享至好友和朋友圈
(原标题:扫码连接手机后即可打印文件,一张黑白A4纸只要3毛钱)
年轻人正在“尝鲜”共享打印机。刘浏 摄
扬子晚报讯(记者&刘浏)去年以来,以共享单车为首的“共享”经济越来越火,除了网约车、共享单车之外、共享雨伞、充电宝也层出不穷,近日一款共享打印机亮相南京校园,颇受同学欢迎。记者了解到,这种共享打印机可以和手机连接,自助选择后直接打印手机中的各类文件,并且价格比市面上的文印店更为低廉。目前这种打印机在南京布有近一百个点,主要出现在社区、写字楼和高校周边。临时想要打印文件却发现文印店已经关门,打印时不仅要排队,U盘还容易染上病毒,不少人都遇到过类似的问题。近日一种共享打印机出现在南京校园,扫码连接打印机,支持多种格式的文件,价格还更为便宜,短时间内受到不少同学的欢迎。记者在南京林业大学教学楼内看到,两台黄色外壳的打印机旁围了不少大学生等候打印。使用过程首先需要扫码,随后就可以微信或APP上操作了。打印的文件可以从电脑上传,手机相册,并支持云端和第三方应用。选择好文件以后,就可以扫码连接打印机进行打印,如果不知道哪里有分布,还可以选择显示最近的打印机地点。记者注意到,在打印机分布的列表中,全南京市已经有了近100台这样的共享打印机,遍布南京的小区、高校、写字楼和一些酒店内。另外,手机上还可以查看打印机输出的是黑白的还是彩色。一位南林大同学告诉记者,听说这里有台共享打印机,正好有一批材料要打印,就想过来“尝个鲜”。“扫码后送了10块钱,我这一批材料打印出来几乎没花钱,打印机上还拴了个订书机,感觉用起来挺贴心的。”记者了解到,这种共享打印机使用价格是黑白A4纸一张3毛钱,A3纸为6毛钱,彩色的A4纸为2元一张,比市场上的文印店价格略低。如果通过各种活动领券,充值,打印成本还能更低。另一位同学告诉记者:“操作起来较简单,扫码传文件就能打印了,关键还可以24小时打印,晚一点来既不排队也不受时间控制。”
(原标题:扫码连接手机后即可打印文件,一张黑白A4纸只要3毛钱)
本文来源:新华报业网-扬子晚报
责任编辑:王晓易_NE0011
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈

我要回帖

更多关于 手机文件打印 的文章

 

随机推荐