雲端裝置說明

雲端裝置說明 (CDD) 是一般概念,大致涵蓋雲端裝置的屬性和功能。CDD 1.0 (GCP 2.0 支援的 CDD 版本) 將以下概念分為五種格式:

  • CDD 說明裝置的功能。
  • CJT (Cloud 工作票券) 說明瞭裝置支援的指令選項。
  • CDS (Cloud Device State) 會描述裝置的完整語意狀態。
  • CJS (Cloud 工作狀態) 描述了裝置上工作的語意狀態。
  • 本機設定是指使用者可編輯的設定,不會隨著正常使用的裝置變更。

這些格式列於 Google 的 Protobuf 語言中,這些指令是從 Cloud proto 伺服器傳送並傳送,並透過 protobufs 序列化的 JSON 字串進行通訊,這就是本頁的範例。

注意:這些 protobuf 定義中應忽略 optional 關鍵字。上述說明中包含 (required) 的所有欄位均為必填,所有其他欄位則為選填 (或重複)。

雲端裝置說明 – 格式

CDD 格式是用於說明雲端連線裝置 (例如 Google 雲端列印的印表機) 的功能。例如色彩列印、雙重列印或支援多種紙張大小。

注意:Cloud Device 說明已淘汰,但已淘汰,但在 ChromeOS 的擴充功能中並無法與 chrome.printing API 搭配使用。

以下是頂層資料結構 CDD 的 protobuf 定義:

// Description of a cloud-enabled device's capabilities and properties. Also
// known as CDD.
message
CloudDeviceDescription {

 
// Version of the CDD in the form "X.Y" where changes to Y are backwards
 
// compatible, and changes to X are not (required).
  optional
string version = 1;

 
// Section of the CDD that specifically describes printers.
  optional
PrinterDescriptionSection printer = 101;

 
// Section of the CDD that specifically describes scanners.
  optional
ScannerDescriptionSection scanner = 102;
}

XPSPPD 等印表機功能語言是以一般語言指定功能,並使用關鍵字來指定特定功能的部分功能 (例如該功能代表文件的顏色,或應該列印的份數)。CDD 格式會採取不同方法,針對每部裝置功能定義一組自訂的自訂 protobufs。

GCP 提供的網站工具可將 XPS 和 PPD 檔案自動轉換為 CDD,並以視覺化的方式呈現使用者介面 (提供有效的 CDD)。

可以發現 CDD 的主要內容會細分為子區段。這些子區段原本就是印表機和掃描器,我們也許會感受到 CDD 可以代表印表機或掃描器,甚至是兩者的組合:印表機掃描器組合。

注意事項:CDD、CJT 和 CDS 的掃描工具區段 Protobuf 定義會在 GCP 正式發布雲端掃描 API 時公開。

印表機說明區段

本節的 CDD 說明印表機的功能和特色。以下是 protobuf 的定義:

