如何使用XSLT在PDF上生成OMR标记?OMR标记将根据页码进行更改

如何使用XSLT在PDF上生成OMR标记?OMR标记将根据页码进行更改,xslt,xsl-fo,Xslt,Xsl Fo,我需要在PDF文件上生成OMR标记(可以是10个小的行,如“-----”),其中该PDF文件模板将使用XSLT准备。我面临的挑战是,根据页码,一些OMR行需要隐藏。 例如:如果pdf文件页码是1,那么我必须隐藏第三行OMR,如果是第二页,那么必须隐藏其他OMR行,等等 我认为如果我们可以将'fo:pagenumber'的值存储在一个变量中,那么我们就可以编写if条件来避免非必需的行。但我无法在变量中存储'fo:pagenumber' 有谁能建议我们如何使用XSLT FO实现它吗?对于信封填充这样

我需要在PDF文件上生成OMR标记(可以是10个小的行,如“-----”),其中该PDF文件模板将使用XSLT准备。我面临的挑战是,根据页码,一些OMR行需要隐藏。 例如:如果pdf文件页码是1,那么我必须隐藏第三行OMR,如果是第二页,那么必须隐藏其他OMR行,等等

我认为如果我们可以将'fo:pagenumber'的值存储在一个变量中,那么我们就可以编写if条件来避免非必需的行。但我无法在变量中存储'fo:pagenumber'


有谁能建议我们如何使用XSLT FO实现它吗?

对于信封填充这样的用途,如果页面数量有限,您可以在页面的
FO:region start
()和/或
FO:region end
区域中生成它们

这将需要为第1页、第2页等中的每一页生成两个单独的
fo:simple page master
,每个页面都有一个
fo:region start
和一个唯一的
region name
值。您将需要两个,因为任何页面都可能是序列中的最后一个,并且需要一个不同的OMR代码来指示这一点

您还需要一个
fo:page sequence master
(),其中包含与最大页数相同的
fo:repeatable page master备选项。每个
fo:repeatable page master alternatives
都有
最大重复次数=“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顺序,则此方法对您没有帮助。

对于信封填充等用途,如果页面数量有限,可以在页面的
fo:region start
()和/或
fo:region end
区域中生成页面

这将需要为第1页、第2页等中的每一页生成两个单独的
fo:simple page master
,每个页面都有一个
fo:region start
和一个唯一的
region name
值。您将需要两个,因为任何页面都可能是序列中的最后一个,并且需要一个不同的OMR代码来指示这一点

您还需要一个
fo:page sequence master
(),其中包含与最大页数相同的
fo:repeatable page master备选项。每个
fo:repeatable page master alternatives
都有
最大重复次数=“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顺序,那么这种方法对你没有帮助。

OMR标记通常由两到三种不同类别的标记组成。首先要考虑的是,大多数OMR标记需要应用于一大堆文档,比如一个长1000页的长PDF页面,由100页的语句组成,页面大小可能不同。p> 在包中的单个文档中,有基于页面位置的标记(如第一页、最后一页),有基于数据中某些内容的特殊标记(如账户余额低于$0,因此打印在红色页面上),最后有顺序标记,基本上是计数0到7,0到7,整个包的0到7,与它正在处理的语句无关。这些最后的标记由高速打印机/分拣机使用,以验证事情是否正常进行(确保所有页面都在处理中)

在XSL中处理此问题的最简单方法是根据各自的规则在文档中绘制前两种类型的标记。在页面模板母版中很容易做到这一点,因为它们要么是定位的(第一个/最后一个),要么基于一些XPATH数据表达式,如“accountval<0”

我们在解决方案中所做的是在所有其他位置上做一个标记,即每0到7个标记放下一个标记。大多数FO处理器都支持将FO文件处理为中间表示形式,该表示形式可以从序列化为XML树结构的引擎中获得。此结构包括
元素。在这里,你可以做标记提醒的工作

然后,只需遍历整个包并“删除”每个页面逻辑中的结构,即可使序列标记正常工作

这是正确处理文档包的唯一方法,因为序列标记自然会交叉包中的各个语句——可能有一个2页的语句,后面是一个10页的语句,后面是一个3页的语句,并且无法猜测每个语句的处理从何处开始/结束

如果您想检查一个实现,可以下载RenderX的