Google I/O 2012 - Beyond Paper: Google Cloud Print and the Future of Printing

Uploaded by GoogleDevelopers on 10.07.2012

>>Akshay Kannan: Hi, everyone. Cool, the mic works.
Good afternoon, everyone. Are you guys excited for the last session of the day?
[ Cheering ]. >>Akshay Kannan: All right. My name is Akshay
Kannan, and I'm a PM on the project. >>Yuri Dolgov: And I'm Yuri Dolgov, and I'm
software engineer on the project. >>Akshay Kannan: And today we're going to
talking to you about Google Cloud Print and the future of printing. So real quick just
to give you an outline of the presentation, we'll start with an introduction, explain
what Google Cloud Print is. We'll talk about how you can integrate with our application
both to print from as well as receive print jobs. We'll talk about some of the formats
we support and finally we'll talk about our future plans and where we're heading going
forward. So real quick just to get a show of hands,
how many of you guys in the audience have heard of Google Cloud Print prior to Google
I/O? Awesome. Pretty much everyone. Cool.
And how many of you guys have ever printed something using Google Cloud Print before
coming here? Awesome. Most of you guys.
And how many of you have ever used our API before?
All right. A significantly smaller number of you.
So hopefully this talk will change that and will give you a better idea of our API as
well as the platform as a whole. So let's quick things off. So at a very high
level, Google Cloud Print was a Web service that we at Google created to take the pain
out of printing. We know that setting up a printer and printing to a printer are some
of the most troublesome things that people have to deal with everyday with computing,
and we really wanted to make that experience better. So our high level goal with Cloud
Print was to provide a seamless, driverless printing experience that worked regardless
of what platform you were on. Pretty much as long as your device can connect
to the cloud you should be able to print without running a full driver stack.
So in terms of our motivations and what drove this, I'm going to take a trip back in time
to 2010, way back in the day when we were designing Chrome OS and trying to find out
how to solve printing on that platform. So printing is obviously really, really important
use case on the Chromebook. It's a device that's designed for content creation, and
people need to print. And so we were considering different models for how to do this. On one
hand you have your traditional driver model which you're accustomed to on your Windows,
Mac and Linux machine. This was great because it was tried and true, but there were a lot
of trade-offs with this. One major problem we saw is that we'd have
to package every single Chrome OS device that we sold with a whole bunch of printer drivers
that you may or may not even use. Especially for an action you perform not too frequently,
it doesn't make sense to have this code sitting on every single device out there.
I think another problem that we ran into with drivers is just the fact that we would have
to keep them continuously updated. If you got a new printer and it didn't have the drivers
that you needed on that device, you would be dependent on Google or on your printer
manufacturer to release drivers that were specific to your model, and that was just
a huge pain point and we didn't want to deal with having this constant baggage on every
Chromebook that we'd have to keep updated. I think third of all, and most importantly,
Google has a lot of platforms that are important on the cloud. We have Chrome, we have Chrome
OS, we have Android. And we didn't want to just come up with a solution for one platform.
We wanted to come up with a solution that would scale to a whole bunch of platforms.
And that was the beauty with Cloud Print is because what we had was a Web service, we
were able to build something server side which supported all the different platforms that
Google has. And this is a comic I like. It's an excerpt
from The Oatmeal, which sort of gives you an idea of some of the pain points you run
into with traditional driver installations, and this is exactly what we want to avoid
with Google Cloud Print. So this cool 3D diagram gives you sort of
a high level overview of how our system works and what exactly it does.
There are a variety of devices you can print from. Some examples just given here are your
tablet, your Chromebook, your Android phone, your iPhone, your -- or even your traditional
Mac or PC. Your print jobs are sent to Google Cloud Print.
You can and them over any format and then we convert them into the format they need
to be in for the destination printer. So here are three examples of devices we can
send print jobs to. Arrow A is pointing to a printer that is shared through Google Cloud
Print through an intermediary laptop acting as a connector. We'll explain more of that
later. Arrow B is pointing to a cloud-ready printer.
These are printers that talk directly to the Google Cloud Print service from within their
firmware. We have one of these printers up front and will actually be doing some live
printing for you later. And then Arrow C, which is basically you're
printing to an enterprise server, which could be managing thousands of printers. And we
actually use a server very much like this inside of Google to manage all of our printers
with employees. So the great thing with Google Cloud Print,
and one of the reasons that -- I guess the beauty of the platform and why we find it
so powerful is it allows you to do all kinds of things that you could never really imagine
doing before with local printing. So for one thing as an application developer,
to add printing functionality with your app is as easy as three lines of code. Yuri is
going to be guiding you through that at a later portion of the presentation. But we've
really made it really, really easy for you as developers to plug into the platform and
integrate with Google Cloud Print. Another advantage you have is because with
Cloud Print all your print jobs go through the cloud, you can print not just to printers,
but actually to any device or application which is connected to the cloud.
And we've built a lot of really interesting products around this, which we'll be explaining
more later in the presentation as well. Finally -- and this feature is something we
feel that is really powerful is that we've made it dirt simple to share printers with
people. I don't know how many of you guys have ever tried to share a local printer with
someone, but it's not exactly a really fun process. You can either do it through network
sharing and set up your computer as a server or you can pass someone a USB cable in which
case they have to plug it in, go through a bunch of driver installs and by the time they'll
get printing it will take forever. So we've made sharing ridiculously easy, and
I'm actually going to show you a demo of that real quick.
So the great thing with Cloud Print is we've made sharing a printer as easy as sharing
a doc. So here you can see the Cloud Print management
page in Google Chrome. This is just You can see I have three printers. The printer
that I have selected is actually the printer in the front of the room. This is our demo
printer. And if I want to share this printer with Yuri, all I have to do is click the green
share button and you see a sharing dialogue just like the one in Docs. I type in Yuri's
Gmail account, I hit enter and I hit share and that's it. I've just shared this printer
with Yuri and it was as easy as sharing a doc with him.
So because your printers are associated with your Google account it allows us to make sharing
really simple and seamless. And I guess as a fourth point also with Google
Cloud Print, because all your print jobs go through the cloud, we're completely OS, device
and browser agnostic, so your printing experience is going to be virtually identical whether
you're on your Android phone or whether you're on your Windows PC. You're gonna see the same
print options, see more or less the same dialogue, and we've done this to provide a consistent
experience regardless of what platform you're on.
So I've given you a high level overview of the platform and now I'm going to hand it
out to Yuri and he will explain how to integrate with Cloud Print from within your apps.
>>Yuri Dolgov: Hey, guys. I'm going to guide you through engineering part of our presentation.
And I want to start with the limitations of existing printing solutions on different platforms.
With Web platform nowadays you can pretty much build whatever application you can think
of, but when it comes to something as printing, and still there are many people who care about
getting their document printed, you are faced with a whole bunch of different problems.
Pages look different on different Web browsers, so you have to worry about making them look
the same on every single browser you basically create your application for.
If you have mobile version of your Web application, it's even worse because usually the mobile
version is different from desktop and you might want to have printed version looks the
same as on desktop. With mobile devices it's even worse. For every
single new platform you put your variation to, you have to come up with different printing
solution. And for some platforms you don't even have
standard solutions, you have to invent them on your own, and that's what we are trying
to solve with Cloud Print. With Cloud Print we want to provide you with
the same seamless printing experience on every single platform. Same API, same content type
of the documents, everything is the same on every single platform.
I want to start to use example of Web integration, how you integrate Cloud Print in your existing
Web application. For Web we have very simple, yet very powerful
way. It's gadget based. So basically first thing you need to do is
just load gadget code from this URL on to your page. And gadget cross-name is called
print gadget. It has only one static method, which is create default print button, which
creates default button, which looks like this. And if you create instance of this gadget
you can also use those methods listed before. First of them is set on close callback, which
is pretty trivial, allows you to set on close callback.
You can set any function that is going to be called when print dialogue is closed.
The next one is set print button. There it is.
And that one allows you to set whatever HTML element you want to attach to bring the gadget
to. You can use either button generated by this
method or you can use your own DOM, it doesn't matter. Whenever a user clicks on the DOM
element, a print dialogue is going to pop out.
Next -- and the main method of this gadget is set print document, which allows you to
set documents that is going to be printed. First parameter of that is content type, content
type of document you want to print. Second one is title of the print job. Third one is
going to be used to identify the job by the user in print queue.
Third one, and the main, is content of the document. And content can be both binary or
Base64 encoded. Though Base64 encoded version is a little bit larger than binary version,
you might still want to prefer that in some cases, especially if you have some kind of
Native-to-JavaScript breach, and in this case you might face jobs of early string terminations
or stuff like that. So you might sacrifice a slice and still use Base64 encoded version
of the document. And if you decide to use Base64 encoded version
of the document you will need to set force parameter, which is optional content in the
colon. And in this case you will need to parse Base64 string.
If you want to have more control on opening and closing print dialogue, you might want
to use two other -- two methods below. It's open print dialogue and close print dialogue
which allows you to open and close print dialogue. And you might want to use it if you want to
open print dialogue on some custom action like print -- document was uploaded or -- and
conversion was done or registration finished, stuff like that, so any custom events.
I want to go and show you how you do it in an existing application. This is just fragment
of code. Let's say (indiscernible). It goes like here.
So the first thing you need to do is load gadget code, as I said. The next thing, in
this example we use on print function, which is going to be called whenever a user wants
to print a document. The third thing we do in this function is create a Cloud Print gadget
instance. The next thing we set print document you want
to print. In this case we use the application PDF content type, but we can use many others
and we will tell you more about that later. And we said print job title, like my print
job title, something. And this is Base64 encoded content of PDF.
And since this is Base64 encoded, we need to set force parameter to Base64.
And then we just open print dialogue, and that's it, we are done.
And one more thing I want to mention is that this code you'll work exactly the same way
on any browser, including mobile browsers. So you only implement it once and -- well,
we'll do everything for you. We'll open different type of dialogues on different browsers, depending
on -- well, optimize them for those. Yeah. And we want to show you how Box integrated
with us. They basically took almost no time to do that. I hope you know what Box is, all
right? It's file sharing, file storing service. I have my Box account opened here and I have
only one document and I want to print it with Cloud Print. So I see it send to Google Cloud
Print and here I see print dialogue. As you can see I have invitation to accept a new
printer. The printer is actually shared with me a few minutes ago. I will go ahead and
accept this printer. There we go, printer is accepted, and now
we're going to use it to print this document. You see the document was immediately sent
to the printer and it's going to be printed like in a few seconds.
So it's super easy to integrate Web application on Cloud Print and it's even easier to integrate
Android application with Cloud Print. In order to do that you will need to include
Cloud Print intent code into your application, and you can get this code on this URL --
[ Applause ]. >>Akshay Kannan: Sorry to interrupt. To make
matters even more interesting, this printer is connected using a mobile network, so -- yeah,
everything seems to be connected. [Laughter].
>>Yuri Dolgov: Okay. I will continue this Android integration.
On Android, the integration is even simpler than on the Web. All we need to do is just
add Cloud Print intent into your application, and you can get a code of this intent on this
URL. And the intent class name is cloud print dialogue.
And all we need to do is just illustrate this intent, subdate it and type up the documents
you want to print, set titles of the document you want to print and start the intent.
Since it's so that simple I want to go ahead and show you how to do it in a real application.
In my case application is not that real. This is Danny Web browser. Thank you.
So it's Danny Web browser, and there is only three URL elements, URL box, which is basically
a box where you can type URL you want to go to. Go button, which you need to click in
order to go to this URL. And Web view, which is -- well, which contains content of the
Web page. So you will see codes there. It's very simple.
I don't want to spend too much time on that. The only non-trivial part here is that we
have functionality to get HTML content on the Web page, and in order to do that we need
to have JavaScript-to-Java bridge because -- well, this is the only way you can access
Web view content. Anyways, I'm going to compile and start this
application. There we go. So this is, as I said, very simple
browser. You can open the page, you can navigate, do stuff like that.
Let's go ahead and integrate this Cloud Print. What we need to do is just add the URL element.
You can click in order to open print dialogue. In this case it's a button and I have it already
in my layout XML file, so I don't want to spend time implementing, write it once again.
And they have (indiscernible) already. I will go ahead and explain line by line what we
have here. First thing we do is create print intent.
Then we find print button in the UI and set on click listener.
So in on click listener what we do is just get content of the Web page, set it as document
to be printed, along with content type, which in this case that's HTML, set title of the
print job and start the activity. That's pretty much it.
Let's look how it works. So it should start in a second. Here we go.
The connection is a bit slow. Here you see a new button print. We'll go ahead and click
this button. This will open print dialogue and you can
select printer you want to print to. Let's use the same printer again.
Print. And it should be instantly sent to printer.
No? >>Akshay Kannan: There we go.
>>Yuri Dolgov: Okay. Worked this time again. Okay. It's going to be printed in a few seconds,
so I'm going to continue with -- yeah, with my presentation.
In some cases those two integrations might not -- oh, by the way, yeah, you can get the
code of this presentation from here. It's completely open. You can check how it looks
in details. So in some cases those two integrations might
not be enough for you. For example, you are working with some other platform or you want
to have some more flexibility, doesn't matter. We still have open APIs that you can use.
And there are three main API codes that you need to know if you want to send a job to
Cloud Print. First one is search. It allows you to search for all the printers available
for the user. You can do some filter and some searches, like some filter -- like filter
in by (indiscernible) or by status for those printers, but after all the goal is to provide
user a list of printers available for them. Once user selects the printer they want to
print to, you need to do another code, printer code, which will return capabilities of the
printer. And you will need to show those capabilities to the users so that they could select how
they want to print the job. Once capabilities are selected, you would need to do the third
one, third call, which is the certainly the main one. That will submit a print job to
printer, printer is given printer ID, title of the job, capabilities, content type, if
-- if content of the job is Base 64 encoder, so you will need to set up a content task
for encoding as well and content itself. So it's super easy again and with that I'm going
to hand it back to Akshay. >>Akshay Kannan: Sounds good.
So we have showed how you can integrate with that --
[ Applause ] >>Yuri Dolgov: Thank you.
>>Akshay Kannan: So we have showed you how we can integrate with Cloud Print, you can
use our Web widget, Android widget, or HTTP API directly, we have really tried to make
it easy to bring that functionality into your app. That's printing from a lot of places,
but we actually also support printing to a lot of places, printing to anywhere. We have
over 20 million printers that are registered with Google Cloud Print as of today and that
number is continuing to grow, so our main type of printers are -- at least for the best
user experience, we recommend what we call cloud ready printers. These are printers that
connect directly to the Web from within the firmware themselves. We have over 70 cloud
ready printer models that are available from a wide variety of retailers and manufacturers,
and we've -- in particular printers the list that we have here on our slide deck of HP,
Canon, Kodak, Epson, Fuji Xerox and Samsung, are just the manufacturers who have printers
that are currently available. We are working with a much larger list of manufacturers over
time to expand this out. So basically it will be hard at some point to buy a printer that's
not cloud ready. We also have a full list of printers on our
Web site, where you can check out what printers are available. And which
ones are cloud ready. I know a lot of you also probably don't want to buy a new printer.
You just use Google Cloud Print, and the good news is that you don't have to. We support
what's called the Chrome connector, which allows you to take any local printer that's
connected to your printer running Chrome and use that printer as a print server.
So how this works it's let's say that you have Google Chrome running on your Windows
PC at home. You can USB your printer into there, set it up as a local printer. And then
from within Chrome settings, you can register -- in fact here's a screen shot from the settings
dialogue, you just click the add printers button right there, and it's simply a one-click
process. Your local printers will automatically get
added to your Google Cloud Print account with the account that you are logged in with. So
we do make it easy to set up printers that are not cloud ready. The only caveat here
is that you do need to keep your computer running in order for jobs to be printed out.
That being said, if you submit a print job to a computer that's turned off, it gets queued,
so next time you turn it on your job will get released and printed out from the printer
that's connected to it. Also we don't just support printer to printers,
as I mentioned earlier. But we really support printing to anywhere. You can print to -- currently
every Google Cloud Print dialogue has the option save to Google drive, which will take
whatever you are printing, convert it to a PDF, and save it in your Google drive account
or you can even print to a FedEx office, which is a partnership we recently launched this
year which allows you to print your document and get a retrieval code, which you can use
to basically print out and pay for your job at any local Fed-Ex office location within
the U.S. Finally, another little exciting feature that
we have is the ability to print to your mobile phone. So if you have Chrome for mobile installed
on Android or iOS and you are signed into sync, what we do is we actually register your
phone as a Google Cloud Print device in your dialogue. So what you will be able to do -- whenever
you are printing from Cloud Print, if you are using the same account that you have set
up your phone with, you will see your phone as a destination that you can print to. And
what we do is we just push an Android push notification that the job is available and
it gets downloaded to your phone. So this is already available today and you
guys can try it out. Finally, in terms of printing to anywhere,
we also -- like most of our product -- have a fully open API that you can use as developers
to receive print jobs. So we have an XMPP interface, which you can connect to in order
to receive print job notifications. And we also have a full set of HTTPS interfaces that
you can connect to to basically fetch the job, set job status. And I'll delve into the
details in the next slide. Cloud ready printers such as the one you can
see on stage have already implemented this in firmware. So it's real easy to implement
whether you are working with low-level hardware or building an application. Yeah, really,
any application or device can implement this. And so we leave the possibilities of integration
up to the developer. And a lot of this really allows you to use your imagination for what
you can print to. Some examples we just thought of are you could print to your Kindle. You
could build an application that would allow you to print documents for reading on the
go. You could technically build an application that would even allow you to print to a smart
Web connected TV. And if monkeys were cloud connected, then you could even print to a
monkey with a typewriter. That one might require more imagination than the others.
So just to go into the details of our API, there's two API calls you really call about
with our job retrieval. There's our fetch API, which takes in a printer ID as an argument,
so you would call to fetch API when you receive an XMPP ping that a job is available. And
what the fetch API does is it returns a JSON list of the jobs that are available to be
printed. In this JSON object for each job, we have two parameters that are important,
the fie URL parameter and the ticketURL parameter. The fileURL parameter, which is the one right
here, is basically a URL that you can use to download the file. So the cool thing about
this URL is that -- you can -- you can dynamically change the format of the file by specifying
a different accept header when you are fetching this URL. So for example, if you want to fetch
the job as a PDF, you set your accept header to be application PDF, then we will convert
the document to a PDF server site and send it to your printer.
If you want to fetch it -- the other main format is PWG Raster, which is a simple Raster
based image format. If you want to fetch that, you just set your accept header to PWG Raster
and we will stream the file to you in that format.
And then finally ticketURL is basically your print ticket that contains a list of the filled
options of exactly what the user specified. For example, portrait or landscape or whatever
other capabilities you have exposed from your printer that are configurable.
Our second API, which is important is our control API, which allows you to basically
update the status of the job as you're printing it. So by default, whenever you print a job,
we set the status of that job to be queued. And over time as you are printing that -- so
for example, when you start to fetch, you can set the job, move the status from queued
to be in progress, and then when you are done printing the job, you can move the status
to done. If something goes wrong, you can also set
the status to error, and specify an error of coded message string. Finally we do take
security and privacy really seriously with Google Cloud Print and one example of how
we do this is we have a secure data access model, such that every item within our system,
whether it's a printer, whether it's a print job is (indiscernible), so that you can only
print to that if you have explicit permissions as your account to send a print job there.
So all of the APIs that we mentioned earlier are authenticated so you have to be logged
in as a user who has explicit privileges to access that. So we earlier said that you could
print to anything, but that was a lie because we have security restrictions in place.
Finally, we also support so -- so this is actually I'll start with the problem here
is when you are dealing with printer registrations, registration is an API that's difficult to
make an authenticated call because it requires the printer to somehow authenticate as you
before it can register itself with the system. That's a hard problem, because -- the biggest
concern for is it's a security issue because you could have printers when you are typing
credentials into the printer that could store them locally unencrypted on the device, make
it vulnerable to attackers who could steal your Google account from the printer. And
then also I think on another folder also the UI problem of not all printers -- not all
printers support text entry on their device. So we've solved this using what we call the
anonymous registration flow. This allows the printer to basically make an unauthenticated
registration call to our servers, which anonymously registers the printer to Google Cloud Print.
In order to actually complete the registration process, we have returned a URL to the printer,
which the printer can then print out and give to the user and the user can visit that URL
on their Web browser and complete the registration process from there. We know that this is secure
because you are only entering your credentials into a Google log-in page and not into a third
party interface. And then finally there's also robot accounts, which are special accounts
that we create just for printers in our system when the registration happens. The nice thing
with robot accounts is that they are sandboxed, so they are only given restricted access to
Google Cloud Print and can't access other things in your Google account that you wouldn't
want them to. Finally, all of our interfaces use HTTPS and we strongly encourage you as
developers to also use the HTTPS versions of our API.
Finally, regarding privacy, another problem that we've dealt with is spam invitations.
So, for example, if I shared -- I could technically share 100 printers with Yuri and completely
spam his account. Another possible attack is that I could share a printer, which looks
like one of Yuri's printers to him, and he could end up printing to that and I could
steal all of his data as a result. So one thing to prevent this is we have implemented
printer sharing invitations. So this, as you saw earlier, requires Yuri
to explicitly accept my printer sharing invitation before he can print to a printer. As part
of that invite process, he sees exactly who I am and the name of the printer that I'm
sharing with him, so this prevents you from getting spammed with printers and also prevents
you from printing to printers unless you are absolutely sure that you have accepted an
invitation and that you know who sent you that invite. And then finally regarding print
job content retention, we delete for jobs as soon as the status is set to done. If the
status is never set to done, then after 30 days, we delete print job content from our
servers. We don't store them long term. Finally, we've talked about how you can print
from anywhere, how you can print to pretty much anywhere, and I'm going to go into another
part of our presentation which is how you can print anything.
We do support a very, you know, Google Cloud Print was developed with sort of developers
in mind. And client platforms in mind. And we realized that when you are generating documents
client side, you don't want to be bound to a particular format that you have to generate.
You want to have the flexibility to generate your content in whatever formant you want
and then send it server side where we can do the necessary conversion.
So for this reason, our API accepts virtually any format as input for your print job. So
you can send us pdfs, stand image formats, most standard document formats, Google docs,
Microsoft Office documents, HTML documents or even URLs which we can fetch server side
and NET Frame. On our side, we make our best effort to convert this document into either
PDF or PWG Raster. Another thing that's interesting, if you don't care about conversion, then our
platform -- if the input and output formats are identical, we will actually do no conversion
whatsoever and simply pass the file through our system.
This could be really useful if you wanted to do something like make a 3D Cloud Printer
that used a special format, as long as the format that you in which you are submitting
the job and receiving the job in are the same, our system will just pass the job content
right through. It's also particularly useful for sending
-- if you want to encrypt content and before you send it to us, decrypt it after you receive
it, you could send us a custom encrypted format, which we would pass directly through without
doing any conversion on whatsoever. Then, finally, one format that I wanted to
focus on that I think is particularly powerful is HTML. It's a format that's easy to create
client side and sent to us on the server side. The other great thing about HTML is there's
no direct page content that's here or I guess page layout information. So it allows us server
side to intelligently flow the HTML, depending on what media size of paper that you are printing
to. So, for example, if you are in the U.S. and you are printing to an 8 and a half by
11 page, we will flow the HTML text and images for an 8 and a half by 11 paper and generate
the appropriate PDF server side. If you are in some other and country and using A4, then
we would flow the HTML content for an A4 and send that to you, so as an application you
wouldn't even have to worry about the media size of the destination printer that you are
sending content to. So I'm now going to just spend a little bit
of time talking about our future work and where we're heading going forward with Google
Cloud Print. So -- so one huge challenge for us has been
handling printer capabilities. There's -- they can be kind of a nightmare to deal with. There's
a lot -- basically with printer capabilities, the two main formats are XPS and PPD. And
the thing that makes them interesting as well, there are standards. Printer manufacturers
only have to write capabilities such that they'll work with their particular driver.
So for this reason, there can be a lot of ways to specify the same option. Even an option
as simple as portrait or landscape specified differently on different platforms. So we
really -- what we want to do is rather than just reading strings, we want to be a able
to intelligently understand these capabilities, make sense of them, produce good options UI
around them, and also even surface some of this functionality to developers. So that
as an application developer, you can know about the printer that you are sending jobs
to at a high level without having to parse these capabilities yourself. So that's one
of our big goals going forward is to more intelligently understand these different capabilities
and be able to semantically parse them on our side.
Real quick here, you can see our server's JSON representation or an excerpt from our
server's JSON representation of an XPS capability, we will see an idea of what that's like. Another
big goal that we're working towards are making public and commercial printers that you can
print to ubiquitous. We really like the concept of being able to print even without owning
a printer, no matter where you are. We did launch a partnership with the Fed-Ex office,
as I mentioned earlier, which makes this possible. Another thing, if you guys are on the first
floor of Moscone, we do have a Cloud Print station, which we have set up, to allow you
to print to public printers. You can print to these printers simply by tapping an NFC
tag or scanning a QR code, it gives you -- instantly adds the printer to your Google account and
allows you to start sending print jobs to it.
And then, finally, one of our biggest and most exciting goals and moving forward is
we want Cloud Print to be tightly integrated with other Google properties. So you can come
to expect the same consistent printing experience, regardless of what Google platform you are
using. One feature that I'm about to give you a sneak
preview of is some of the work that we've been doing in Google Chrome to tightly integrate
Cloud Print with the local printing experience in Chrome and just make that seamless. So
real quick, I'm going to grab the laptop and open up the -- this is the Canary channel
of Chrome, it's updated nightly. This is a pretty risky demonstration. So what we're
going to do is we're going to try printing our own API documentation using the new Cloud
Print dialogue that we're working on. So I'm just going to hit command P. It's going to
open the dialogue that you all know and love, except there's a slight difference. And that
is -- I don't know if you guys can notice, the destination pane is slightly different
from what you are used to. And by the way, this is all available on dev channel today,
so you guys can check this out for yourselves. So what's going to happen here is I'm going
to click change, this pops up something different from the usual drop-down. It actually pops
down a screen where your local printers and your Cloud Printers are integrated side by
side. What's happened is because I'm signed into
Chrome as, I'm able to see my Google Cloud Print printers.
You with see from within the Chrome dialogue, I can see save to Google drive, I can see
print to Fed-Ex office and I can see the printer that's been shared with me, which is the Cloud
Print demo printer. This guy up front. So what I'm going to do is for the sake of this
demo, I'm going to choose the Cloud Print demo printer. I'm going to hit print. And
what happens is this document is posted to the Cloud Print service and then sent to the
printer, which should be printing it out any second. So this is our integration in Chrome
and it's -- you know, we've tried to make it as seamless as possible, basically as easy
to print to Cloud Print as it is to print to a local printer. And this is just one of
the many integrations that you will see across Google properties going forward, so we are
really excited for that. So actually, once this prints out, that concludes the end of
our presentation. Thank you so much for coming. We're going to leave the remaining 20 minutes
for Q and A. So -- so -- so fire away. [ Applause ]
>>Akshay Kannan: All right. We will start the right side of the room.
>>> Hi. I had one question. On the Android apps and on the Web. Is there a way to -- to
take away some of the options in the printing, especially the number of copies that are printed?
My app requires that the user be able to print something only once. So is there a way to
suppress the number of copies that you can print?
>>Akshay Kannan: So the question was whether it's possible to restrict certain options
within the Android dialogue and within other dialogues to not show options such as copies.
Actually -- >>Yuri Dolgov: No, there is not such a way.
But, yeah, this is nice suggestion. We'll -- we'll discuss it.
>>> Is there a way to actually suppress it using the HTTPS protocols? I mean, I don't
-- >>Yuri Dolgov: If you create your own, your
custom print dialogue, you can suppress whatever you want. But in this case, you have to parse
capabilities yourself. >>> Yeah, that's fine.
>>Akshay Kannan: So you can do it using the HTTPS API and basically not show certain options
in your UI. >>> Thanks.
>>> You mentioned that you have millions of Cloud Print printers on your system now. Can
you speak a little bit about the infrastructure required for that? Do you have millions of
TCP connections that are open, using UDP or how does that work?
>>Akshay Kannan: For our cloud ready printers we are using XMPP to handle the notifications
between us and those printers. There isn't necessarily a one-to-one correspondence
of XMPP connections to printers. Because a lot of times with the Chrome connector, with
Cloud Print servers, you have multiple printers which can be associated with a single connection.
So -- so what it is, for cloud ready printers, we have one XMPP connection for each of those
printers. And for printers that are connected to the server or a different Chrome connector,
it's an XMPP connection per machine. So -- so, for example, if I'm sharing five
printers with my MacBook, I'd have five XMPP open or, I'm sorry, one XMPP connection controlling
all five of those printers. >>> But just short questions -- the short
answer to your question is we keep millions connected, connections open on our site, for
every single printer, and we rely on your infrastructure for that. So, yes.
>>> So if my office just lost its internet connection because a cable chewed on the wire,
all I can do is stare at my Cloud Printers, correct.
>>Akshay Kannan: What happens is when your printers are offline, any job goes into a
queued state, so everyone would still be able to print, but then once the internet comes
back on, all the jobs would come back out of the printer.
>>> I cannot send jobs directly to the print, they have to go through Google. No connection
to Google, no printing. >>Akshay Kannan: Yeah.
>>> Got it. Thank you. >>> Is there a Linux print server for this,
or windows print server, short of leaving Chrome open on the server?
>>Akshay Kannan: There is, actually, so on Linux, how it works is you can start the Chrome
connector, but actually you can run Chrome in -- this is actually -- it's in the chromium
source. I'm not sure how much of this is documented. We'll probably be documenting over time. But
you can run Chrome in a headless mode with a certain command line flag, which will start
the Cloud Print service up in the background, and it's what we do internally at Google to
get all of our thousands of printers online. So it doesn't require you to keep Chrome running;
it just requires you to have Chrome installed, and you launch it with the flag which starts
up the Cloud Print service in the background. >>> I've noticed that sometimes the office
printer that I Cloud Print to doesn't appear in the dialogue box. I assume that's because
it's kind of a flakey printer and sometimes it's offline or broken or something, but I
didn't see in your API that there was a way for a printer to report its status, or how
does that -- how does Google know that that printer is not available?
>>Akshay Kannan: So what we do is for status, we actually determine that using your XMPP
status. So if the printer doesn't have an active connection, in fact you could see this,
if I turn the printer off right now, it will show up as offline in the dialogue. We basically
use the XMPP status of the printer to determine whether it's online or offline.
>>> So that doesn't remove from the list, though? Is there some --
>>Akshay Kannan: It doesn't remove from the list. What it does is it grays it out and
it moves it to the bottom of the list, so your online printers show up above your offline
printers, but you'll still be able to see your offline printers at any time. If you're
actually not seeing the printer, then it might be that you're logged in with a different
account. You have to be logged in with the same account that you used to set up the printer,
or you can share the printer with your other account. But, yeah, we don't -- the printer,
if you set it up once, it will always be part of your account so...
>>> So you mentioned for security, once a job is complete, you delete it. Is there any
ability to retain that for at least a short period so that you could reprint successful
jobs? >>Akshay Kannan: So one thing you can do is
if you are the printer receiving the jobs, if you want to reprint successful jobs, we
only delete the job content when the status gets set to done, so if you're the developer,
you could just set the status to be "in progress", or move it from "in progress" back into queued,
and with all of these different states we would retain the job on our side.
>>> I guess what I would like to see is -- is that ability when you're using the connector,
so you've got an existing printer, but that capability magically from your end.
>>Akshay Kannan: Sorry, I didn't catch exactly that.
>>> So maybe just the ability to automatically keep a copy of everything you print in the
drive, so not choosing one or the other, but archive.
>>Akshay Kannan: I see. I see. That would definitely be interesting looking into. I
know there's definitely document retention and privacy implications around that as well,
because not everyone wants all their print jobs saved, but it's definitely something
worth looking into. >>> Thanks.
>>> I love Google Cloud Print by the way, but my question is say you're in Google Drive,
and you have a picture file, I think if you print it now, it like -- it just comes out
in a standard way. Are you guys like thinking of any options -- like if you wanted a full
page photo or like half page or like -- is there a way to format it?
>>Akshay Kannan: So currently your formatting options are limited to what the printer service
is and the capabilities. Definitely over time we'll be expanding what those capabilities
are. Some things like scaling would be options that are -- that are part of the dialogue,
but I think for now the best approach is to client side just generate the PDF how you
want it to look or just flow the image how you want it to look and then send it to our
service, but, yeah, definitely it's future work for us, but not currently there.
>>> At -- on my home system if I'm not logged in, and I see my son is logged in on the computer,
I can't print. Is there any work to have like an appliance that could just sit on the network,
you know, a tiny little box that would prevent -- or provide the cloud services so that I
don't have to worry about being logged in? >>Akshay Kannan: There's -- that's definitely
a -- something that's -- a developer could technically build. We currently don't have
anything like that. >>Yuri Dolgov: We have source implementation
for WRT support, in just -- it's in early stage, but (indiscernible) we implemented
this, and the problem he faced is basically a drivers problem. This implementation supports
pretty much every file as I remember, and, well, maybe something else, but it won't support
like every single printer. And it's hard to implement one that will support every single
printer. >>> Where would I find that?
>>Akshay Kannan: Currently we don't link to it from anywhere, but we can talk to you after
the presentation. It's currently a project that's just on Google code that was published
by another Google engineer who built this as an enthusiastic side project.
>>> So kind of back to the scaling. Say you have a printer that doesn't print
8.5 x 11, and you print an image or a PDF, what happens?
Does that get scaled down up to the media, or does it print at some, you know, fixed
resolution conversion? >>Akshay Kannan: I believe some of that depends
on the printer you're printing to. If there's a fit-to-page option, then we currently service
that and allow you to scale it down to whatever the output format is. Otherwise, I think the
default behavior is just to print it out exactly how it is, so it might not be perfectly aligned
when you're trying to print and 8.5 x 11 PDF on your A4 paper. That is the current behavior.
I think going forward we'll be working on expanding fit-to-page capabilities. But that's
why we were also mentioning the ideal experience rather than scaling is you want your document
to be reflowed which is why we do recommend HTML for document submissions because we can
intelligently flow that for whatever printer it's ending up on.
>>> But you don't necessarily have control over what that source content is, if you want
to print some third party content that you were just browsing to, say?
>>Akshay Kannan: Yes, if it's -- if it's, for example, a PDF that's 8.5 x 11 that you
want to print to A4 paper, then our best options there are fitting to page or printing it out
as it is, so we won't be able to intelligently reflow that in that case.
>>> Okay, thanks. >>> Can you please talk a bit more about the
setup you had on the first floor? Can I make one of my printers public?
>>Akshay Kannan: Currently the setup we have on our first floor is actually just part of
a pilot that we're running to try and make printers public, so none of this UI is currently
available. That being said, depending on the -- we're basically trying this out as a pilot
to see how people interact with it. I think moving forward it might be something that
we pursue more seriously and open up to developers and to users.
>>> If my printer is not cloud ready, how do I print to it?
>>Akshay Kannan: So if your printer is not cloud-ready, you can set up the Chrome connector,
so this is -- or there's a slide earlier. Basically from within the -- if your printer
is connected to a desktop or a laptop at home, you can go to Chrome settings and enable from
advanced options, Google cloud print connector, which will take that printer and then share
it with your Google account using that local machine as a print server.
>>> The printer cannot be a network printer? >>Akshay Kannan: It could be a network printer,
as long as -- the only restriction is that the laptop or the computer that you're using
as the Cloud Print connector has to be able to see that printer locally or over the network.
It has to be part of the OS print dialogue. >>> Okay, thanks.
>>> If the page has a specific CSS layout for print media, will the print Cloud Print
-- >>Yuri Dolgov: Specific print and layout so,
yes. >>> And also your https rasts API, can I set
the orientation program -- like orientation equals landscape or --
>>Yuri Dolgov: Oh, yeah, it depends on the printer. If printer supports orientation,
we'll show orientation. If printer doesn't support orientation, we don't do anything.
>>> No, no, I mean, I guess certain printers -- for some reason it has to do with drivers
that's not -- exposed the API for software to control whether it always asks the user
what orientation, but were you able to experiment? Have you done it to programmatically set the
-- >>> With most printers you are able to programmatically
set the orientation using the capabilities, basically when you get your -- when you fetch
the capabilities for that printer, you can find the ones which correspond to orientation,
set them in your print ticket, and then when you do your submit call, you can specify that
print ticket with the orientation specified. >>> Thanks.
>>> So you mentioned some esoteric encryption solutions where I would implement my -- a
shared key or something with my clients. If I need an end-to-end security where Google
never sees my content, would I have to do that, or is there another option?
>>Akshay Kannan: Yeah. So, as I mentioned earlier, you can -- yeah, with end-to-end
security such that we never see your content, the best solution currently that we have is
for you to encrypt it client side and decrypt after receiving it. The disadvantage there
is you lose the functionality for us to convert the document because we can't read it, but
it would be completely invisible to us in that case.
>>> Thanks. >>> Hi, you said raster data is either PDF,
is there any plan to support XPSS or -- >>Akshay Kannan: The question was is there
plans to support XPS as an output format. The answer is currently no. We're always looking
into new formats to explore, but for the -- for the foreseeable future, PDF and PW Raster
are our primary formats going forward. >>> Is it because XPS is from Microsoft?
[ Laughter ] >>Akshay Kannan: I'm not going to comment
on that. >>> So kudos on Cloud Print. It's a very useful
facility. We have a network, a guest network that we let people connect in on, and we have
our printers on our private network. So Cloud Print helps with that, being able to not have
them on the same network, but one of the issues is is being able to print from Word or other
OS-level type printers. There's an open source piece of software that lets you do that, but
apparently with that piece of software it only lets you print one copy at a time. Is
there going to be anything supported by Google that would allow, you know, printing from
OSB first class, first class printing, like from Mac OS or --
>>Akshay Kannan: We -- yeah, we currently don't have any plans to announce in that direction,
but that's definitely something that -- that we're looking into going forward, and currently
I guess the one way to get around the fact that that isn't currently there is to save
it as a PDF and then print it through Cloud Print in Chrome, but, yeah, there's -- we
currently don't have stuff to announce but --
>>> It makes the -- the wife acceptance factor pretty low when you have to go through and
do those kind of gyrations. >>Akshay Kannan: Absolutely.
>>> The second thing is is someone had mentioned about a device like one of the things I toyed
around with is using raspberry pie and putting Google Cloud Print on something like that.
Is anyone at Google or on your team interested in doing something like that, or would they
support developers that were interested in doing a project like that?
Because that seems like that would be an ideal solution to provide printers, especially if
you have a large investment in Legacy printers that you don't want to replace with Google
Cloud Printers. >>Akshay Kannan: Yeah. Absolutely. As I mentioned,
we did have an engineer who put together a reference implementation of a Cloud Print
server on a router, and that is all open source on Google code, so I can hand you my contact
information or you can message the Google groups and we'll be happy to point you to
the code, and also put you in touch with the guy who wrote it so --
>>> Okay. Cool. Thanks. >>> On that side.
>>> I think he was before me. >>> All right. I have two questions. First
question is how do you handle updates to capabilities? For example, you know, you have a server that
got upgraded to handle duplex printing or the toners are completely out, you can't print
anymore. Is it over XMPP? >>Akshay Kannan: So actually, we have an up
-- I didn't mention this API, but we do have an update API which allows you to do exactly
that. It's basically an https call that the printer makes. You specify new capabilities,
what's changed since last time, and we'll automatically update all of that server side.
>>> That's over the tags, then? >>Akshay Kannan: That's over https.
>>> And the second question is -- I forgot. All right, I'll come back.
>>> Okay, so my questions are that when you have multiple printers it's -- it gets quite
hard to determine if they are -- you have the three different connectivity options,
and it's very hard to determine which of them are connected in which ways, or at least used
to be. So what's your opinion on that, and in windows environments, in -- at least in
Windows 7, you can get an image of the printer so you can see, oh, that's -- that's one.
Are there any developments in that direction? >>Akshay Kannan: So I guess a couple of different
approaches we have are we do in our dialogue use iconography to distinguish different types
of printers. We also have a rename functionality that users can use on their side to name the
printer such that you can differentiate between different printers. I don't know if there's
anything else I'm forgetting that kind of helps along these lines, but we have a couple
of solutions in place. I know there's also a description field that you can specify as
part of the printer which will show up in the print dialogue which you can use to differentiate
different printers. >>> Okay. Thank you. Would it be possible
to group printers like on departments on functionality-wise, or it could also be -- say if you have a mobile
device or it feels that, okay, you're in this city or in this office, then these are the
available printers from the ones that are close nearby?
>>Akshay Kannan: So currently the answer to that is no, but we do sort of have a solution
in place which is our search, our search in our Cloud Print Web dialogue search is not
only over printer names but over capabilities and description fields. So one thing we do
for example in Google is every printer has a description field for the building that
it's in, so all I have to do is type my building name into the search dialogue and I'll see
all the printers that are near me. Another thing is we also do -- I think you mentioned
grouping by capabilities, or what options a printer can do, we do search over those
as well, so if you search for I only want to see color printers, you can type in color
and just get a list of printers which can print to color.
>>> Okay, so new employees at Google, you have like a thousand printers in your dialogues.
>>Akshay Kannan: Uh-huh. >>> Okay. Then you search for nearby --
>>Akshay Kannan: Exactly. >>> Okay.
>>Yuri Dolgov: You usually only use a couple of them, and once you use printer, they will
be on top basically. So you only need to do search once or twice.
>>> Thank you. >>> When you submit print jobs, you have to
be locked in in the browser or in Android. Is there any way that a server application
might be able to submit print jobs? The case I have, all the use case where we
might be able to use this is one of our clients runs a E commerce site, and they would love
to be able to use Cloud Print to print older notifications as they come in.
>>Yuri Dolgov: You can do that. You can create any account that you can share the printer
with, and then just using AUTH, you can authenticate server with this account and totally submit
this account. >>> Okay.
>>Akshay Kannan: Yeah, we support both AUTH and client login for authentication, so you
could use that server side to authenticate into our API with a dummy Google account and
then use that to submit print jobs. >>> Excellent. Thank you.
>>Akshay Kannan: Sure. >>> Okay. I'm wondering what kind of data
has Google extract from my print jobs? Because privacy (indiscernible) but there must be
some other reasons to process data. >>Akshay Kannan: If the source and destination
formats of your print job are the same, so let's say you're printing a PDF to a PDF,
absolutely nothing. We just send the document over to the printer without any conversion
on our side. In terms of -- so in terms of conversion, we do use a conversion service
to convert your document to the format it needs to be in, but, yeah, as I mentioned
before, the converted document will not persist on our server for more than 30 days. The only
thing I guess that stays left over are standard http logs, and also I guess the fact that
within your account you'll see these -- you'll see your print job history.
>>> So Google has no content extraction kind of -- if I print my bank account statements
it's not -- >>Akshay Kannan: Not at all. We don't use
your print jobs to serve ads. [ Laughter ]
>>> Is there any update on the Android as an official Cloud Print, because as I recall,
it was still something that was semi unofficial. >>Akshay Kannan: So, yeah, we are working
on integrating with the Android properties of Google Apps going forward, but as far as
platform integration goes, we don't have anything to announce at the moment.
>>> And then secondly, I think this has been asked about three or four different ways,
at least, but I'm not sure that I got it completely straight. In our office, for instance, we
have a large group of people that come in and out, and we have Legacy printers, and
I didn't really want to leave the Legacy printer connected to a machine on my account, since
I'm not there all the time, amongst other things, but also the machines themselves are
generally public, so I ended up putting it on one of the administrator's -- one of the
administrator's accounts and leaving it there, but it doesn't seem to be any way to have
that done without having a specific account which you then can delegate out of. That's,
I think, the summarization of everything that I've heard.
>>Akshay Kannan: In terms of accounts are you referring to like log-in accounts?
>>> They have to have a Gmail account in order to be able to have a printer -- in order to
be able to attach it to a legacy printer, which they can then share. And there's no
other way around that that I can figure. >>> Just in general, enterprise printing I
guess would be the question and how do you take a set of enterprise printers and let
a specific set of people or even make it public, which is kind of what you're doing downstairs.
Is that going to be available soon or when is that going to be available?
>>Akshay Kannan: I guess in terms of both questions, with having an account in order
to register a printer, you do need a Google account in order to register your printer
with Cloud Print. That being said, it doesn't have to be your Google account or someone
else's. A lot of the enterprises that we work with,
to answer your question, use what they call a roll account, which is just a dedicated
Google account that they set up for the express purpose of printing that they can share access
to, and they'll use that to run the print server so that way no one has to use their
personal account to -- >>> Is there a way to -- so if you have a
set of employees, is there a way to share the printer with them or basically make it
available in their preferences so they don't have to be accepting invitations for this?
>>Akshay Kannan: Absolutely. So we're working on expanding more of that going forward, but
what you can already currently do is share it with a group.
So for example, let's say you have a Google group that encompasses everyone within your
domain. You can from within the share interface that we demoed earlier, just type in that
group. And all that needs to happen is the owner
of that group can accept the invitation on behalf of people in the organization.
>>> Okay. Thanks. >>> I develop an application that actually
works like print server, and the printer is a terminal printer, and I control the printer
by escape comments. So I open the LPT port and send comments. How about in that case?
>>Akshay Kannan: So this is with a terminal printer that you account to over LPR?
>>> Yes, but it's connected to my applications. There is no drivers, there is no --
>>Akshay Kannan: I see. If there's no standard print drivers, we won't be able to integrate
that with Cloud Print. So currently -- I'm assuming you want to set
up the Cloud Print connector from within Chrome to share it with your Cloud Print account?
In that case we only take the local printers which are actually in your OS print dialogue
to share. So we won't be sharing it unless it's -- unless it uses the standard OS print
mechanism to receive print jobs. >>> Okay. But is it -- can I make a connector
to the Google server? Okay. >>Akshay Kannan: Yeah.
>>> I remembered the question now. So you mentioned you can print to your mobile
Nexus, right? What does that mean? Like it's just PDF on the flash drive?
>>Akshay Kannan: Exactly. What we do is we take the job, we convert it to a PDF and then
we push a notification to your device that starts a download of that PDF. So you don't
even have to be running Chrome as Android. It runs as a background service using Android
push. So you can print anything to your phone and it just shows up as a PDF on the device.
Next questions. >>> Getting back to the non-cloud-ready printer.
You said you simply do this from a PC or something like that. Is there some software you have
to load on to the PC in order for it to act as the server? I assume it's acting as a cloud-ready
server. >>Akshay Kannan: So currently it works within
Google Chrome. You have to have Chrome installed on that PC.
>>> Chrome OS? >>Akshay Kannan: No, just the Chrome browser.
So from within the settings on Google Chrome you can configure your local printers to be
cloud ready. And there's no additional software apart from Google Chrome required.
>>> So then it acts as a cloud-ready server. >>Akshay Kannan: Exactly.
>>> Okay. >>> One more.
Can you tell us about Cloud Print integration with Google Apps, like sharing to groups,
et cetera? >>Akshay Kannan: Yeah. In terms of apps integration,
we do support -- is this for enterprise in particular?
>>> Yeah. >>Akshay Kannan: Yeah. For enterprise integration
we have -- currently our consumer solution for most part is our enterprise solution.
There are plans to move that into a more custom enterprise solution going forward.
But yeah, for now integration we offer at a basic level is -- as we mentioned you can
configure Chrome to run as a headless server on Linux and then also with group sharing
you can easily share printers with groups of people.
>>> So if that's -- if you add a new user to a group, if we have a group called printers
and we have five or ten printers connected to that group and you add a new user to that
group, would he automatically have the print when he log on to his new account?
>>Yuri Dolgov: Yes. >>> Okay. Excellent, thanks.
>>Akshay Kannan: Cool. Do we have one more? All right. Last question.
>>> Normally the driverless printing is a myth, used to be, but you guys has really
done a good job that it can be a reality. I really appreciate that.
>>Akshay Kannan: Thank you. >>Yuri Dolgov: Thank you.
>>Akshay Kannan: Thank you so much. Thanks a lot, everyone.
[ Applause ]