// Section of a CDD that describes the capabilities and physical units of a
// cloud-connected printer.
message
PrinterDescriptionSection {

 
// Content types (sometimes referred to as MIME types) that are supported by
 
// the printer.
 
//
 
// The order of these types determines which content type the document should
 
// be converted to. For example, if the types are ordered as:
 
//
 
//   [
 
//     {"content_type": "application/pdf"},
 
//     {"content_type": "image/pwg-raster"}
 
//   ]
 
//
 
// Then the document's content type will first be matched to any content type
 
// in the list. If there is a match, then the document will be sent to the
 
// printer as is. If there is no match, then the document will be converted to
 
// a content type which the server supports starting from the first option. In
 
// this example, if the document is sent as "text/html" and the printer
 
// supports "application/pdf" and "image/pwg-raster", then the document will
 
// be converted to "application/pdf" and not "image/pwg-raster", because
 
// "application/pdf" is declared earlier in this list.
  repeated
SupportedContentType supported_content_type = 1;

 
// Printing speeds that the printer can operate at.
  optional
PrintingSpeed printing_speed = 2;

 
// PWG raster configuration of the printer. Required if the printer supports
 
// image/pwg-raster content type, and it should be omitted otherwise.
 
// This allows a cloud service to understand how to rasterize a document in
 
// PWG-raster for the printer.
  optional
PwgRasterConfig pwg_raster_config = 3;

 
// Physical model of the printer's input trays.
  repeated
InputTrayUnit input_tray_unit = 4;

 
// Physical model of the printer's output bins.
  repeated
OutputBinUnit output_bin_unit = 5;

 
// Physical model of the printer's markers.
  repeated
Marker marker = 6;

 
// Physical model of the printer's covers.
  repeated
Cover cover = 7;

 
// Physical model of the printer's media paths.
  repeated
MediaPath media_path = 8;

 
// Vendor-provided printer capabilities.
  repeated
VendorCapability vendor_capability = 101;

 
// Color printing capabilities of the printer.
  optional
Color color = 102;

 
// Duplexing capabilities of the printer.
  optional
Duplex duplex = 103;

 
// Page/paper orientation capabilities of the printer.
  optional
PageOrientation page_orientation = 104;

 
// Multiple copy capability of the printer.
  optional
Copies copies = 105;

 
// Page margins capability of the printer.
  optional
Margins margins = 106;

 
// Printing quality or dots-per-inch (DPI) capabilities of the printer.
  optional
Dpi dpi = 107;

 
// Page fitting capabilities of the printer.
  optional
FitToPage fit_to_page = 108;

 
// Page range selection capability of the printer.
  optional
PageRange page_range = 109;

 
// Page or media size capabilities of the printer.
  optional
MediaSize media_size = 110;

 
// Paper collation capability of the printer.
  optional
Collate collate = 111;

 
// Reverse order printing capability of the printer.
  optional
ReverseOrder reverse_order = 112;
}
// Property that defines what content types the printer can print natively.
message
SupportedContentType {
 
// Content type (e.g. "image/png" or "application/pdf"). Use */* if your
 
// printer supports all formats (required).
  optional
string content_type = 1;

 
// Minimum supported version of the content type if applicable (e.g. "1.5").
  optional
string min_version = 2;

 
// Maximum supported version of the content type if applicable (e.g. "1.5").
  optional
string max_version = 3;
}
// Property that defines what speeds (in pages per minute) the printer can
// operate at.
message
PrintingSpeed {
 
// Available speed of the printer.
 
//
 
// Specify settings that are associated with the given speed. If a setting
 
// is left unset, then it will be assumed that the speed is independent of
 
// that setting. For example, the following Option
 
//
 
//   {
 
//     "speed_ppm": 5.5,
 
//     "color_type": ["STANDARD_MONOCHROME"],
 
//     "media_size_name": ["NA_LETTER", "ISO_A4"]
 
//   }
 
//
 
// indicates that the printer prints at 5.5 pages per minute when printing in
 
// STANDARD_MONOCHROME in either NA_LETTER or ISO_A4 paper sizes.
  message
Option {
   
// Speed measured in pages per minute (required).
    optional
float speed_ppm = 1;

   
// Types of color settings that operate at this speed.
    repeated
Color.Type color_type = 2;

   
// Names of media sizes that operate at this speed.
    repeated
MediaSize.Name media_size_name = 3;
 
}

 
// Speeds that the printer can operate at.
  repeated
Option option = 1;
}
// Configuration of how printer should receive PWG raster images.
message
PwgRasterConfig {

  message
Resolution {
    optional int32 cross_feed_dir
= 1;  // Horizontal resolution in DPI.
    optional int32 feed_dir
= 2;  // Vertical resolution in DPI.
 
}

 
// Resolutions (in DPI) of the pages that the printer supports in PWG-raster
 
// format. The resolution MUST be supported for every page media supported by
 
// the printer. (Same as PwgRasterDocumentResolutionSupported PWG-raster
 
// semantic model element.) This field is strongly recommended, as it helps
 
// GCP to decide which resolutions are supported by the printer for PWG-raster
 
// documents if it has to downscale the document to a lower resolution.
 
//
 
// This list can be a subset of the full set of resolutions supported by the
 
// printer (in formats different from PWG-raster, e.g. PDF), but it MUST
 
// include an NxN DPI resolution where N <= 360 and N evenly divides all
 
// resolutions supported by the printer. A resolution NxN where N >= 600
 
// (possibly 600 or 720) is also strongly recommended.
 
//
 
// GCP will generate PWG-raster pages not necessarily at the resolution
 
// reported in the ticket, but the actual DPIs of the page (horizontal and
 
// vertical) will always perfectly divide the corresponding values reported in
 
// the ticket.
  repeated
Resolution document_resolution_supported = 2;

 
// List of PWG-raster document types (in terms of color space and bits per
 
// color) supported by the printer. Color printers MUST support SRGB_8 and
 
// possibly SGRAY_8. Monochrome printers must support either SRGB_8 or
 
// SGRAY_8. However, any printer that doesn't support SGRAY_8 must be able
 
// to perform conversion from RGB to grayscale if it receives a PWG-raster
 
// document in SRGB and the print job ticket specifies monochrome printing.
 
//
 
// This field is strongly recommended, and we recommend to include all types
 
// supported by the printer, as GCP may start serving more document types in
 
// the future.
  repeated
PwgDocumentTypeSupported document_type_supported = 3;

 
// Describes which transformation needs to be applied to back pages in
 
// duplexing in order to have them printed properly.
 
// The value mainly depends on how duplexing works on the printer, and the
 
// actual effect depends on which duplexing is specified in the ticket.
 
enum DocumentSheetBack {
   
// No special treatment for back pages (same as front page).
    NORMAL
= 0;
   
// Back pages are rotated 180 degrees if the document is portrait
   
// (TwoSidedLongEdge duplexing).
    ROTATED
= 1;
   
// Back pages are rotated 180 degrees if the document is landscape
   
// (TwoSidedShortEdge duplexing, opposite of ROTATED).
    MANUAL_TUMBLE
= 2;
   
// Page is flipped upside-down if portrait (TwoSidedLongEdge duplexing),
   
// left-right if landscape (TwoSidedShortEdge duplexing).
    FLIPPED
= 3;
 
}
 
// Same as PwgRasterDocumentSheetBack PWG-raster semantic model element.
 
// Default value is ROTATED.
  optional
DocumentSheetBack document_sheet_back = 4 [default = ROTATED];

 
// Instructs GCP that the printer wants to print pages from the last to the
 
// first. In that case GCP will stream PWG-raster pages in that order.
  optional
bool reverse_order_streaming = 5;

 
// Instructs GCP that the printer prefers receiving pages rotated 180 degrees.
 
// This rotation is in addition to possible additional rotations of even pages
 
// based on document_sheet_back in case of duplexing.
  optional
bool rotate_all_pages = 6;

 
// PWG-raster document types (in terms of color space and bits per color).
 
// This list is based on the PWG-raster specs of March 14, 2012, and it
 
// will be extended without notice if new types are added to newer versions
 
// of the specs. If a new type is not accepted by GCP capability parser please
 
// inform the GCP team. (This doesn't mean that GCP will start sending
 
// documents of the new kind.)
 
//
 
// The string names are identical to the keyword attribute values in
 
// PWG-raster documentation, except they are uppercase, and dashes are
 
// replaced by underscores.
 
enum PwgDocumentTypeSupported {
    BLACK_1
= 1;
    SGRAY_1
= 2;
    ADOBE_RGB_8
= 3;
    BLACK_8
= 4;
    CMYK_8
= 5;
    DEVICE1_8
= 6;
    DEVICE2_8
= 7;
    DEVICE3_8
= 8;
    DEVICE4_8
= 9;
    DEVICE5_8
= 10;
    DEVICE6_8
= 11;
    DEVICE7_8
= 12;
    DEVICE8_8
= 13;
    DEVICE9_8
= 14;
    DEVICE10_8
= 15;
    DEVICE11_8
= 16;
    DEVICE12_8
= 17;
    DEVICE13_8
= 18;
    DEVICE14_8
= 19;
    DEVICE15_8
= 20;
    RGB_8
= 21;
    SGRAY_8
= 22;
    SRGB_8
= 23;
    ADOBE_RGB_16
= 24;
    BLACK_16
= 25;
    CMYK_16
= 26;
    DEVICE1_16
= 27;
    DEVICE2_16
= 28;
    DEVICE3_16
= 29;
    DEVICE4_16
= 30;
    DEVICE5_16
= 31;
    DEVICE6_16
= 32;
    DEVICE7_16
= 33;
    DEVICE8_16
= 34;
    DEVICE9_16
= 35;
    DEVICE10_16
= 36;
    DEVICE11_16
= 37;
    DEVICE12_16
= 38;
    DEVICE13_16
= 39;
    DEVICE14_16
= 40;
    DEVICE15_16
= 41;
    RGB_16
= 42;
    SGRAY_16
= 43;
    SRGB_16
= 44;
 
}

 
// [Deprecated: Please use the other fields of PwgRasterConfig.]
 
// Transformation to apply to pages during PWG rasterization.
  message
Transformation {
   
// Types of transformation operations to apply.
   
enum Operation {
     
// Rotate pages 180 degrees.
      ROTATE_180
= 0;

     
// Flip pages along the long edge of the paper.
      FLIP_ON_LONG_EDGE
= 1;

     
// Flip pages along the short edge of the paper.
      FLIP_ON_SHORT_EDGE
= 2;
   
}

   
// Selectors of which pages to apply the transformation to.
   
enum Operand {
     
// Apply transformation to all pages.
      ALL_PAGES
= 0;
     
// Apply transformation to even pages only when duplexing (deprecated,
     
// instead use EVEN_PAGES and specify appropriate duplex types).
      ONLY_DUPLEXED_EVEN_PAGES
= 1;
     
// Apply transformation to odd pages only when duplexing (deprecated,
     
// instead use ODD_PAGES and specify appropriate duplex types).
      ONLY_DUPLEXED_ODD_PAGES
= 2;
     
// Apply transformation to even pages.
      EVEN_PAGES
= 3;
     
// Apply transformation to odd pages.
      ODD_PAGES
= 4;
   
}
   
// Required.
    optional
Operation operation = 1;
   
// Required.
    optional
Operand operand = 2;
   
// Duplex types that the transformation applies to. Leave empty if the
   
// transformation is applicable to all duplex types.
    repeated
Duplex.Type duplex_type = 3;
 
}

 
// [Deprecated and only partially supported. Please use the other fields of
 
// PwgRasterConfig.
 
// Out of all possible transformations GCP will only support rotating all
 
// pages, but for that we strongly recommend using the rotate_all_pages
 
// boolean field instead.]
 
// What transformations to apply to pages in the print job.
  repeated
Transformation transformation = 1;
}
// Physical model of a printer input tray.
message
InputTrayUnit {
 
// Enumeration of input tray types.
 
enum Type {
    CUSTOM
= 0;
    INPUT_TRAY
= 1;
    BYPASS_TRAY
= 2;
    MANUAL_FEED_TRAY
= 3;
    LCT
= 4;  // Large capacity tray.
    ENVELOPE_TRAY
= 5;
    ROLL
= 6;
 
}

 
// Vendor-provided ID of the input tray (required).
  optional
string vendor_id = 1;

 
// Type of input tray (required).
  optional
Type type = 2;

 
// Index of the input tray.
  optional int64 index
= 3;

 
// Non-localized custom display name of the input tray.
 
// New CDDs should use custom_display_name_localized instead. It is required
 
// that either custom_display_name or custom_display_name_localized is set if
 
// the tray's type is CUSTOM.
  optional
string custom_display_name = 4;

 
// Translations of custom display name of the input tray.
 
// If not empty, must contain an entry with locale == EN.
  repeated
LocalizedString custom_display_name_localized = 5;
}
// Physical model of a printer output bin.
message
OutputBinUnit {
 
// Enumeration of output bin types.
 
enum Type {
    CUSTOM
= 0;
    OUTPUT_BIN
= 1;
    MAILBOX
= 2;
    STACKER
= 3;
 
}

 
// Vendor-provided ID of the output bin (required).
  optional
string vendor_id = 1;

 
// Type of output bin (required).
  optional
Type type = 2;

 
// Index of the output bin.
  optional int64 index
= 3;

 
// Non-localized custom display name of the output bin.
 
// New CDDs should use custom_display_name_localized instead. It is required
 
// that either custom_display_name or custom_display_name_localized is set if
 
// the bin's type is CUSTOM.
  optional
string custom_display_name = 4;

 
// Translations of custom display name of the output bin.
 
// If not empty, must contain an entry with locale == EN.
  repeated
LocalizedString custom_display_name_localized = 5;
}
// Physical model of a printer marker.
message
Marker {
 
// Enumeration of types of printer markers.
 
enum Type {
    CUSTOM
= 0;
    TONER
= 1;
    INK
= 2;
    STAPLES
= 3;
 
}

 
// Message that describes the color of a marker.
  message
Color {
   
// Enumeration of color types of the printer marker.
   
enum Type {
      CUSTOM
= 0;
      BLACK
= 1;
      COLOR
= 2;
      CYAN
= 3;
      MAGENTA
= 4;
      YELLOW
= 5;
      LIGHT_CYAN
= 6;
      LIGHT_MAGENTA
= 7;
      GRAY
= 8;
      LIGHT_GRAY
= 9;
      PIGMENT_BLACK
= 10;
      MATTE_BLACK
= 11;
      PHOTO_CYAN
= 12;
      PHOTO_MAGENTA
= 13;
      PHOTO_YELLOW
= 14;
      PHOTO_GRAY
= 15;
      RED
= 16;
      GREEN
= 17;
      BLUE
= 18;
   
}

   
// Required.
    optional
Type type = 1;

   
// Non-localized custom display name of the color.
   
// New CDDs should use custom_display_name_localized instead. It is required
   
// that either custom_display_name or custom_display_name_localized is set
   
// if the color's type is CUSTOM.
    optional
string custom_display_name = 2;

   
// Translations of custom display name of the color.
   
// If not empty, must contain an entry with locale == EN.
    repeated
LocalizedString custom_display_name_localized = 3;
 
}

 
// Vendor-provided ID of the marker (required).
  optional
string vendor_id = 1;

 
// Type of marker (required).
  optional
Type type = 2;

 
// Color of the marker. Only needed if marker type is INK or TONER.
  optional
Color color = 3;

 
// Non-localized custom display name of the marker.
 
// New CDDs should use custom_display_name_localized instead. It is required
 
// that either custom_display_name or custom_display_name_localized is set
 
// if the marker's type is CUSTOM.
  optional
string custom_display_name = 4;

 
// Translations of custom display name of the marker.
 
// If not empty, must contain an entry with locale == EN.
  repeated
LocalizedString custom_display_name_localized = 5;
}
// Physical model of a printer cover.
message
Cover {
 
// Enumeration of cover types.
 
enum Type {
    CUSTOM
= 0;
    DOOR
= 1;
    COVER
= 2;
 
}

 
// Vendor-provided ID of the cover (required).
  optional
string vendor_id = 1;

 
// Type of the cover (required).
  optional
Type type = 2;

 
// Index of the cover.
  optional int64 index
= 3;

 
// Non-localized custom display name of the cover.
 
// New CDDs should use custom_display_name_localized instead. It is required
 
// that either custom_display_name or custom_display_name_localized is set
 
// if the cover's type is CUSTOM.
  optional
string custom_display_name = 4;

 
// Translations of custom display name of the cover.
 
// If not empty, must contain an entry with locale == EN.
  repeated
LocalizedString custom_display_name_localized = 5;
}
// Physical model of a media path of a printer. Media paths are the paths
// through which print media flows.
message
MediaPath {
 
// Vendor-provided ID of a media path (required).
  optional
string vendor_id = 1;
}

