From 266425e817f1ee2784d7183e59d5d25c9c3b0b76 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Tue, 1 Apr 2025 15:42:39 +0300 Subject: [PATCH] Fix radiobutton AP --- PdfFile/SrcWriter/Annotation.cpp | 9 ++-- PdfFile/SrcWriter/Field.cpp | 77 +++++++++++++++++++++----------- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/PdfFile/SrcWriter/Annotation.cpp b/PdfFile/SrcWriter/Annotation.cpp index e6ae0e5b13..1281503240 100644 --- a/PdfFile/SrcWriter/Annotation.cpp +++ b/PdfFile/SrcWriter/Annotation.cpp @@ -95,7 +95,8 @@ namespace PdfWriter std::string AddLE(const BYTE& nLE) { std::string sValue; - switch (nLE) + ELineEndType eLE = ELineEndType(nLE); + switch (eLE) { case ELineEndType::Square: sValue = "Square"; break; case ELineEndType::Circle: sValue = "Circle"; break; @@ -704,7 +705,8 @@ namespace PdfWriter void CLineAnnotation::SetIT(BYTE nIT) { std::string sValue; - switch (nIT) + ELineIntentType eIT = ELineIntentType(nIT); + switch (eIT) { case ELineIntentType::LineDimension: sValue = "LineDimension"; break; case ELineIntentType::LineArrow: sValue = "LineArrow"; break; @@ -719,7 +721,8 @@ namespace PdfWriter return; std::string sValue; - switch (nCP) + ECaptionPositioning eCP = ECaptionPositioning(nCP); + switch (eCP) { case ECaptionPositioning::Inline: sValue = "Inline"; break; case ECaptionPositioning::Top: sValue = "Top"; break; diff --git a/PdfFile/SrcWriter/Field.cpp b/PdfFile/SrcWriter/Field.cpp index 2563e860d5..d352954c3d 100644 --- a/PdfFile/SrcWriter/Field.cpp +++ b/PdfFile/SrcWriter/Field.cpp @@ -3177,7 +3177,7 @@ namespace PdfWriter nBorderType = m_pAnnot->GetBorderType(); } double dW = m_pAnnot->GetRect().fRight - m_pAnnot->GetRect().fLeft; - double dH = m_pAnnot->GetRect().fBottom - m_pAnnot->GetRect().fTop; + double dH = std::abs(m_pAnnot->GetRect().fBottom - m_pAnnot->GetRect().fTop); double dCX = dW / 2.0, dCY = dH / 2.0; double dR = std::min(dW, dH) / 2.0; @@ -3201,7 +3201,7 @@ namespace PdfWriter if (nBorderType == EBorderType::Dashed) m_pStream->WriteStr(m_pAnnot->GetBorderDash().c_str()); m_pStream->WriteStr(pAnnot->GetBCforAP().c_str()); - m_pStream->WriteStr("q\012"); + m_pStream->WriteStr("\012q\012"); m_pStream->WriteStr("1 0 0 1 "); m_pStream->WriteReal(dCX); m_pStream->WriteChar(' '); @@ -3268,9 +3268,10 @@ namespace PdfWriter nBorderType = m_pAnnot->GetBorderType(); } double dW = m_pAnnot->GetRect().fRight - m_pAnnot->GetRect().fLeft; - double dH = m_pAnnot->GetRect().fBottom - m_pAnnot->GetRect().fTop; + double dH = std::abs(m_pAnnot->GetRect().fBottom - m_pAnnot->GetRect().fTop); // Задний фон + m_pStream->WriteStr("q\012"); m_pStream->WriteStr(pAnnot->GetBGforAP(!bN && nBorderType != EBorderType::Beveled ? -0.250977 : 0).c_str()); m_pStream->WriteStr("\012"); StreamWriteRect(m_pStream, 0, 0, dW, dH); @@ -3297,6 +3298,7 @@ namespace PdfWriter m_pStream->WriteStr(bN ? "0.75293 g" : "1 g"); else // Beveled m_pStream->WriteStr(bN ? pAnnot->GetBGforAP(-0.250977).c_str() : "1 g"); + m_pStream->WriteStr("\012"); StreamWriteXYMove(m_pStream, dW - dBorder, dH - dBorder); StreamWriteXYLine(m_pStream, dW - dBorder, dBorder); @@ -3315,6 +3317,7 @@ namespace PdfWriter if (nBorderType == EBorderType::Dashed) m_pStream->WriteStr(m_pAnnot->GetBorderDash().c_str()); m_pStream->WriteStr(pAnnot->GetBCforAP().c_str()); + m_pStream->WriteStr("\012"); if (nBorderType == EBorderType::Underline) { @@ -3323,7 +3326,7 @@ namespace PdfWriter } else StreamWriteRect(m_pStream, dBorder / 2.0, dBorder / 2.0, dW - dBorder, dH - dBorder); - m_pStream->WriteStr("s\012"); + m_pStream->WriteStr("s\012Q\012"); // Установлен if (!bSet) @@ -3332,7 +3335,6 @@ namespace PdfWriter double dShift = dBorder; if (nBorderType == EBorderType::Beveled || nBorderType == EBorderType::Inset) dShift *= 2; - dShift += 1; bool bW = dW > dH; double dCX = dW / 2.0, dCY = dH / 2.0; double dC = std::min(dW, dH) / 2.0; @@ -3340,16 +3342,39 @@ namespace PdfWriter ECheckBoxStyle nStyle = pAnnot->GetStyle(); switch (nStyle) { + case ECheckBoxStyle::Check: + { + m_pStream->WriteStr("0 g\012q\012"); + m_pStream->WriteStr("1 0 0 1 "); + m_pStream->WriteReal((bW ? dDiff : 0) + dShift); + m_pStream->WriteChar(' '); + m_pStream->WriteReal((bW ? 0 : dDiff) + dShift); + m_pStream->WriteStr(" cm\012"); + + double dScale = (std::min(dW, dH) - dShift * 2.0) / 20.0; + StreamWriteXYMove(m_pStream, 5.2381 * dScale, 11.2 * dScale); + StreamWriteXYLine(m_pStream, 4 * dScale, 8.2 * dScale); + StreamWriteXYLine(m_pStream, 7.71429 * dScale, 4 * dScale); + StreamWriteXYCurve(m_pStream, 12.0476 * dScale, 10.6 * dScale, 13.2857 * dScale, 11.8 * dScale, 17 * dScale, 16 * dScale); + StreamWriteXYCurve(m_pStream, 14.5238 * dScale, 16 * dScale, 9.77778 * dScale, 11.2 * dScale, 7.71429 * dScale, 8.2 * dScale); + StreamWriteXYLine(m_pStream, 5.2381 * dScale, 11.2 * dScale); + + m_pStream->WriteStr("f\012Q\012"); + break; + } case ECheckBoxStyle::Cross: { + double dCross = dBorder; + if (nBorderType == EBorderType::Beveled || nBorderType == EBorderType::Inset) + dCross *= 2; m_pStream->WriteStr("q\012"); - StreamWriteRect(m_pStream, dBorder * 2.0, dBorder * 2.0, dW - dBorder * 4.0, dH - dBorder * 4.0); + StreamWriteRect(m_pStream, dCross, dCross, dW - dCross, dH - dCross); m_pStream->WriteStr("W\012n\0120 G\0121 w\012"); - double x1 = dShift + (bW ? dDiff : 0); - double y1 = dShift + (bW ? 0 : dDiff); - double x2 = dW - dShift - (bW ? dDiff : 0); - double y2 = dH - dShift - (bW ? 0 : dDiff); + double x1 = dShift + 1 + (bW ? dDiff : 0); + double y1 = dShift + 1 + (bW ? 0 : dDiff); + double x2 = dW - dShift - 1 - (bW ? dDiff : 0); + double y2 = dH - dShift - 1 - (bW ? 0 : dDiff); StreamWriteXYMove(m_pStream, x1, y2); StreamWriteXYLine(m_pStream, x2, y1); StreamWriteXYMove(m_pStream, x2, y2); @@ -3360,19 +3385,23 @@ namespace PdfWriter } case ECheckBoxStyle::Diamond: { - double dSq = dC - dShift; - double ca = cos(45.0 / 180.0 * M_PI); - + double dSq = dC - dShift * 2.0 - 1; m_pStream->WriteStr("0 g\012q\012"); - StreamWriteCM(m_pStream, ca, ca, -ca, ca, dCX, dCY); - StreamWriteRect(m_pStream, -dSq / 2.0, -dSq / 2.0, dSq / 2.0, dSq / 2.0); + m_pStream->WriteStr("1 0 0 1 "); + m_pStream->WriteReal(dCX); + m_pStream->WriteChar(' '); + m_pStream->WriteReal(dCY); + m_pStream->WriteStr(" cm\012"); + StreamWriteXYMove(m_pStream, -dSq, 0); + StreamWriteXYLine(m_pStream, 0, dSq); + StreamWriteXYLine(m_pStream, dSq, 0); + StreamWriteXYLine(m_pStream, 0, -dSq); m_pStream->WriteStr("f\012Q\012"); break; } - case ECheckBoxStyle::Check: case ECheckBoxStyle::Circle: { - double dR = dC - dShift; + double dR = dC - dShift * 2.0 - 1; m_pStream->WriteStr("0 g\012q\012"); m_pStream->WriteStr("1 0 0 1 "); @@ -3386,7 +3415,7 @@ namespace PdfWriter } case ECheckBoxStyle::Star: { - double dROuter = dC - dShift; + double dROuter = dC - dShift * 2.0 - 1; double dRInner = dROuter / 2.5; int nPoints = 5; @@ -3395,8 +3424,8 @@ namespace PdfWriter { double dR = i % 2 == 0 ? dROuter : dRInner; double dAngle = M_PI / nPoints * i; - double dX = dCX + dR * std::sin(dAngle); - double dY = dCY - dR * std::cos(dAngle); + double dX = dCX - dR * std::sin(dAngle); + double dY = dCY + dR * std::cos(dAngle); if (i == 0) StreamWriteXYMove(m_pStream, dX, dY); else @@ -3407,14 +3436,10 @@ namespace PdfWriter } case ECheckBoxStyle::Square: { - double dSq = dC - dShift; - double x1 = dCX - dSq / 2.0; - double y1 = dCY - dSq / 2.0; - double x2 = x1 + dSq; - double y2 = y1 + dSq; + double dSq = std::min(dW, dH) * 2.0 / 3.0 - dShift * 2.0 - 1; m_pStream->WriteStr("0 g\012q\012"); - StreamWriteRect(m_pStream, x1, y1, x2, y2); + StreamWriteRect(m_pStream, dCX - dSq / 2.0, dCY - dSq / 2.0, dSq, dSq); m_pStream->WriteStr("f\012Q\012"); break; }