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.
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
Create Shape geometries: Use methods such as
IDOMPathGeometry::create(),IDOMPathGeometry::createEllipse()andIDOMPathGeometry::createPolygon()to create geometries for shapes like boxes, circles, hexagons etc.Create Line geometries: Utilize
lineToandmoveTomethods in anIDOMPathGeometryBuilderto create line geometries.Create a path: Once you have your geometry, you can create a path with
IDOMPathNode::createStroked. You can control the thickness withpath->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.
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);
}
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);
}
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);
}
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.