模块  java.desktop
软件包  javax.print

Interface MultiDoc


  • public interface MultiDoc
    接口MultiDoc指定为打印作业提供多个打印数据的对象的接口。 “Doc”是一个简短易懂的术语,意思是“一段打印数据”,而“multidoc”是一组多个文档。 客户端将实现接口MultiDoc的对象传递给Print Job,并且Print Job调用该对象上的方法以获取打印数据。

    接口MultiDoc提供类似于文档的“链接列表”的抽象。 multidoc对象类似于链表中的节点,包含列表中的当前doc和指向列表中下一个节点(multidoc)的指针。 打印作业可以调用multidoc的getDoc()方法来获取当前文档。 当它准备好继续下一个doc时,Print Job可以调用multidoc的next()方法来获取包含下一个doc的下一个multidoc。 因此,用于访问multidoc的Print Job代码可能如下所示:

      void processMultiDoc(MultiDoc theMultiDoc) {
    
              MultiDoc current = theMultiDoc;
    
              while (current != null) {
                  processDoc (current.getDoc());
                  current = current.next();
              }
          } 
    当然,界面MultiDoc可以以履行合同的任何方式实施; 它不必在实现中使用链表。

    要获取多数据打印作业的所有打印数据,打印服务代理可以使用以下两种模式之一:

    1. 交错模式:从当前的multidoc获取doc。 从当前doc获取打印数据表示对象。 从打印数据表示对象获取所有打印数据。 从当前的multidoc获取下一个multidoc,并重复直到没有更多。 (上面的代码示例使用交错模式。)
    2. 一次性模式:从当前的multidoc获取文档,并将文档保存在列表中。 从当前的multidoc获取下一个multidoc,并重复直到没有更多。 然后遍历已保存文档的列表。 从当前doc获取打印数据表示对象。 从打印数据表示对象获取所有打印数据。 转到列表中的下一个文档,然后重复,直到没有更多文档。
    现在,考虑一个即时生成打印数据的打印客户端,并且没有资源一次存储多个打印数据。 如果打印服务代理使用一次性模式来获取打印数据,则会对这样的客户端造成问题; 客户端必须保留所有文档的打印数据,直到打印服务代理回来并询问它们,客户端无法做到这一点。 要使用此类客户端,打印服务代理必须使用交错模式。

    要解决此问题,并简化为打印作业提供多个文档的客户端的设计,需要使用交错模式访问支持多数据打印作业的每个打印服务代理来访问MultiDoc对象。 也就是说,给定MultiDoc对象,打印服务代理将调用getDoc()一次或多次,直到它成功获取当前Doc对象。 然后,打印服务代理将获得当前文档的打印数据,直到获得所有打印数据或发生不可恢复的错误为止。 如果能够继续,则打印服务代理将调用next()一次或多次,直到它成功获得下一个MultiDoc对象或不再有指示。 接口MultiDoc的实现可以假设打印服务代理将遵循该交织模式; 对于任何其他使用模式, MultiDoc实现的行为未指定。

    对可能同时访问同一个multidoc的客户端线程数没有限制。 因此,MultiDoc接口的所有实现必须设计为多线程安全。 实际上,客户端线程可以将文档添加到(概念)列表的末尾,而打印作业线程同时从列表的开头获取文档; 如果multidoc对象正确地同步线程,则两个线程不会相互干扰。

    • 方法详细信息

      • getDoc

        Doc getDoc()
            throws IOException
        获取当前的doc对象。
        结果
        当前的doc对象
        异常
        IOException - 如果在读取文档时发生错误
      • next

        MultiDoc next()
               throws IOException
        转到包含doc对象序列中下一个doc对象的multidoc对象。
        结果
        包含下一个doc对象的multidoc对象,如果没有其他doc对象, null
        异常
        IOException - 如果找到下一个文档时发生错误