2010-09-15 42 views
12

Estoy tratando de insertar un separador de línea (ya sabes, esa línea horizontal que se ejecuta entre los documentos) en mi documento con iText. He encontrado algunos recursos a través de Google que usan com.lowagie.text.pdf.draw.LineSeparator pero la versión de iText que estoy usando (1.4.2) no parece tener ese paquete.Separador de línea en iText?

¿Alguien puede sugerir otra manera de agregar un buen separador de línea para mi pdf? Y por favor no digas que actualices .jar-- Estoy encerrado en 1.4.2.

Gracias!

+1

explique las razones técnicas por las que no se puede actualizar a una versión que es compatible con las características que se requieren. –

Respuesta

13

Hay un poco de una manera desordenada en esto en las versiones anteriores de iText. Si almacena el elemento encima de la línea horizontal en un PdfPCell, puede establecer el borde de eso para mostrar solo la parte inferior. (Eso célula también puede estar en blanco si es necesario)

PdfPCell myCell = new PdfPCell(new Paragraph("Hello World")); 
myCell.setBorder(Rectangle.BOTTOM); 

El resultado debe ser similar (línea continua, no a cuadros)

Hello World 
----------- 

Esto debe darle lo que desea. No es la solución óptima, pero es una forma de evitar las limitaciones del viejo contenedor.

Para su referencia, si desea realizar este truco para poner una línea en la parte superior y por debajo de su texto para dar un resultado de

----------- 
Hello World 
----------- 

El argumento para setBorder() es un entero que se puede utilizar operación bit a bit para manipular los valores. Así que el ejemplo anterior se podría lograr con

myCell.setBorder(Rectangle.BOTTOM | Rectangle.TOP); 

edición: Ejemplo

//Create the table which will be 2 Columns wide and make it 100% of the page 
PdfPTable myTable = new PdfPtable(2); 
myTable.setWidthPercentage(100.0f); 

//create a 3 cells and add them to the table 
PdfPCell cellOne = new PdfPCell(new Paragraph("Hello World")); 
PdfPCell cellTwo = new PdfPCell(new Paragraph("Bottom Left")); 
PdfPcell cellThree = new PdfPCell(new Paragraph("Bottom Right")); 

cellOne.setColspan(2); 
cellOne.setBorder(Rectangle.BOTTOM); 
cellOne.setHorizontalAlignment(Element.ALIGN_LEFT); 

cellTwo.setBorder(Rectangle.NO_BORDER); 
cellTwo.setHorizontalAlignment(Element.ALIGN_LEFT); 
cellThree.setBorder(Rectangle.LEFT); 
cellThree.setHorizontalAlignment(Element.ALIGN_RIGHT); 

//Add the three cells to the table 
myTable.addCell(cellOne); 
myTable.addCell(cellTwo); 
myTable.addCell(cellThree); 

//Do something to add the table to your root document 

Esto se debe crear una tabla que se ve algo como lo siguiente (suponiendo que corregir mis errores tipográficos)

Hello World 
------------------------------------ 
Bottom Left  |  Bottom Right 
+0

Parece que es casi EXACTAMENTE lo que necesito, pero ¿llenará el borde toda la página, o solo irá al final de lo que está en el párrafo? - Básicamente necesito una línea que vaya de un lado a otro de la página. –

+0

Le di un ejemplo sobre cómo sacar esto adelante en Editar arriba. Acabo de escribir esto aquí, así que no grites cuando encuentres errores de sintaxis. La parte clave es mirar el myTable.setWidthPercentage(). Esto está en relación con el elemento padre. Suponiendo que agregue esto a un objeto Documento, tiene una tabla que se extiende al 100% del documento. – Sean

+0

¡Eso era exactamente lo que estaba buscando! Gracias, gameaddict. :-) –

1

table.setExtendLastRow(true);

lo haré!

7

También estoy a favor de usar elementos de línea en lugar de tablas ... ¡no repita los errores de formato HTML!

final LineSeparator lineSeparator = new LineSeparator(); 
lineSeparator.drawLine(pdfCB, leftX, rightX, y); 
+0

jejeje ... Estaba buscando exactamente esta, es decir, agregando un 'LineSeparator' a un' PdfContentByte'. ¡TRABAJÓ UN TRATO! :) –

5

Solo agregue un objeto separador de línea al objeto de documento pdf. Eso debería ser lo

LineSeparator objectName = new LineSeparator();    
document.add(objectName); 
1

La solución dada por Sean ofrecen una mayor flexibilidad cuando se trata de un texto subrayado por el separador de línea. No sé si LineSeparator puede hacer eso, parece ser solo un separador de líneas.

Paragraph ph = new Paragraph(new Phrase("My line separator", yourFont)); 
PdfPCell cell = new PdfPCell(ph); 
cell.Border = Rectangle.BOTTOM_BORDER; 
cell.BorderColor = new BaseColor(44, 67, 144); 
cell.BorderWidth = 2f; 

PdfPTable table = new PdfPTable(1);     
table.AddCell(cell); 
table.HorizontalAlignment = Element.ALIGN_LEFT; 
table.WidthPercentage = 100f; 
doc.Add(table); 

Espero que te ayudemos. Debería imprimir algo como esto.A line separator with text

1

Una manera simple, si quieres toda una línea nueva:

document.add(Chunk.NEWLINE); 
    LineSeparator ls = new LineSeparator(); 
    document.add(new Chunk(ls)); 
1

también se enfrentaron al problema similar ya que mi compañía también estaba usando la versión antigua de iText es decir, 1.4.2. Estas son las dos soluciones que propongo para crear una regla horizontal. El primero usa Gráfico y el segundo usa Tabla con borde inferior. Ambos funcionan bien para mí.

Solución 1:

protected static final Graphic HR = new Graphic(); 
    static { 
    HR.setHorizontalLine(1f, 100f, Color.BLACK); 
    } 

Solución 2:

private static void addHorizontalLine(Document document, PdfWriter writer) throws DocumentException, IOException{ 
    PdfPTable myTable = new PdfPTable(1); 
    myTable.setWidthPercentage(100.0f); 
    PdfPCell cellOne = new PdfPCell(); 
    cellOne.setBorder(Rectangle.BOTTOM); 
    document.add(new Paragraph(" ")); 
    document.add(myTable); 
} 

PS: La razón por la que no podemos actualizar JAR es que las versiones anteriores de iText son libres para uso comercial y se pagan las versiones más recientes.

Espero que ayude!

0

yo encontramos este más se parece a un archivo HTML <HR> etiqueta:

import com.itextpdf.kernel.color.Color; 
import com.itextpdf.kernel.pdf.canvas.draw.SolidLine; 
import com.itextpdf.layout.element.LineSeparator; 

... 

final SolidLine lineDrawer = new SolidLine(1f); 
lineDrawer.setColor(Color.GRAY); 
document.add(new LineSeparator(lineDrawer)); 

(iText 7.0.0)