1

我正在使用 PdfAnnotation.SetContents 来设置注释的值。如果注释是 FreeText 类型,那么只有这种方法才能正确工作,并且值会显示在 PDF 上(使用 PDF 阅读器)。如果类型是小部件,则值被设置为 pdf 字典中的内容但不显示。有没有办法可以设置小部件的值?

4

1 回答 1

3

我找到了解决方案,为了显示内容,必须设置外观(“AP”)字典。

这可以用于:

void PdfField::CreateFieldAppearance(PdfMemDocument *memDoc, const PdfString &value)
{
  if( !m_pWidget->HasAppearanceStream() )
  {
    PdfRect pageRect;
    PdfPainter painter;

    PoDoFo::PdfRect rect = this->GetWidgetAnnotation()->GetRect();
    unsigned int width = rect.GetWidth();
    unsigned int height = rect.GetHeight();

    PdfRect pdfRect(0, 0, width, height);    

    PdfXObject xObj(pdfRect, memDoc);
    painter.SetPage(&xObj);
    painter.SetClipRect(pdfRect);

    painter.Save();
    painter.SetColor(221.0/255.0, 228.0/255.0, 1.0);

    painter.FillRect(0, 0, width, height);
    painter.Restore();

    // make rotation

    painter.Save();

    /***********************************************************************************/

    // Rotation Logic

    double angle = this->GetPage()->GetRotation();

    if (angle) {
        double radAngle = angle * M_PI / 180;

        int cosA =  (int)cos(radAngle);
        int sinA = (int)sin(radAngle);

        double translateY = rect.GetWidth(); // The View goes out of the bound, sits on top
        painter.SetTransformationMatrix(cosA, sinA, -sinA, cosA, translateY, 0);
    }
    /***********************************************************************************/


    PdfFont *font = memDoc->CreateFont("Helvetica", true, false);
    font->SetFontSize(15);     

    // Do the drawing
    painter.SetFont(font);
    painter.BeginText(10, 5);
    painter.SetStrokeWidth(20);
    painter.AddText(value);
    painter.EndText();

    painter.FinishPage();

    // This is very important. Not only does it disable the editing.
    // Also it does correct the appearance issue on Adobe Readers.
    this->SetReadOnly(true);

    // The Stream Object has to be saved to the annotation
    PoDoFo::PdfDictionary dict;
    dict.AddKey( "N", xObj.GetObject()->Reference() );
    this->GetFieldObject()->GetDictionary().AddKey( "AP", dict );
}

}
于 2013-10-18T15:54:10.403 回答