注意:顯示印表機 CDD 內含的輸入匣、輸出容器、標記、封面和媒體路徑的模型。他們「不」代表使用者可設定的列印選項。

// Flexible capability that can represent range-based, selection-based, or
// typed-value-based capabilities.
message
VendorCapability {
 
enum Type {
    RANGE
= 0;
    SELECT
= 1;
    TYPED_VALUE
= 2;
 
}

 
// ID of the capability. Used in CJT to associate a ticket item with this
 
// capability (required).
  optional
string id = 1;

 
// Non-localized user-friendly string to represent this capability.
 
// New CDDs should use display_name_localized instead. It is required that
 
// either display_name or display_name_localized is set.
  optional
string display_name = 2;

 
// Type of this capability (required).
  optional
Type type = 3;

 
// Range-based capability definition.
  optional
RangeCapability range_cap = 4;

 
// Selection-based capability definition.
  optional
SelectCapability select_cap = 5;

 
// Typed-value-based capability definition.
  optional
TypedValueCapability typed_value_cap = 6;

 
// Translations of display name of this capability.
 
// If not empty, must contain an entry with locale == EN.
  repeated
LocalizedString display_name_localized = 7;
}
// Message that stores capability information specific to range-based
// capabilities.
message
RangeCapability {
 
enum ValueType {
    FLOAT
= 0;
    INTEGER
= 1;
 
}

 
// Data type of the value of the range capability (required).
  optional
ValueType value_type = 1;
  optional
string default = 2;
  optional
string min = 3;
  optional
string max = 4;
}
// Selection-based device capability. Allows the user to select one or many of
// a set of options.
message
SelectCapability {

 
// A user-selectable option of the vendor capability.
  message
Option {

   
// A single string that represents the value of this option. This value
   
// will be used in the VendorTicketItem.value field (required).
    optional
string value = 1;

   
// Non-localized user-friendly string to represent this option.
   
// New CDDs should use display_name_localized instead. It is required that
   
// either display_name or display_name_localized is set.
    optional
string display_name = 2;

   
// Whether this option is the default option. Only one option should be
   
// marked as default.
    optional
bool is_default = 3 [default = false];

   
// Translations of display name of the option.
   
// If not empty, must contain an entry with locale == EN.
    repeated
LocalizedString display_name_localized = 4;
 
}

 
// List of options available for this capability.
  repeated
Option option = 1;
}
// Message that stores capability information specific to typed-value-based
// capabilities.
message
TypedValueCapability {
 
enum ValueType {
    BOOLEAN
= 0;
    FLOAT
= 1;
    INTEGER
= 2;
    STRING
= 3;
 
}

 
// Type of data of the typed-value capability (required).
  optional
ValueType value_type = 1;
 
// Default value of the typed-value capability.
  optional
string default = 2;
}
// Capability that defines the color options available on a device.
message
Color {
 
enum Type {
    STANDARD_COLOR
= 0;
    STANDARD_MONOCHROME
= 1;
    CUSTOM_COLOR
= 2;
    CUSTOM_MONOCHROME
= 3;
    AUTO
= 4;
 
}

  message
Option {
   
// ID to help vendor identify the color option (required for options of type
   
// CUSTOM_COLOR and CUSTOM_MONOCHROME).
    optional
string vendor_id = 1;

   
// Type of color option used in UIs to differentiate color and non-color
   
// options (required). Note that there can be any number of options of type
   
// CUSTOM_COLOR and CUSTOM_MONOCHROME, but there should be at most one
   
// option of each of the other types.
    optional
Type type = 2;

   
// Non-localized user-friendly string that represents this option.
   
// New CDDs should use custom_display_name_localized instead. It is required
   
// that either custom_display_name or custom_display_name_localized is set
   
// for options of type CUSTOM_COLOR and CUSTOM_MONOCHROME. Options of each
   
// of the other types will have their display name localized by the server.
    optional
string custom_display_name = 3;

   
// Whether this option should be selected by default. Only one option
   
// should be set as default.
    optional
bool is_default = 4 [default = false];

   
// Translations of custom display name of the option.
   
// If not empty, must contain an entry with locale == EN.
    repeated
LocalizedString custom_display_name_localized = 5;
 
}

  repeated
Option option = 1;

 
// Whether the capability should always reset to the default option,
 
// regardless of the last user selected option. Only valid if a default
 
// option is configured.
  optional reset_to_default
= 2 [default = false];
}
// Capability that defines the duplexing options available on a device.
message
Duplex {
 
enum Type {
    NO_DUPLEX
= 0;
    LONG_EDGE
= 1;
    SHORT_EDGE
= 2;
 
}

  message
Option {
    optional
Type type = 1 [default = NO_DUPLEX];
    optional
bool is_default = 2 [default = false];
 
}

  repeated
Option option = 1;

 
// Whether the capability should always reset to the default option,
 
// regardless of the last user selected option. Only valid if a default
 
// option is configured.
  optional reset_to_default
= 2 [default = false];
}
// Capability that defines the page orientation options available on a device.
message
PageOrientation {
 
enum Type {
    PORTRAIT
= 0;
    LANDSCAPE
= 1;
    AUTO
= 2;
 
}

  message
Option {
   
// Type of page orientation (required).
    optional
Type type = 1;
    optional
bool is_default = 2 [default = false];
 
}

  repeated
Option option = 1;
}
// Capability that defines a default and maximum value for multiple copies on a
// device.
message
Copies {
  optional int32
default = 1;
  optional int32 max
= 2;
}
// Capability that defines the margins available on a device (including a custom
// one). Margins are measured in microns.
message
Margins {
 
// Enumerates the set of predefined types of margins. Devices should use these
 
// types to semantically describe the margins option. This type will be used
 
// for UI purposes only.
 
enum Type {
    BORDERLESS
= 0;
    STANDARD
= 1;
    CUSTOM
= 2;
 
}

  message
Option {
   
// Type of margin option (required).
    optional
Type type = 1;

   
// Top margin of the page (required).
    optional int32 top_microns
= 2;

   
// Right margin of the page (required).
    optional int32 right_microns
= 3;

   
// Bottom margin of the page (required).
    optional int32 bottom_microns
= 4;

   
// Left margin of the page (required).
    optional int32 left_microns
= 5;

    optional
bool is_default = 6 [default = false];
 
}

  repeated
Option option = 1;
}
// Capability that defines the 2D image quality levels available on a device.
message
Dpi {
  message
Option {
   
// Horizontal DPI (required).
    optional int32 horizontal_dpi
= 1;

   
// Vertical DPI (required).
    optional int32 vertical_dpi
= 2;

    optional
bool is_default = 3 [default = false];

   
// Non-localized custom display name to override the default display name
   
// which consists of "{$horizontal_dpi}x{$vertical_dpi} dpi".
   
// New CDDs should use custom_display_name_localized instead.
    optional
string custom_display_name = 4;

   
// Vendor-provided ID for the dpi option. Used to disambiguate dpi options
   
// that may have the same horizontal and vertical dpi but a different effect
   
// on the printer.
    optional
string vendor_id = 5;

   
// Translations of custom display name of the option, if empty,
   
// "{$horizontal_dpi}x{$vertical_dpi} dpi" will be used. If not empty, must
   
// contain an entry with locale == EN.
    repeated
LocalizedString custom_display_name_localized = 6;
 
}

  repeated
Option option = 1;
  optional int32 min_horizontal_dpi
= 2;
  optional int32 max_horizontal_dpi
= 3;
  optional int32 min_vertical_dpi
= 4;
  optional int32 max_vertical_dpi
= 5;

 
// Whether the capability should always reset to the default option,
 
// regardless of the last user selected option. Only valid if a default
 
// option is configured.
  optional reset_to_default
= 6 [default = false];
}
// Capability that defines the page fitting options available on a device.
message
FitToPage {
 
// Enumeration of page fitting algorithms. The "page" is defined as the media
 
// size minus any given margins.
 
enum Type {
    NO_FITTING
= 0;
    FIT_TO_PAGE
= 1;
    GROW_TO_PAGE
= 2;
    SHRINK_TO_PAGE
= 3;
    FILL_PAGE
= 4;
 
}

  message
Option {
   
// Type of fitting algorithm (required).
    optional
Type type = 1;
    optional
bool is_default = 2 [default = false];
 
}

  repeated
Option option = 1;
}
// Capability that defines a default page-range selection on a device.
message
PageRange {

 
// Interval of pages in the document to print.
  message
Interval {
   
// Beginning of the interval (inclusive) (required).
    optional int32 start
= 1;

   
// End of the interval (inclusive). If not set, then the interval will
   
// include all available pages after start.
    optional int32
end = 2;
 
}

  repeated
Interval default = 1;
}
// Capability that defines the media sizes available on a device.
message
MediaSize {
 
// Enumeration of media size names. This is used for UI purposes.
 
enum Name {
    CUSTOM
= 0;

   
// North American standard sheet media names.
    NA_INDEX_3X5
= 100;
    NA_PERSONAL
= 101;
    NA_MONARCH
= 102;
    NA_NUMBER_9
= 103;
    NA_INDEX_4X6
= 104;
    NA_NUMBER_10
= 105;
    NA_A2
= 106;
    NA_NUMBER_11
= 107;
    NA_NUMBER_12
= 108;
    NA_5X7
= 109;
    NA_INDEX_5X8
= 110;
    NA_NUMBER_14
= 111;
    NA_INVOICE
= 112;
    NA_INDEX_4X6_EXT
= 113;
    NA_6X9
= 114;
    NA_C5
= 115;
    NA_7X9
= 116;
    NA_EXECUTIVE
= 117;
    NA_GOVT_LETTER
= 118;
    NA_GOVT_LEGAL
= 119;
    NA_QUARTO
= 120;
    NA_LETTER
= 121;
    NA_FANFOLD_EUR
= 122;
    NA_LETTER_PLUS
= 123;
    NA_FOOLSCAP
= 124;
    NA_LEGAL
= 125;
    NA_SUPER_A
= 126;
    NA_9X11
= 127;
    NA_ARCH_A
= 128;
    NA_LETTER_EXTRA
= 129;
    NA_LEGAL_EXTRA
= 130;
    NA_10X11
= 131;
    NA_10X13
= 132;
    NA_10X14
= 133;
    NA_10X15
= 134;
    NA_11X12
= 135;
    NA_EDP
= 136;
    NA_FANFOLD_US
= 137;
    NA_11X15
= 138;
    NA_LEDGER
= 139;
    NA_EUR_EDP
= 140;
    NA_ARCH_B
= 141;
    NA_12X19
= 142;
    NA_B_PLUS
= 143;
    NA_SUPER_B
= 144;
    NA_C
= 145;
    NA_ARCH_C
= 146;
    NA_D
= 147;
    NA_ARCH_D
= 148;
    NA_ASME_F
= 149;
    NA_WIDE_FORMAT
= 150;
    NA_E
= 151;
    NA_ARCH_E
= 152;
    NA_F
= 153;

   
// Chinese standard sheet media size names.
    ROC_16K
= 200;
    ROC_8K
= 201;
    PRC_32K
= 202;
    PRC_1
= 203;
    PRC_2
= 204;
    PRC_4
= 205;
    PRC_5
= 206;
    PRC_8
= 207;
    PRC_6
= 208;
    PRC_3
= 209;
    PRC_16K
= 210;
    PRC_7
= 211;
    OM_JUURO_KU_KAI
= 212;
    OM_PA_KAI
= 213;
    OM_DAI_PA_KAI
= 214;
    PRC_10
= 215;

   
// ISO standard sheet media size names.
    ISO_A10
= 301;
    ISO_A9
= 302;
    ISO_A8
= 303;
    ISO_A7
= 304;
    ISO_A6
= 305;
    ISO_A5
= 306;
    ISO_A5_EXTRA
= 307;
    ISO_A4
= 308;
    ISO_A4_TAB
= 309;
    ISO_A4_EXTRA
= 310;
    ISO_A3
= 311;
    ISO_A4X3
= 312;
    ISO_A4X4
= 313;
    ISO_A4X5
= 314;
    ISO_A4X6
= 315;
    ISO_A4X7
= 316;
    ISO_A4X8
= 317;
    ISO_A4X9
= 318;
    ISO_A3_EXTRA
= 319;
    ISO_A2
= 320;
    ISO_A3X3
= 321;
    ISO_A3X4
= 322;
    ISO_A3X5
= 323;
    ISO_A3X6
= 324;
    ISO_A3X7
= 325;
    ISO_A1
= 326;
    ISO_A2X3
= 327;
    ISO_A2X4
= 328;
    ISO_A2X5
= 329;
    ISO_A0
= 330;
    ISO_A1X3
= 331;
    ISO_A1X4
= 332;
    ISO_2A0
= 333;
    ISO_A0X3
= 334;
    ISO_B10
= 335;
    ISO_B9
= 336;
    ISO_B8
= 337;
    ISO_B7
= 338;
    ISO_B6
= 339;
    ISO_B6C4
= 340;
    ISO_B5
= 341;
    ISO_B5_EXTRA
= 342;
    ISO_B4
= 343;
    ISO_B3
= 344;
    ISO_B2
= 345;
    ISO_B1
= 346;
    ISO_B0
= 347;
    ISO_C10
= 348;
    ISO_C9
= 349;
    ISO_C8
= 350;
    ISO_C7
= 351;
    ISO_C7C6
= 352;
    ISO_C6
= 353;
    ISO_C6C5
= 354;
    ISO_C5
= 355;
    ISO_C4
= 356;
    ISO_C3
= 357;
    ISO_C2
= 358;
    ISO_C1
= 359;
    ISO_C0
= 360;
    ISO_DL
= 361;
    ISO_RA2
= 362;
    ISO_SRA2
= 363;
    ISO_RA1
= 364;
    ISO_SRA1
= 365;
    ISO_RA0
= 366;
    ISO_SRA0
= 367;

   
// Japanese standard sheet media size names.
    JIS_B10
= 400;
    JIS_B9
= 401;
    JIS_B8
= 402;
    JIS_B7
= 403;
    JIS_B6
= 404;
    JIS_B5
= 405;
    JIS_B4
= 406;
    JIS_B3
= 407;
    JIS_B2
= 408;
    JIS_B1
= 409;
    JIS_B0
= 410;
    JIS_EXEC
= 411;
    JPN_CHOU4
= 412;
    JPN_HAGAKI
= 413;
    JPN_YOU4
= 414;
    JPN_CHOU2
= 415;
    JPN_CHOU3
= 416;
    JPN_OUFUKU
= 417;
    JPN_KAHU
= 418;
    JPN_KAKU2
= 419;

   
// Other metric standard sheet media size names.
    OM_SMALL_PHOTO
= 500;
    OM_ITALIAN
= 501;
    OM_POSTFIX
= 502;
    OM_LARGE_PHOTO
= 503;
    OM_FOLIO
= 504;
    OM_FOLIO_SP
= 505;
    OM_INVITE
= 506;
 
}

  message
Option {
    optional
Name name = 1 [default = CUSTOM];
   
// Both of the fields ("width_microns" and "height_microns") are required
   
// if "is_continuous_feed" is set to false. If "is_continuous_feed" is set
   
// to true only one of these fields is required.
    optional int32 width_microns
= 2;
    optional int32 height_microns
= 3;
    optional
bool is_continuous_feed = 4 [default = false];
    optional
bool is_default = 5 [default = false];

   
// Non-localized user-friendly string that represents this option.
   
// New CDDs should use custom_display_name_localized instead. It is required
   
// that either custom_display_name or custom_display_name_localized is set
   
// for options whose "name" field is CUSTOM.
    optional
string custom_display_name = 6;

   
// Vendor-provided ID for the media size option. Used to disambiguate media
   
// sizes that may have the same width and height but a different effect on
   
// the printer.
    optional
string vendor_id = 7;

   
// Translations of custom display name of the option.
   
// If not empty, must contain an entry with locale == EN.
    repeated
LocalizedString custom_display_name_localized = 8;

   
// Specifies the bounding box of the imageable area. All 4 fields have to
   
// be set for the bounding box to be valid. The imageable area is only applicable when
   
// the feed is not continuous.
    optional int32 imageable_area_top_microns
= 9;
    optional int32 imageable_area_right_microns
= 10;
    optional int32 imageable_area_bottom_microns
= 11;
    optional int32 imageable_area_left_microns
= 12;
 
}

  repeated
Option option = 1;
  optional int32 max_width_microns
= 2;
  optional int32 max_height_microns
= 3;
  optional int32 min_width_microns
= 4;
  optional int32 min_height_microns
= 5;

 
// Whether the capability should always reset to the default option,
 
// regardless of the last user selected option. Only valid if a default
 
// option is configured.
  optional reset_to_default
= 6 [default = false];
}
// Capability that defines the default collation setting on a device.
message
Collate {
  optional
bool default = 1 [default = true];
}
// Capability that defines the default reverse-printing-order setting on a
// device.
message
ReverseOrder {
  optional
bool default = 1 [default = false];
}
// A localized human-readable string translated to a specific locale.
// It is recommended to include translations of custom strings only for locales
// for which significant use of the device can be expected. If the translation
// of a custom string for a user's language and country (e.g. ZH_TW) is not
// present, GCP will display the translation for the base language (e.g. ZH).
// If neither translation is present, the translation for EN (which is required
// in every list of localized strings) will be displayed.
message
LocalizedString {
 
// Locale that the string is translated to (required).
  optional
Locale locale = 1;
 
// Translated content of the string (required).
  optional
string value = 2;

 
enum Locale {
    AF
= 0;
    AM
= 1;
    AR
= 2;
    AR_XB
= 3;
    BG
= 4;
    BN
= 5;
    CA
= 6;
    CS
= 7;
    CY
= 8;
    DA
= 9;
    DE
= 10;
    DE_AT
= 11;
    DE_CH
= 12;
    EL
= 13;
    EN
= 14;
    EN_GB
= 15;
    EN_IE
= 16;
    EN_IN
= 17;
    EN_SG
= 18;
    EN_XA
= 19;
    EN_XC
= 20;
    EN_ZA
= 21;
    ES
= 22;
    ES_419
= 23;
    ES_AR
= 24;
    ES_BO
= 25;
    ES_CL
= 26;
    ES_CO
= 27;
    ES_CR
= 28;
    ES_DO
= 29;
    ES_EC
= 30;
    ES_GT
= 31;
    ES_HN
= 32;
    ES_MX
= 33;
    ES_NI
= 34;
    ES_PA
= 35;
    ES_PE
= 36;
    ES_PR
= 37;
    ES_PY
= 38;
    ES_SV
= 39;
    ES_US
= 40;
    ES_UY
= 41;
    ES_VE
= 42;
    ET
= 43;
    EU
= 44;
    FA
= 45;
    FI
= 46;
    FR
= 47;
    FR_CA
= 48;
    FR_CH
= 49;
    GL
= 50;
    GU
= 51;
    HE
= 52;
    HI
= 53;
    HR
= 54;
    HU
= 55;
    HY
= 56;
    ID
= 57;
    IN
= 58;
    IT
= 59;
    JA
= 60;
    KA
= 61;
    KM
= 62;
    KN
= 63;
    KO
= 64;
    LN
= 65;
    LO
= 66;
    LT
= 67;
    LV
= 68;
    ML
= 69;
    MO
= 70;
    MR
= 71;
    MS
= 72;
    NB
= 73;
    NE
= 74;
    NL
= 75;
    NO
= 76;
    PL
= 77;
    PT
= 78;
    PT_BR
= 79;
    PT_PT
= 80;
    RM
= 81;
    RO
= 82;
    RU
= 83;
    SK
= 84;
    SL
= 85;
    SR
= 86;
    SR_LATN
= 87;
    SV
= 88;
    SW
= 89;
    TA
= 90;
    TE
= 91;
    TH
= 92;
    TL
= 93;
    TR
= 94;
    UK
= 95;
    UR
= 96;
    VI
= 97;
    ZH
= 98;
    ZH_CN
= 99;
    ZH_HK
= 100;
    ZH_TW
= 101;
    ZU
= 102;
 
}
}

