Saltar al contenido

xsl: fo ajuste de línea en línea y salto de línea

Solución:

Los avances de línea pueden estar presentes en un documento FO como caracteres de avance de línea o entidades de caracteres numéricos (
 o 
); los siguientes bloques FO son completamente equivalentes:

<fo:block>Before the linefeed&#x000A;after the linefeed.</fo:block>

<fo:block>Before the linefeed
after the linefeed.</fo:block>

El manejo predeterminado de los avances de línea consiste en:

  1. mudado ellos en espacios normales;
  2. colapsando ellos con otros espacios adyacentes.

Esto explica por qué su entrada inicial produce una salida donde todas las piezas de contenido se colocan consecutivamente en la misma línea.

Usando la propiedad linefeed-treatment="preserve" se conservan ambas formas de avance de línea y el proceso de construcción de línea las respetará (se denominan saltos de línea forzados). Tenga en cuenta que linefeed-treatment solo se aplica a fo:block elementos; no tiene ningún efecto sobre fo:inline elementos.

Su bloque “editar 1” tiene más avances de línea de los que necesita porque “… Segunda línea, imagen:”, la imagen y “algo más de texto en la línea 2 …” están dentro de tres fo:block elementos, y cada bloque genera sus propias líneas.

Solución 1:

La forma más sencilla de obtener el resultado deseado es probablemente esta, con un solo fo:block tener su salto de línea conservado (esto es solo su entrada original, después de eliminar el innecesario fo:inlinesy poner todo en la misma línea:

<fo:block linefeed-treatment="preserve">First Line&#xA;Second Line, Image: <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/> some more Text on Line 2&#10;3rd Line</fo:block>

Tenga en cuenta que no puedes sangrar este código, ¡porque los avances de línea adicionales también aparecerían en la salida!

Solucion 2:

Una segunda solución, que no implica el uso de linefeed-treatment propiedad y crea un código más fácil de leer, sería utilizar bloques vacíos en lugar de avances de línea forzados:

<fo:block>
    First Line<fo:block/>Second Line, Image: 
    <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/> 
    some more Text on Line 2<fo:block/>3rd Line
</fo:block>

Como los avances de línea no se conservan, podemos usarlos libremente:

<fo:block>
    First Line
    <fo:block/>
    Second Line, Image: 
    <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/> 
    some more Text on Line 2
    <fo:block/>
    3rd Line
</fo:block>

Los bloques vacíos dividen el contenido del bloque exterior sin crear nada en la salida.

Acabo de encontrar la respuesta en los comentarios de FOP 1536.

Ahora estoy usando

linefeed-treatment="preserve"

en el elemento de bloque y estoy reemplazando todos los espacios dentro de las líneas de texto con algo de magia Unicode en el xsl antes:

replace(@text, ' ', '&#x00A0;&#x200B;') 

Edición 1: para ser un poco más preciso, esta es la parte relevante del xsl que estoy usando:

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY nbsp "&#160;">
    <!ENTITY ZeroWidthSpace "&#x200B;"> 
]>

<fo:block linefeed-treatment="preserve">
    <fo:inline><xsl:value-of select="replace(@text, ' ', '&nbsp;&ZeroWidthSpace;')"/></fo:inline>
</fo:block>

Con este enfoque, obtengo un xml con sangría bastante limpio y al mismo tiempo tengo un control total sobre los saltos de línea y los espacios en blanco.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *