Module  java.desktop
软件包  javax.print

Interface MultiDoc



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

    界面MultiDoc提供了类似于docs的“链接列表”的抽象。 多点对象就像链表中的一个节点,包含列表中的当前文档和列表中下一个节点(多点)的指针。 打印作业可以调用多点的getDoc()方法来获取当前的文档。 当准备继续下一个文档时,打印作业可以调用多点的next()方法来获取下一个多点,其中包含下一个文档。 所以打印访问多窗口的作业代码可能如下所示:

      void processMultiDoc(MultiDoc theMultiDoc) {
    
              MultiDoc current = theMultiDoc;
    
              while (current != null) {
                  processDoc (current.getDoc());
                  current = current.next();
              }
          } 

    当然,MultiDoc接口可以以任何方式实现合同; 它不必在实现中使用链表。

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

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

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

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

    • 方法详细信息

      • getDoc

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

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