CDD 範例

以下範例為 CDD 的外觀,例如「支援」顏色及支援多頁顏色,以及支援原生列印 PDF、JPEG 和純文字且支援多種頁面大小的「一般」印表機印表機:

{
 
"version": "1.0",
 
"printer": {
   
"supported_content_type": [
     
{"content_type": "application/pdf", "min_version": "1.5"},
     
{"content_type": "image/jpeg"},
     
{"content_type": "text/plain"}
   
],
   
"input_tray_unit": [
     
{
       
"vendor_id": "tray",
       
"type": "INPUT_TRAY"
     
}
   
],
   
"marker": [
     
{
       
"vendor_id": "black",
       
"type": "INK",
       
"color": {"type": "BLACK"}
     
},
     
{
       
"vendor_id": "color",
       
"type": "INK",
       
"color": {"type": "COLOR"}
     
}
   
],
   
"cover": [
     
{
       
"vendor_id": "front",
       
"type": "CUSTOM",
       
"custom_display_name": "front cover"
     
}
   
],
   
"vendor_capability": [],
   
"color": {
     
"option": [
       
{"type": "STANDARD_MONOCHROME"},
       
{"type": "STANDARD_COLOR", "is_default": true},
       
{
         
"vendor_id": "ultra-color",
         
"type": "CUSTOM_COLOR",
         
"custom_display_name": "Best Color"
       
}
     
]
   
},
   
"copies": {
     
"default": 1,
     
"max": 100
   
},
   
"media_size": {
     
"option": [
       
{
         
"name": "ISO_A4",
         
"width_microns": 210000,
         
"height_microns": 297000,
         
"is_default": true
       
},
       
{
         
"name": "NA_LEGAL",
         
"width_microns": 215900,
         
"height_microns": 355600
       
},
       
{
         
"name": "NA_LETTER",
         
"width_microns": 215900,
         
"height_microns": 279400
       
}
     
]
   
}
 
}
}

