Skip to main content
Skip table of contents

Adding marks to a PDF using Mako

📌 Overview

This article provides guidance on how to add marks to a PDF using Mako, specifically focusing on adding simple lines and shapes.

(question) Issue Description

A user inquired about the ability to add simple lines to a PDF using Mako, as the existing documentation primarily covered adding text and images.

💡 Solution

To add marks to a PDF using Mako, follow these steps:

Creating Shapes and Lines

  1. Create Shape geometries: Use methods such as IDOMPathGeometry::create(), IDOMPathGeometry::createEllipse() and IDOMPathGeometry::createPolygon() to create geometries for shapes like boxes, circles, hexagons etc.

  2. Create Line geometries: Utilize lineTo and moveTo methods in an IDOMPathGeometryBuilder to create line geometries.

  3. Create a path: Once you have your geometry, you can create a path with IDOMPathNode::createStroked . You can control the thickness with
    path->setStrokeThickness() and append that to your fixed page.

⌨️ Sample Code

To learn how to draw lines, you should look at the createTarget() function below. This draws a kind of star figure. See Visual Studio Projects/CreateShapes, Java Projects/CreateShapes or Python Projects/CreateShapes for the full code which shows how to draw shapes, then either stroke or fill them with a solid colour.

CPP
IDOMPathGeometryPtr createTarget(const IJawsMakoPtr& mako, FRect box, double nLines, double rotation)
{
    double angle = rotation * (PI / 180.0);
    const double incr = 2.0 * PI / nLines;

    const auto radiusX = box.dX / 2.0;
    const auto radiusY = box.dY / 2.0;
    const auto centerX = box.x + radiusX;
    const auto centerY = box.y + radiusY;
    
    const auto geometryBuilder = IDOMPathGeometryBuilder::create(mako);
    const auto center = FPoint(centerX, centerY);
    geometryBuilder->moveTo(center);

    double endX = 0.0, endY = 0.0;
    for (int i = 0; i < nLines; i++)
    {
        endX = centerX + radiusX * cos(angle);
        endY = centerY + radiusY * sin(angle);
        geometryBuilder->lineTo(FPoint(endX, endY));
        geometryBuilder->moveTo(center);
        angle += incr;
    }
    geometryBuilder->close();
    return geometryBuilder->createGeometry(mako, IDOMPathGeometry::eFRNonZero);
}
C#
IDOMPathGeometry CreateTarget(IJawsMako mako, FRect box, int nLines, double rotation)
{
    double angle = rotation * Math.PI / 180.0;
    double incr = 2.0 * Math.PI / nLines;
    double radiusX = box.dX / 2.0;
    double radiusY = box.dY / 2.0;
    double centerX = box.x + radiusX;
    double centerY = box.y + radiusY;

    var builder = IDOMPathGeometryBuilder.create(mako);
    var center = new FPoint(centerX, centerY);
    builder.moveTo(center);

    for (int i = 0; i < nLines; i++)
    {
        double endX = centerX + radiusX * Math.Cos(angle);
        double endY = centerY + radiusY * Math.Sin(angle);
        builder.lineTo(new FPoint(endX, endY));
        builder.moveTo(center);
        angle += incr;
    }
    builder.close();
    return builder.createGeometry(mako, IDOMPathGeometry.eFillRule.eFRNonZero);
}
JAVA
IDOMPathGeometry createTarget(IEDLClassFactory factory, FRect box, int nLines, double rotation) 
{
    double angle = Math.toRadians(rotation);
    double incr = 2.0 * Math.PI / nLines;
    double radiusX = box.getDX() / 2.0;
    double radiusY = box.getDY() / 2.0;
    double centerX = box.getX() + radiusX;
    double centerY = box.getY() + radiusY;

    var builder = IDOMPathGeometryBuilder.create(factory);
    FPoint center = new FPoint(centerX, centerY);
    builder.moveTo(center);

    for (int i = 0; i < nLines; i++) {
        double endX = centerX + radiusX * Math.cos(angle);
        double endY = centerY + radiusY * Math.sin(angle);
        builder.lineTo(new FPoint(endX, endY));
        builder.moveTo(center);
        angle += incr;
    }

    builder.close();
    return builder.createGeometry(factory, IDOMPathGeometry.eFillRule.eFRNonZero);
}
PY
def create_target(factory, box, n_lines, rotation):
    angle = math.radians(rotation)
    incr = 2.0 * math.pi / n_lines
    radius_x = box.dX / 2.0
    radius_y = box.dY / 2.0
    center_x = box.x + radius_x
    center_y = box.y + radius_y

    builder = IDOMPathGeometryBuilder.create(factory)
    center = FPoint(center_x, center_y)
    builder.moveTo(center)

    for _ in range(n_lines):
        end_x = center_x + radius_x * math.cos(angle)
        end_y = center_y + radius_y * math.sin(angle)
        builder.lineTo(FPoint(end_x, end_y))
        builder.moveTo(center)
        angle += incr

    builder.close()
    return builder.createGeometry(factory, IDOMPathGeometry.eFRNonZero)

☑️ Conclusion

Mako provides robust tools for adding marks to PDFs, enhancing the document's usability in print production. For further assistance, please contact Mako support.

📚 Additional Resources

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.