我有一个要求生成OMR标记(可以是10个小行,如‘-’)在PDF文件中,这个PDF文件模板将使用XSLT准备。对我来说,这里的挑战是,根据页码,需要隐藏一些OMR行。例如:如果pdf文件页码是1,那么我必须隐藏第三个OMR行,如果它是第二页,那么必须隐藏一些其他OMR行,等等…
我认为如果我们可以将'fo:pagenumber‘的值存储在一个变量中,那么我们就可以编写if条件来避免不必要的行。但是我无法在变量中存储'fo:pagenumber‘。
有人能建议我们如何使用XSLT FO来实现它吗?
发布于 2015-12-03 02:47:05
OMR标记通常由两个或三个不同类别的标记组成。首先,考虑到大多数OMR标记需要应用于一个大的文档包,比如一个长达数千页的长PDF,其中包含可能在页面大小上不同的100个语句。
有基于包中单个文档中页面位置的标记(如第一页、最后一页),有可能基于数据中某些内容的特殊标记(如帐户余额低于0美元,因此它打印在红色页面上),最后还有序列标记,它基本上是整个包的计数0到7,0到7,0到7,与它正在处理的语句无关。高速打印机/分拣机使用这些最后的标记来验证事情是否按其应有的方式发生(确保所有页面都在处理)。
在XSL中处理这种情况的最简单方法是根据各自的规则在文档中绘制前两种类型的标记。这些都很容易在页面模板母版中完成,因为它们要么是位置的(first/last),要么是基于一些XPATH数据表达式,比如"accountval < 0“。
我们在我们的解决方案中所做的是在所有其他位置放置一个标记-即每隔0到7个标记放置一个标记。大多数FO处理器都支持将fo文件处理为中间表示,该中间表示可以从引擎序列化为XML树结构中获得。此结构包括<page>元素。它是在这里,然后你可以做的工作,以提醒的标记。
然后,只需遍历整个包并“移除”每个页面的逻辑中的结构,就可以使序列标记工作。
这是正确处理文档包的唯一方法,因为序列标记自然会跨越包中的单个语句--您可能有一个2页的语句,然后是一个10页的语句,然后是一个3页的语句,并且您不能猜测每个语句的开始/结束位置。
如果你想研究一个实现,你可以下载RenderX的VDPMill应用程序。安装后,您将在安装中找到一个名为" samples“的目录,其中包含一个名为"OMR”的示例。它包含一些示例XML和XSL,显示了Pitney Bowes 8系列和ABC Office 630系列机器的OMR实现。
发布于 2015-12-02 17:37:30
对于像填充信封这样页面数量有限的用途,您可以在页面的fo:region-start (http://www.w3.org/TR/xsl11/#fo_region-start)和/或fo:region-end区域中生成它们。
这将需要为页面1、页面2等中的每一个生成两个单独的fo:simple-page-master,每个fo:region-start具有唯一的region-name值。您将需要两个页面,因为任何页面都可能是序列中的最后一个页面,并且需要一个不同的OMR代码来指示这一点。
您还需要一个具有与最大页数相同数量的fo:repeatable-page-master-alternatives的fo:page-sequence-master (http://www.w3.org/TR/xsl11/#fo_page-sequence-master)。每个fo:repeatable-page-master-alternatives都有maximum-repeats="1"并包含两个fo:conditional-page-master-reference --一个用于当页面是最后一个页面时,另一个用于当页面不是最后一个页面时,例如:
<fo:repeatable-page-master-alternatives maximum-repeats="1">
<fo:conditional-page-master-reference master-reference="page1-last"
page-position="last" />
<fo:conditional-page-master-reference master-reference="page1" />
</fo:repeatable-page-master-alternatives>
...您的fo:page-sequence/@master-reference将引用fo:page-sequence-master的master-name。
最后,您必须为fo:simple-page-master中的每个唯一命名的fo:region-start生成具有正确的OMR标记的fo:static-content。
不幸的是,如果您使用OMR标记来指示页的顺序,并且您需要以与页码相反的顺序来指示OMR序列,或者您必须跨fo:page-sequence继续执行OMR序列,那么这种方法将不会对您有所帮助。
https://stackoverflow.com/questions/34035737
复制相似问题