Cloud 工作票券

使用者做出選擇並設定裝置功能來準備列印工作、雲端工作票券或簡稱「支援單」後,藉此引導印表機或其他裝置處理工作。此票券會透過列印用戶端 (例如手機應用程式) 傳送至雲端服務 (例如 GCP),並與工作資料一起儲存。就像 CDD 一樣,CJT 會細分為裝置專用區段。例如,有關印表機和掃描器的票券項目分段各部。

注意:Cloud Job 票證由 Cloud 淘汰,但在 Chrome OS 的擴充功能中並不能與 chrome.printing API 搭配使用。

以下是 CJT 的 protobuf 定義:

// Description of how a cloud job (e.g. print job, scan job) should be handled
// by the cloud device. Also known as CJT.
message
CloudJobTicket {

 
// Version of the CJT in the form "X.Y" where changes to Y are backwards
 
// compatible, and changes to X are not (required).
  optional
string version = 1;

 
// Section of CJT pertaining to cloud printer ticket items.
  optional
PrintTicketSection print = 101;

 
// Section of CJT pertaining to cloud scanner ticket items.
  optional
ScanTicketSection scan = 102;
}

列印票券部分

CJT 的列印票券部分說明瞭如何透過雲端連線印表機處理列印工作。以下是列印票券專區的 protobuf 定義:

// Section of a CJT which describes how a print job should be handled by a
// cloud-connected printer.
message
PrintTicketSection {
  repeated
VendorTicketItem vendor_ticket_item = 1;
  optional
ColorTicketItem color = 2;
  optional
DuplexTicketItem duplex = 3;
  optional
PageOrientationTicketItem page_orientation = 4;
  optional
CopiesTicketItem copies = 5;
  optional
MarginsTicketItem margins = 6;
  optional
DpiTicketItem dpi = 7;
  optional
FitToPageTicketItem fit_to_page = 8;
  optional
PageRangeTicketItem page_range = 9;
  optional
MediaSizeTicketItem media_size = 10;
  optional
CollateTicketItem collate = 11;
  optional
ReverseOrderTicketItem reverse_order = 12;
}
// Ticket item indicating what value for a vendor-specific capability to use.
message
VendorTicketItem {
 
// ID of vendor-specific capability that this ticket item refers to
 
// (required).
  optional
string id = 1;

 
// Value of ticket item (required).
  optional
string value = 2;
}
// Ticket item indicating which color option to use.
message
ColorTicketItem {
 
// Vendor ID of the color (required if the type is CUSTOM_COLOR or
 
// CUSTOM_MONOCHROME).
  optional
string vendor_id = 1;

 
// Type of the color (required).
  optional
Color.Type type = 2;
}
// Ticket item indicating which duplexing option to use.
message
DuplexTicketItem {
 
// Type of duplexing (required).
  optional
Duplex.Type type = 1;
}
// Ticket item indicating which page orientation option to use.
message
PageOrientationTicketItem {
 
// Page orientation type (required).
  optional
PageOrientation.Type type = 1;
}
// Ticket item indicating how many copies to produce.
message
CopiesTicketItem {
 
// Number of copies to print (required).
  optional int32 copies
= 1;
}
// Ticket item indicating what margins to use (in microns).
message
MarginsTicketItem {
 
// Top margin of the page (required).
  optional int32 top_microns
= 1;

 
// Top margin of the page (required).
  optional int32 right_microns
= 2;

 
// Top margin of the page (required).
  optional int32 bottom_microns
= 3;

 
// Top margin of the page (required).
  optional int32 left_microns
= 4;
}
// Ticket item indicating what image resolution to use.
message
DpiTicketItem {
 
// Horizontal DPI to print at (required).
  optional int32 horizontal_dpi
= 1;

 
// Vertical DPI to print at (required).
  optional int32 vertical_dpi
= 2;

 
// Vendor-provided ID of the Dpi option. Needed to disambiguate Dpi options
 
// that have the same DPI values, but may have a different effect for the
 
// printer.
  optional
string vendor_id = 3;
}
// Ticket item indicating what page-fitting algorithm to use.
message
FitToPageTicketItem {
 
// Type of page fitting (required).
  optional
FitToPage.Type type = 1;
}
// Ticket item indicating what pages to use.
message
PageRangeTicketItem {
  repeated
PageRange.Interval interval = 1;
}
// Ticket item indicating what media size to use.
message
MediaSizeTicketItem {
 
// Width (in microns) of the media to print to.
  optional int32 width_microns
= 1;

 
// Height (in microns) of the media to print to.
  optional int32 height_microns
= 2;

 
// Whether the media size selection is continuously fed. If false, both width
 
// and height must be set. If true, only one need be set.
  optional
bool is_continuous_feed = 3 [default = false];

 
// Vendor-provided ID of the MediaSize option. Needed to disambiguate media
 
// sizes that may have the same width and height, but may have a different
 
// effect for the printer.
  optional
string vendor_id = 4;
}
// Ticket item indicating whether to collate pages.
message
CollateTicketItem {
 
// Whether to print collated (required).
  optional
bool collate = 1;
}
// Ticket item indicating whether to print in reverse.
message
ReverseOrderTicketItem {
 
// Whether to print in reverse (required).
  optional
bool reverse_order = 1;
}

