Drawing a double line using itext PDF
Categories:
Drawing Double Lines in iText PDF Documents

Learn how to create visually distinct double lines in your PDF documents using the iText library in Java, enhancing document aesthetics and clarity.
Creating professional-looking PDF documents often involves more than just placing text and images. Visual elements like lines can be crucial for separating sections, highlighting content, or simply improving the document's aesthetic appeal. While iText provides straightforward methods for drawing single lines, drawing a double line requires a slightly more creative approach. This article will guide you through the process of implementing double lines using iText in Java, covering the core concepts and providing practical code examples.
Understanding Line Drawing in iText
At its core, iText uses the PdfContentByte
object to draw graphics directly onto the PDF page. Lines are typically drawn by setting a starting point, then a current point, and finally stroking the path. The appearance of a line (color, width, dash pattern) is controlled by various PdfContentByte
methods. To create a double line, we essentially need to draw two parallel single lines, each with its own properties, positioned very close to each other.
flowchart TD A[Start Drawing Double Line] A --> B{Calculate Line Positions} B --> C[Set Line 1 Properties] C --> D[Draw Line 1] D --> E[Set Line 2 Properties] E --> F[Draw Line 2] F --> G[End Drawing Double Line]
Conceptual flow for drawing a double line in iText.
Implementing a Double Line Function
To draw a double line, we'll define a function that takes the PdfContentByte
object, coordinates (x1, y1, x2, y2), the gap between the lines, and the thickness of each line. The key is to calculate the offset for the second line based on the gap and the orientation of the line (horizontal or vertical). For horizontal lines, we adjust the Y-coordinate; for vertical lines, we adjust the X-coordinate.
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.io.IOException;
public class DoubleLineDrawer {
public static final String DEST = "double_line.pdf";
public static void main(String[] args) throws IOException, DocumentException {
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));
document.open();
PdfContentByte canvas = writer.getDirectContent();
// Draw a horizontal double line
drawDoubleLine(canvas, 50, 750, 550, 750, 2f, 0.5f);
// Draw another horizontal double line with different properties
drawDoubleLine(canvas, 50, 700, 550, 700, 5f, 1f);
// Draw a vertical double line
drawDoubleLine(canvas, 100, 600, 100, 500, 2f, 0.5f);
document.close();
System.out.println("PDF with double lines created at: " + DEST);
}
/**
* Draws a double line on the PDF canvas.
*
* @param canvas The PdfContentByte object to draw on.
* @param x1 The x-coordinate of the starting point.
* @param y1 The y-coordinate of the starting point.
* @param x2 The x-coordinate of the ending point.
* @param y2 The y-coordinate of the ending point.
* @param gap The distance between the two lines.
* @param thickness The thickness of each individual line.
*/
public static void drawDoubleLine(PdfContentByte canvas, float x1, float y1, float x2, float y2, float gap, float thickness) {
canvas.saveState();
canvas.setLineWidth(thickness);
// Determine if the line is horizontal or vertical
boolean isHorizontal = (y1 == y2);
boolean isVertical = (x1 == x2);
if (isHorizontal) {
// Draw first line
canvas.moveTo(x1, y1 - gap / 2);
canvas.lineTo(x2, y2 - gap / 2);
canvas.stroke();
// Draw second line
canvas.moveTo(x1, y1 + gap / 2);
canvas.lineTo(x2, y2 + gap / 2);
canvas.stroke();
} else if (isVertical) {
// Draw first line
canvas.moveTo(x1 - gap / 2, y1);
canvas.lineTo(x2 - gap / 2, y2);
canvas.stroke();
// Draw second line
canvas.moveTo(x1 + gap / 2, y1);
canvas.lineTo(x2 + gap / 2, y2);
canvas.stroke();
} else {
// For diagonal lines, a more complex calculation involving perpendicular vectors would be needed.
// For simplicity, this example focuses on horizontal and vertical lines.
System.err.println("Diagonal double lines are not supported by this simple implementation.");
}
canvas.restoreState();
}
}
Java code to draw horizontal and vertical double lines using iText.
gap
parameter is large enough to make the two lines visually distinct, but small enough to appear as a single 'double' line. Experiment with values to find what works best for your document's scale.Customizing Line Appearance
The drawDoubleLine
function can be extended to allow for more customization. You can set different colors, dash patterns, or even different thicknesses for each of the two lines that form the double line. This can be achieved by adding parameters for BaseColor
and setLineDash
to the function and applying them before stroking each individual line.
import com.itextpdf.text.BaseColor;
// ... (other imports remain the same)
public static void drawCustomDoubleLine(PdfContentByte canvas, float x1, float y1, float x2, float y2, float gap, float thickness1, float thickness2, BaseColor color1, BaseColor color2) {
canvas.saveState();
// Draw first line
canvas.setLineWidth(thickness1);
canvas.setColorStroke(color1);
canvas.moveTo(x1, y1 - gap / 2);
canvas.lineTo(x2, y2 - gap / 2);
canvas.stroke();
// Draw second line
canvas.setLineWidth(thickness2);
canvas.setColorStroke(color2);
canvas.moveTo(x1, y1 + gap / 2);
canvas.lineTo(x2, y2 + gap / 2);
canvas.stroke();
canvas.restoreState();
}
// Example usage in main method:
// drawCustomDoubleLine(canvas, 50, 650, 550, 650, 3f, 0.8f, 1.2f, BaseColor.BLUE, BaseColor.RED);
Extended function for drawing customizable double lines with different colors and thicknesses.
saveState()
and restoreState()
methods are crucial when drawing multiple elements with different properties. They ensure that changes to the graphics state (like line width or color) are localized to the drawing operations between them, preventing unintended side effects on subsequent drawing operations.