2013-05-21 1 views
2

Я загружаю выделение текста в PDF с помощью xsl-fo. Но когда он загружается, он полностью заполняет страницу с границы на границу. Есть ли способ предотвратить возможность того, чтобы текст мог переходить через блоки до, после, начинать и заканчивать, или я должен просто поместить поля на блоки, содержащие мой текст?Как предотвратить перемещение текста над областями до и после с использованием xsl-fo?

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output method="xml" indent="yes" /> 
<xsl:template match="/"> 
    <fo:root> 
     <!-- overall layout --> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="forSalePage"> 
       <fo:region-body/> 
       <fo:region-before extent="1in" background-color="#0000FF" /> 
       <fo:region-after extent="1in" background-color="#0000FF" /> 
       <fo:region-start/> 
       <fo:region-end/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 

     <!-- page content --> 
     <xsl:for-each select="ovgs/forSale/game"> 
      <fo:page-sequence master-reference="forSalePage"> 
       <fo:flow flow-name="xsl-region-body"> 
        <fo:block text-align="center" margin-top="0.1in">Pros:</fo:block> 
        <xsl:for-each select="review/pros/pro"> 
         <fo:block text-align="center">-<xsl:value-of select="." /></fo:block> 
        </xsl:for-each> 
        <fo:block text-align="center" margin-top="0.1in">Cons:</fo:block> 
        <xsl:for-each select="review/cons/con"> 
         <fo:block text-align="center">-<xsl:value-of select="." /></fo:block> 
        </xsl:for-each> 
        <fo:block page-break-before="always" margin-top="1.1in" margin-right="1in" margin-left="1in">Content:</fo:block> 
        <xsl:for-each select="review/content/*"> 
         <xsl:choose> 
          <xsl:when test=". = not(node())"> 
           <fo:block margin-top="0.1in" margin-right="1in" margin-left="1in"><xsl:value-of select="./preceding::text()[1]" /></fo:block> 
          </xsl:when> 
          <xsl:when test=". = text()"> 
           <fo:block text-align="center" margin-top="0.1in"><fo:external-graphic content-height="scale-to-fit" height="1in"><xsl:attribute name="src">url('<xsl:value-of select="./@url" />')</xsl:attribute></fo:external-graphic></fo:block> 
           <fo:block text-align="center" margin-right="1in" margin-left="1in"><xsl:value-of select="." /></fo:block> 
          </xsl:when> 
          <xsl:otherwise/> 
         </xsl:choose> 
        </xsl:for-each> 
        <fo:block margin-right="1in" margin-left="1in" margin-top="0.1in"><xsl:value-of select="review/content/p[last()]/following::text()[1]" /></fo:block> 
       </fo:flow> 
      </fo:page-sequence> 
     </xsl:for-each> 
    </fo:root> 
</xsl:template> 

То есть код для отображения плюсах, Cons и обзор содержимого файла XML. Он отображает всю информацию и изображения правильно и вставляет разрывы страниц после «Минусов», как это необходимо. Но проблема заключается в том, что контент Review слишком много для одной страницы и отображает информацию о последующих и предыдущих регионах.

What I get:   What I want: 
______________  ______________ 
|    |  |    | 
| Pros  |  | Pros  | 
| Blabla |  | Blabla | 
|    |  |    | 
| Cons  |  | Cons  | 
| Blabla |  | Blabla | 
|    |  |    | 
|    |  |    | 
|______________|  |______________| 
______________  ______________ 
|    |  |    | 
| Content  |  | Content  | 
|    |  |    | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
|__~~~~~~~~~~__|  |______________| 
______________  ______________ 
| ~~~~~~~~~~ |  |    | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
| ~~~~~~~~~~ |  | ~~~~~~~~~~ | 
|    |  | ~~~~~~~~~~ | 
|    |  | ~~~~~~~~~~ | 
|    |  |    | 
|    |  |    | 
|______________|  |______________| 

Вот регионы и их имена:

______________ 
| Before | 
|______________| 
| S|  | | 
| t|  |E | 
| a| Body |n | 
| r|  |d | 
| t|  | | 
|__|________|__| 
| After  | 
|______________| 

(PS тело тянется до границы страницы, а не только в других регионах)

+0

Пожалуйста, поделитесь сгенерированный PDF сниппет и XSL-FO четко понимать. –

+0

Это то, что вы хотели видеть? – wizzkid

+1

Кажется, вы пропустили две вещи здесь: Сначала ширину и высоту страницы измените на Во-вторых, измените на

ответ

4

Кажется, что вы пропустили две вещи здесь:

Во-первых, ширина и высота страницы, изменение <fo:simple-page-master master-name="forSalePage"> с <fo:simple-page-master master-name="forSalePage" page-height="11in" page-width="8.5in">

Во-вторых, изменить <fo:region-body/> с <fo:region-body margin="1in"/>

1
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output method="xml" indent="yes" /> 
<xsl:template match="/"> 
    <fo:root> 
     <!-- overall layout --> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="forSalePage"> 
       <fo:region-body margin="1in" /> 
       <fo:region-before extent="1in" background-color="#0000FF" /> 
       <fo:region-after extent="1in" background-color="#0000FF" /> 
       <fo:region-start/> 
       <fo:region-end/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 

     <!-- page content --> 
     <xsl:for-each select="ovgs/forSale/game"> 
      <fo:page-sequence master-reference="forSalePage"> 
       <fo:flow flow-name="xsl-region-body"> 
        <fo:block text-align="center" margin-top="0.1in">Pros:</fo:block> 
        <xsl:for-each select="review/pros/pro"> 
         <fo:block text-align="center">-<xsl:value-of select="." /></fo:block> 
        </xsl:for-each> 
        <fo:block text-align="center" margin-top="0.1in">Cons:</fo:block> 
        <xsl:for-each select="review/cons/con"> 
         <fo:block text-align="center">-<xsl:value-of select="." /></fo:block> 
        </xsl:for-each> 
        <fo:block page-break-before="always" margin-top="0.1in">Content:</fo:block> 
        <xsl:for-each select="review/content/*"> 
         <xsl:choose> 
          <xsl:when test=". = not(node())"> 
           <fo:block margin-top="0.1in"><xsl:value-of select="./preceding::text()[1]" /></fo:block> 
          </xsl:when> 
          <xsl:when test=". = text()"> 
           <fo:block text-align="center" margin-top="0.1in"><fo:external-graphic content-height="scale-to-fit" height="1in"><xsl:attribute name="src">url('<xsl:value-of select="./@url" />')</xsl:attribute></fo:external-graphic></fo:block> 
           <fo:block text-align="center"><xsl:value-of select="." /></fo:block> 
          </xsl:when> 
          <xsl:otherwise/> 
         </xsl:choose> 
        </xsl:for-each> 
        <fo:block margin-top="0.1in"><xsl:value-of select="review/content/p[last()]/following::text()[1]" /></fo:block> 
       </fo:flow> 
      </fo:page-sequence> 
     </xsl:for-each> 
    </fo:root> 
</xsl:template>