CJT 範例

以下是針對上述「典型印表機」CDD 範例所產生的票券範例:

{
 
"version": "1.0",
 
"print": {
   
"vendor_ticket_item": [],
   
"color": {"type": "STANDARD_MONOCHROME"},
   
"copies": {"copies": 3}
 
}
}

我們很快就會新增網路工具,將列印為 CJT 格式的列印票券轉換為原生票證格式 (PPD 的 JSON 和 psf:PrintPass 文件 (XP 專屬)。

雲端裝置狀態

裝置的完整狀態會以 CloudDeviceState 訊息表示。本郵件中會介紹不同類型的裝置。多功能裝置可以使用一或多個定義區段。雲端列印功能會擴大支援的裝置類型,日後還會新增更多版面。

// Represents the entire cloud-connected device state.
message
CloudDeviceState {

 
// Supported device states.
 
enum StateType {

   
// Device is ready to accept jobs. Self-testing, low power and all other
   
// states in which the device can start processing newly submitted jobs
   
// without user intervention should be mapped into this state.
    IDLE
= 0;

   
// Processing jobs (e.g. printing).
    PROCESSING
= 1;

   
// Device cannot process jobs. User should fix the problem to resume the
   
// processing (e.g. printer is out of paper).
    STOPPED
= 2;
 
}

 
// Device cloud connectivity state.
 
enum CloudConnectionStateType {
    UNKNOWN
= 0;
    NOT_CONFIGURED
= 1;
    ONLINE
= 2;
    OFFLINE
= 3;
 
}

 
// Version of the CDS in the form "X.Y" where changes to Y are backwards
 
// compatible, and changes to X are not (required).
  optional
string version = 1;

 
// Whether device is connected to the server. It is not intended to be
 
// reported by the device, it's set by the server.
  optional
CloudConnectionStateType cloud_connection_state = 2;

 
// Defined for devices with printing capabilities.
  optional
PrinterStateSection printer = 3;

 
// Defined for devices with scanning capabilities.
  optional
ScannerStateSection scanner = 4;
}

印表機狀態部分

如果裝置有列印功能,請使用這個部分說明列印單位的狀態。

// Represents the printer state.
message
PrinterStateSection {

 
// Current printer state (required).
  optional
CloudDeviceState.StateType state = 1;

 
// State of the input trays.
  optional
InputTrayState input_tray_state = 2;

 
// State of the output bins.
  optional
OutputBinState output_bin_state = 3;

 
// State of the markers.
  optional
MarkerState marker_state = 4;

 
// State of the printer doors/covers/etc.
  optional
CoverState cover_state = 5;

 
// State of the printer media paths.
  optional
MediaPathState media_path_state = 6;

 
// Vendor-specific printer state.
  optional
VendorState vendor_state = 101;
}
// State of the device's input trays.
message
InputTrayState {

  message
Item {

   
enum StateType {
     
// Tray is functional.
      OK
= 0;
     
// Tray is out of media. Treated as error.
      EMPTY
= 1;
     
// Tray is open. Treated as error.
      OPEN
= 2;
     
// Tray is installed, but turned off or disconnected. Treated as error.
      OFF
= 3;
     
// Tray is present, but not functioning properly. Treated as error.
      FAILURE
= 4;
   
}

   
// ID of the tray (refers to CDD model) (required).
    optional
string vendor_id = 1;

   
// Current tray state (required).
    optional
StateType state = 2;
   
// Loaded media level, percent. Ranges from 0 (empty) to 100 (fully loaded).
    optional int32 level_percent
= 3;
   
// Vendor-specific message, ignored when state == OK.
    optional
string vendor_message = 101;
 
}

  repeated
Item item = 1;
}
// State of the device's output bins.
message
OutputBinState {

  message
Item {

   
enum StateType {
     
// Bin is functional.
      OK
= 0;
     
// Bin is full and cannot receive any more output. Treated as error.
      FULL
= 1;
     
// Bin is open. Treated as error.
      OPEN
= 2;
     
// Bin is installed, but turned off or disconnected. Treated as error.
      OFF
= 3;
     
// Bin is present, but not functioning properly. Treated as error.
      FAILURE
= 4;
   
}

   
// ID of the bin (refers to CDD model) (required).
    optional
string vendor_id = 1;

   
// Current bin state (required).
    optional
StateType state = 2;
   
// Used space, percent. Ranges from 0 (empty) to 100 (full).
    optional int32 level_percent
= 3;
   
// Vendor-specific message, ignored when state == OK.
    optional
string vendor_message = 101;
 
}

  repeated
Item item = 1;
}
// State of the device markers (toner/ink/staples/etc).
message
MarkerState {

  message
Item {

   
enum StateType {
     
// Marker is functional.
      OK
= 0;
     
// Marker resource is exhausted. Treated as error.
      EXHAUSTED
= 1;
     
// Marker is removed. Treated as error.
      REMOVED
= 2;
     
// Marker is present, but not functioning properly. Treated as error.
      FAILURE
= 3;
   
}

   
// ID of the marker (refers to CDD model) (required).
    optional
string vendor_id = 1;

   
// Current marker state (required).
    optional
StateType state = 2;
   
// Marker supply amount, percent. Ranges from 0 to 100.
    optional int32 level_percent
= 3;
   
// Estimated number of pages for which the marker supply amount will last.
    optional int32 level_pages
= 4;
   
// Vendor-specific message, ignored when state == OK.
    optional
string vendor_message = 101;
 
}

  repeated
Item item = 1;
}
// State of the device covers (door/cover/etc).
message
CoverState {

  message
Item {

   
enum StateType {
     
// Default cover state (closed, does not need any attention).
      OK
= 0;
     
// Cover is open. Treated as error.
      OPEN
= 1;
     
// Cover is not functioning properly. Treated as error.
      FAILURE
= 2;
   
}

   
// ID of the cover (refers to CDD model) (required).
    optional
string vendor_id = 1;

   
// Current cover state (required).
    optional
StateType state = 2;
   
// Vendor-specific message, ignored when state == OK.
    optional
string vendor_message = 101;
 
}

  repeated
Item item = 1;
}
// State of the device media paths.
message
MediaPathState {

  message
Item {

   
enum StateType {
     
// Path is functioning.
      OK
= 0;
     
// Media is jammed. Treated as error.
      MEDIA_JAM
= 1;
     
// Path is present, but not functioning properly. Treated as error.
      FAILURE
= 2;
   
}

   
// ID of the media path (refers to CDD model) (required).
    optional
string vendor_id = 1;

   
// Current state (required).
    optional
StateType state = 2;
   
// Vendor-specific message, ignored when state == OK.
    optional
string vendor_message = 101;
 
}

  repeated
Item item = 1;
}

注意:如上方 protobuf 定義中的每個 vendor_id 欄位註解所示,CDS 訊息中實體單元的每個狀態項目的供應商 ID 必須與 CDD 中對應實體單元的供應商 ID 相符。

// Vendor-specific state.
message
VendorState {

  message
Item {

   
enum StateType {
      ERROR
= 0;
      WARNING
= 1;
      INFO
= 2;
   
}

   
// Severity of the state (required).
    optional
StateType state = 1;
   
// Non-localized user-readable state description.
   
// New vendor state items should use description_localized instead. It is
   
// required that either description or description_localized is set.
    optional
string description = 2;
   
// Translations of state description.
   
// If not empty, must contain an entry with locale == EN.
    repeated
LocalizedString description_localized = 3;
 
}

  repeated
Item item = 1;
}

注意:建議您盡量從供應商訊息的結尾省略句號,以便與語意狀態資料產生的本地化訊息 (例如「黑色墨水空白」) 保持一致。

CDS 範例

以下範例針對 CDD 範例中「典型印表機」的 CDS 範例,其中的空白墨水匣相關說明。請注意:

  • 工作尚待處理,因此「已停止」裝置狀態。
  • 伺服器會假設在 DSDS 中未提及狀態的裝置 (這裡的輸入匣和前置封面) 處於「正常」狀態,且不會回報其他資訊 (例如「level_percent」)。
  • 「cloud_connection_state」欄位已省略;由 /printer 和 /search 介面傳回的 CDS 設定伺服器 (如果「semanticState」是做為額外欄位要求)。
{
 
"version": "1.0",
 
"printer": {
   
"state": "STOPPED",
   
"marker_state": {
     
"item": [
       
{
         
"vendor_id": "black",
         
"state": "EXHAUSTED",
         
"level_percent": 0
       
},
       
{
         
"vendor_id": "color",
         
"state": "OK",
         
"level_percent": 88,
         
"level_pages": 100
       
}
     
]
   
}
 
}
}

CDS 差異分析

系統會按照上文所述,提供 /update 介面的 semantic_state_diff 參數做為一般 CloudDeviceState 訊息,但會被解讀為儲存在印表機上的 CDS,如下所示:「diff」。

  • 原始 CDS 中的不變差異不會省略。
  • 移除了 PrinterStateSection 和 ScannerStateSection 中空白值 (例如 "marker_state": {}) 的巢狀訊息欄位。
  • 原始欄位或列舉類型欄位,以及提供的非空白值欄位會新增或變更。
  • 使用「semantic_state_diff」參數時,系統一律會省略「version」欄位。 如果省略這種方式,但印表機先前並未設定 CDS,則 Cloud Print 伺服器會假設提供的差異比較是使用最新版本,並據此設定版本欄位。

雲端裝置 UI 狀態

CDS 格式不會立即向使用者提供有意義的裝置狀態,因此透過要求「uiState」做為額外欄位,傳回「UI 狀態」。格式的 protobuf 定義如下所示。

// Represents a cloud device's state in a form convenient for display in a UI.
message
CloudDeviceUiState {

 
enum Summary {
    IDLE
= 0;
    PROCESSING
= 1;
    STOPPED
= 2;
    OFFLINE
= 3;
 
}

 
enum Severity {
    NONE
= 0;
    LOW
= 1;
    MEDIUM
= 2;
    HIGH
= 3;
 
}

 
// Device state summary (required).
  optional
Summary summary = 1 [default = IDLE];

 
// Overall severity (error level) of the device state (required).
 
// Must only be HIGH in the case that the device is STOPPED.
  optional
Severity severity = 2 [default = NONE];

 
// In the descriptions of the following three fields, "CDS is nontrivial"
 
// means that CDS is present and there is at least one state item in its
 
// PrinterStateSection or ScannerStateSection which is "interesting" enough
 
// to produce a UI state item for.

 
// Number of issues detected.
 
// Present if and only if CDS is nontrivial.
  optional int32 num_issues
= 3 [default = 0];

 
// Heuristically determined most relevant message from a state item.
 
// Present if and only if CDS is nontrivial, the device is not OFFLINE, and
 
// the maximum severity of a state item is at least MEDIUM if the device is
 
// IDLE or PROCESSING, or at least LOW if the device is STOPPED.
  optional
string caption = 4;

 
// State items specific to the printing capability of the device.
 
// Present if and only if CDS is nontrivial and this CloudDeviceUiState object
 
// is being returned in a single printer lookup or in a recent printer search.
  optional
PrinterUiStateSection printer = 5;
}
// Contains one UI state item for each CDS state item using the information
// obtained from cross-referencing the CDD.
message
PrinterUiStateSection {

 
// A UI state item with a severity level and either:
 
// (1) a localized message and UI-displayable data from the properties and
 
//     state of a particular unit of the device, or
 
// (2) a possibly non-localized vendor state message.
  message
Item {

   
// The severity of this individual state item (required).
    optional
CloudDeviceUiState.Severity severity = 1;

   
// A message produced from a state item, e.g. Black ink level is 60%. This
   
// message may not be localized if it is from a VendorState.Item (required).
    optional
string message = 2;

   
// A non-localized vendor-specific message that provides additional
   
// information about the state of the device unit described by this item.
    optional
string vendor_message = 3;

   
// The fullness level of an input tray, output bin or marker.
    optional int32 level_percent
= 4;

   
// The color of a marker.
    optional cloudprint
.capabilities.Marker.Color.Type color = 5;
 
}

  repeated
Item vendor_item = 1;
  repeated
Item input_tray_item = 2;
  repeated
Item output_bin_item = 3;
  repeated
Item marker_item = 4;
  repeated
Item cover_item = 5;
  repeated
Item media_path_item = 6;
}

CloudDeviceUiState 範例

以下是由上方 /search 介面 (適用於英文語言代碼) 範例 CDS 所產生的 CloudDeviceUiState 訊息。這是輕量版 CloudDeviceUiState。

{
 
"summary": "STOPPED",
 
"severity": "HIGH",
 
"num_issues": 1,
 
"caption": "Ink is empty"
}

以下的 CloudDeviceUiState 訊息是由 /printer 介面使用相同的 CDS 所產生 (適用於英文語言代碼)。這個 CloudDeviceUiState 完整表單會使用 CMP 描述的實體 ID 來交叉參照 CDS 中的狀態項目,並使用供應商 ID 進行說明。

{
 
"summary": "STOPPED",
 
"severity": "HIGH",
 
"num_issues": 1,
 
"caption": "Black ink is empty",
 
"printer": {
   
"marker_item": [
     
{
       
"severity": "MEDIUM",
       
"message": "Black ink is empty",
       
"color": "BLACK"
     
},
     
{
       
"severity": "NONE",
       
"message": "Color ink level is 88% – 100 pages remaining",
       
"level_percent": 88,
       
"color": "COLOR"
     
}
   
]
 
}
}

請按這裡,查看印表機自 2014 年 4 月 29 日起的呈現方式。

Cloud 工作狀態

雲端工作上工作狀態的裝置類型屬於部分工作。類型列舉定義了一般工作生命週期定義的基本狀態組合。這些狀態類型不適用於「印表機」工作,但可能適用於任何裝置類型的工作。

// Contains the device-agnostic state of a job on a cloud device.
message
JobState {

 
// Supported job state types.
 
enum Type {

   
// Job is being created and is not ready for processing yet.
    DRAFT
= 0;

   
// Submitted and ready, but should not be processed yet.
    HELD
= 1;

   
// Ready for processing.
    QUEUED
= 2;

   
// Currently being processed.
    IN_PROGRESS
= 3;

   
// Was in progress, but stopped due to error or user intervention.
    STOPPED
= 4;

   
// Processed successfully.
    DONE
= 5;

   
// Aborted due to error or by user action (cancelled).
    ABORTED
= 6;
 
}

  message
UserActionCause {

   
// Next number = 2.
   
enum ActionCode {
     
// User has cancelled the job.
      CANCELLED
= 0;
     
// User has paused the job.
      PAUSED
= 1;
     
// User has performed some other action.
      OTHER
= 100;
   
}

   
// Code for the user action which caused the current job state (required).
    optional
ActionCode action_code = 1;
 
}

  message
DeviceStateCause {

   
// Next number = 5.
   
enum ErrorCode {
     
// Error due to input tray problem.
      INPUT_TRAY
= 0;
     
// Error due to marker problem.
      MARKER
= 1;
     
// Error due to a problem in the media path.
      MEDIA_PATH
= 2;
     
// Error due to media size problem.
      MEDIA_SIZE
= 3;
     
// Error due to media type problem.
      MEDIA_TYPE
= 4;
     
// Error due to some other device state.
      OTHER
= 100;
   
}

   
// Error code for the device state which caused the current job state
   
// (required).
    optional
ErrorCode error_code = 1;
 
}

  message
DeviceActionCause {

   
// Next number = 4.
   
enum ErrorCode {
     
// Error while downloading job.
      DOWNLOAD_FAILURE
= 0;
     
// Error due to invalid job ticket.
      INVALID_TICKET
= 1;
     
// A generic printing error occurred.
      PRINT_FAILURE
= 2;
     
// The document is too large for the printer.
      DOCUMENT_TOO_LARGE
= 3;
     
// Error due to some other device action.
      OTHER
= 100;
   
}

   
// Error code for the device action which caused the current job state
   
// (required).
    optional
ErrorCode error_code = 1;
 
}

  message
ServiceActionCause {

   
// Next number = 16.
   
enum ErrorCode {
      COMMUNICATION_WITH_DEVICE_ERROR
= 0;
      CONVERSION_ERROR
= 1;
      CONVERSION_FILE_TOO_BIG
= 2;
      CONVERSION_UNSUPPORTED_CONTENT_TYPE
= 3;
      DELIVERY_FAILURE
= 11;
      EXPIRATION
= 14;
      FETCH_DOCUMENT_FORBIDDEN
= 4;
      FETCH_DOCUMENT_NOT_FOUND
= 5;
      GOOGLE_DRIVE_QUOTA
= 15;
      INCONSISTENT_JOB
= 6;
      INCONSISTENT_PRINTER
= 13;
      PRINTER_DELETED
= 12;
      REMOTE_JOB_NO_LONGER_EXISTS
= 7;
      REMOTE_JOB_ERROR
= 8;
      REMOTE_JOB_TIMEOUT
= 9;
      REMOTE_JOB_ABORTED
= 10;
      OTHER
= 100;
   
}

   
// Error code for the service action which caused the current job state
   
// (required).
    optional
ErrorCode error_code = 1;
 
}

 
// Current job state type (required).
  optional
Type type = 1;

 
// Exactly one of the following four fields must be set if and only if the
 
// state type is ABORTED or STOPPED.
 
// For example:
 
// - {"type": "ABORTED", "user_action_cause": {"action_code": "CANCELLED"}}
 
//   interpreted as the job was cancelled by the user.
 
// - {"type": "STOPPED", "device_state_cause": {"error_code": "MEDIA_PATH"}}
 
//   interpreted as the job was stopped due to a temporary problem with the
 
//   media path, such as paper jam (the specific cause will be discerned from
 
//   the device state by the server).
 
// - {"type": "ABORTED",
 
//    "device_action_cause": {"error_code": "DOWNLOAD_FAILURE"}}
 
//   interpreted as the job was aborted due to a download failure.

 
// If present, job state was changed due to user action.
  optional
UserActionCause user_action_cause = 2;

 
// If present, job state was changed due to device state change.
  optional
DeviceStateCause device_state_cause = 3;

 
// If present, job state was changed due to device action.
  optional
DeviceActionCause device_action_cause = 4;

 
// If present, job state was changed due to service (Cloud Print) action.
 
// Should only be set by the Cloud Print server.
  optional
ServiceActionCause service_action_cause = 5;
}

「雲端列印」預期及支援的工作狀態類型轉換:

舊版工作狀態

上述定義的工作狀態類型會取代 /submit、/jobs 和 /control 介面中使用的舊版工作狀態列舉,但系統依然支援回溯相容性,可能的舊版工作狀態包括:
  • QUEUED:已新增工作但尚未下載
  • IN_PROGRESS:已下載工作並新增至用戶端原生印表機佇列
  • 完成:工作列印成功
  • 錯誤:發生錯誤,因此無法列印工作
  • SUBMITTED:工作已提交至第三方服務 (僅適用於 FedEx 印表機)
  • HELD:工作已成功提交,但必須先經過某些使用者處理才能進行 QUEUED

您可以前往這裡查看轉換狀態在各種情況下的轉換條件。

頂層工作狀態

單一裝置可以具備多項功能 (例如列印和掃描),但這類裝置上的工作僅由一個函式執行。因此,每個支援的裝置函式都有頂層工作狀態格式。

列印工作狀態

列印工作狀態 (PJS) 會儲存在伺服器上,凡是具有工作存取權的用戶端都能擷取。

// Represents the current state of a print job on a cloud device.
message
PrintJobState {

 
// Version of the PJS in the form "X.Y" where changes to Y are backwards
 
// compatible, and changes to X are not (required).
  optional
string version = 1;

 
// Current state of the job (required).
  optional
JobState state = 2;

 
// Number of successfully printed pages. Printer should use this value to
 
// restart interrupted/suspended print jobs from the next page.
 
// Printer can only increase the number of pages printed.
  optional int32 pages_printed
= 3;

 
// Number of attempts to deliver the print job.
  optional int32 delivery_attempts
= 4;
}

列印工作狀態差異

只要是未傳送最終狀態 (DONE 或 ABORTED) 的工作,雲端裝置都可以傳送 PrintJobStateDiff 訊息,要求工作狀態變更。

// Diff that can be applied to a PrintJobState message. Any omitted field will
// not be changed.
message
PrintJobStateDiff {

 
// New job state.
  optional
JobState state = 1;

 
// New number of pages printed.
  optional int32 pages_printed
= 2;
}

雲端列印支援更多裝置功能,因此會新增更多頂層工作狀態格式。

PrintJobStateDiff 範例

為最近輸入 IN_PROGRESS 狀態的工作傳送 PrintJobStateff 訊息:

{
 
"state": {"type": "IN_PROGRESS"}
}

輸出多頁文件後,顯示同一工作的 PrintJobStateDiff 訊息:

{
 
"pages_printed": 1
}

使用者列印第三次網頁時,取消的列印工作列印工作狀態訊息:

{
 
"state": {
   
"type": "ABORTED",
   
"user_action_cause": {"action_code": "CANCELLED"}
 
},
 
"pages_printed": 3
}

列印工作 UI 狀態

PrintJobState 格式不會立即向使用者顯示有意義的工作狀態,因此所有工作都會傳回「UI 狀態」格式。格式的 protobuf 定義如下所示。

// Represents a print job's state in a form convenient for display in a UI.
message
PrintJobUiState {

 
enum Summary {
    DRAFT
= 0;
    QUEUED
= 1;
    IN_PROGRESS
= 2;
    PAUSED
= 3;
    DONE
= 4;
    CANCELLED
= 5;
    ERROR
= 6;
    EXPIRED
= 7;
 
}

 
// Job state summary (required).
  optional
Summary summary = 1;

 
// Localized string describing the progress of the job, e.g. the number of
 
// attempts to deliver it or the number of pages which have been printed.
  optional
string progress = 2;

 
// Localized string describing the cause of an abnormal state of the job.
  optional
string cause = 3;
}

PrintJobUiState 範例

以下是在列印 4 頁文件的第二頁時,顯示工作的 PrintJobUiState 訊息。

{
 
"summary": "IN_PROGRESS",
 
"progress": "Pages printed: 1 of 4"
}

下方有關相同工作的 PrintJobUiState 訊息,是在第三頁列印後、第 4 頁的列印工作取消之前,只要透過印表機的使用者介面取消工作。

{
 
"summary": "CANCELLED",
 
"progress": "Pages printed: 3 of 4",
 
"cause": "Cancelled by user"
}

地區設定

使用者可編輯的設定不會隨著裝置正常使用而變更,或使用下列印表機透過雲端列印伺服器傳送:

// Contains current and pending local settings.
message
LocalSettings {

 
// Contains settings that do not change with normal use of the device.
  message
Settings {

   
// Whether Privet local discovery is enabled (required).
    optional
bool local_discovery = 1;

   
// Whether Privet access token API should be exposed on the local network.
    optional
bool access_token_enabled = 2;

   
// Whether Privet local printing API should be exposed on the local network.
    optional
bool printer/local_printing_enabled = 3;

   
// Whether Privet local printing may send jobs to the server for conversion.
    optional
bool printer/conversion_printing_enabled = 4;

   
// Number of seconds between XMPP channel pings.
    optional int32 xmpp_timeout_value
= 5;
 
}

 
// Current local settings.
 
// Required (for GCP 2.0) to be provided by the device via the /register
 
// interface. Should be provided or confirmed by the device via the /update
 
// interface as necessary. Prohibited to be provided by clients. Always
 
// present in the local_settings field returned by the /printer interface.
  optional
Settings current = 1;

 
// Pending local settings.
 
// Prohibited to be provided by the device. Provided by clients via the
 
// /update interface. Present in the local_settings field returned by the
 
// /printer interface if a client has provided pending local settings but the
 
// device has not yet confirmed them as current.
  optional
Settings pending = 2;
}

本機設定範例

裝置提供給 /register 或 /update 介面的 local_settings 參數值範例:

{
 
"current": {
   
"local_discovery": true,
   
"access_token_enabled": true,
   
"printer/local_printing_enabled": true,
   
"printer/conversion_printing_enabled": true,
   
"xmpp_timeout_value": 300
 
}
}

用戶端提供給 /update 介面的 local_settings 參數值範例:

{
 
"pending": {
   
"local_discovery": true,
   
"access_token_enabled": true,
   
"printer/local_printing_enabled": false,
   
"printer/conversion_printing_enabled": false,
   
"xmpp_timeout_value": 500
 
}
}

裝置在確認待處理的設定之前,由 /printer 介面傳回的 local_settings 欄位範例:

"local_settings": {
 
"current": {
   
"local_discovery": true,
   
"access_token_enabled": true,
   
"printer/local_printing_enabled": true,
   
"printer/conversion_printing_enabled": true,
   
"xmpp_timeout_value": 300
 
},
 
"pending": {
   
"local_discovery": true,
   
"access_token_enabled": true,
   
"printer/local_printing_enabled": false,
   
"printer/conversion_printing_enabled": false,
   
"xmpp_timeout_value": 500
 
}
}