Прежде всего, я вижу, что вы используете версию iText 7.0.x
(из-за того, что цветовые константы находятся в классе Color
), в то время как 7.1.x
уже давно существует и 7.1.4
является последней версией на данный момент. Я рекомендую вам переключиться на новую строку как можно раньше в проекте, потому что эта строка версии активно поддерживается в данный момент. Разница в API очень мала между 7.0 и 7.1, но в вашем случае вам придется использовать класс ColorConstants
вместо Color
.
Также нет необходимости каждый раз создавать новые PdfCanvas
экземпляры. Вы можете использовать один экземпляр. При необходимости вы можете вызвать saveState()
и restoreState()
, чтобы настройки цвета, ширины линии и т. Д. Относились только к операциям между сохранением и восстановлением состояния.
Вы подходите с PdfCanvas#arc
на самом деле является правильным, но вам нужно смотреть на то, чтобы погладить дугу, а не заполнить ее. Если я немного изменю твой код:
int centerX = 300;
int centerY = 200;
int radius = 100;
float fillPercent = 80;
float circleThickness = 10;
float arcThickness = 15;
PdfCanvas canvas = new PdfCanvas(pdfPage);
canvas.setFillColor(ColorConstants.GRAY);
canvas.circle(centerX, centerY, radius);
canvas.fill();
canvas.setFillColor(ColorConstants.WHITE);
canvas.circle(centerX, centerY, radius - circleThickness);
canvas.fill();
canvas.setStrokeColor(ColorConstants.GREEN);
canvas.setLineWidth(arcThickness);
canvas.arc(centerX - radius + circleThickness / 2, centerY - radius + circleThickness / 2,
centerX + radius - circleThickness / 2, centerY + radius - circleThickness / 2, 90, -fillPercent / 100 * 360.);
canvas.stroke();
Я могу добиться следующего результата: