go-pdfium icon indicating copy to clipboard operation
go-pdfium copied to clipboard

I use FPDFPageObj_SetLineCap to set FPDF_LINECAP_ROUND, but not work

Open ZMbiubiubiu opened this issue 2 months ago • 1 comments

I find FPDFPageObj_SetLineCap not work, I expect the drawn path object to be circular at both ends.

func AddPath(ctx *easy.Context, instance pdfium.Pdfium, page requests.Page, pathPoints [][]float32, width float32, color *color.RGBA) error {
	// create path
	pathRes, err := instance.FPDFPageObj_CreateNewPath(&requests.FPDFPageObj_CreateNewPath{
		X: 0,
		Y: 0,
	})
	if err != nil {
		ctx.SLog.Error("AddPath FPDFPageObj_CreateNewPath error").SetErr(err).Print()
		return err
	}

	//  strokeColor
	_, err = instance.FPDFPageObj_SetStrokeColor(&requests.FPDFPageObj_SetStrokeColor{
		PageObject: pathRes.PageObject,
		StrokeColor: structs.FPDF_COLOR{
			R: uint(color.R),
			G: uint(color.G),
			B: uint(color.B),
			A: uint(color.A),
		},
	})
	if err != nil {
		ctx.SLog.Error("AddPath FPDFPageObj_SetStrokeColor error").SetErr(err).Print()
		return err
	}

	//  width
	_, err = instance.FPDFPageObj_SetStrokeWidth(&requests.FPDFPageObj_SetStrokeWidth{
		PageObject:  pathRes.PageObject,
		StrokeWidth: width,
	})
	if err != nil {
		ctx.SLog.Error("AddPath FPDFPageObj_SetStrokeWidth error").SetErr(err).Print()
		return err
	}

	// line cap
	_, err = instance.FPDFPageObj_SetLineCap(&requests.FPDFPageObj_SetLineCap{
		PageObject: pathRes.PageObject,
		LineCap:    enums.FPDF_LINECAP_ROUND,
	})
	if err != nil {
		ctx.SLog.Error("AddPath FPDFPageObj_SetLineCap error").SetErr(err).Print()
		return err
	}

	// line join
	_, err = instance.FPDFPageObj_SetLineJoin(&requests.FPDFPageObj_SetLineJoin{
		PageObject: pathRes.PageObject,
		LineJoin:   enums.FPDF_LINEJOIN_ROUND,
	})
	if err != nil {
		ctx.SLog.Error("AddPath FPDFPageObj_SetLineJoin error").SetErr(err).Print()
		return err
	}

	for _, points := range pathPoints {
		if len(points) == 0 {
			continue
		}

		_, err = instance.FPDFPath_MoveTo(&requests.FPDFPath_MoveTo{
			PageObject: pathRes.PageObject,
			X:          points[0],
			Y:          points[1],
		})
		if err != nil {
			ctx.SLog.Error("AddPath FPDFPath_MoveTo error").SetErr(err).Print()
			return err
		}

		for i := 2; i < len(points); i += 2 {
			_, err := instance.FPDFPath_LineTo(&requests.FPDFPath_LineTo{
				PageObject: pathRes.PageObject,
				X:          points[i],
				Y:          points[i+1],
			})
			if err != nil {
				ctx.SLog.Error("AddPath FPDFPath_LineTo error").SetErr(err).Print()
				return err
			}
		}
		ctx.SLog.Info("AddPath path points").Set("len points", len(points)/2).Print()
	}

	// 描边
	_, err = instance.FPDFPath_SetDrawMode(&requests.FPDFPath_SetDrawMode{
		PageObject: pathRes.PageObject,
		FillMode:   enums.FPDF_FILLMODE_NONE,
		Stroke:     true,
	})
	if err != nil {
		return err
	}

	_, err = instance.FPDFPage_InsertObject(&requests.FPDFPage_InsertObject{
		Page:       page,
		PageObject: pathRes.PageObject,
	})
	if err != nil {
		ctx.SLog.Error("AddPath FPDFPage_InsertObject error").SetErr(err).Print()
		return err
	}

	return nil
}

simple_add_path_uncompress.pdf

what I see in pdf content is that

20 0 obj 
<<
/Length 11639
>>
stream
q
0 0 0 RG 0 0 0 rg 1 w 0 J 0 j
/FXE1 gs q 0 0 0 rg 1 0 0 RG 20 w 1 j 0 0 m  < line data ... > 
Q

You can see 1 0 0 RG 20 w 1 j, FPDFPageObj_SetLineCap should generate 1 J!

tips: FPDFPageObj_SetLineJoin is work, because We can see 1 j.

ZMbiubiubiu avatar Sep 23 '25 12:09 ZMbiubiubiu

Hi,I think I find the bug. Here is it

// FPDFPageObj_SetLineCap sets the line cap of the page object.
func (p *PdfiumImplementation) FPDFPageObj_SetLineCap(request *requests.FPDFPageObj_SetLineCap) (*responses.FPDFPageObj_SetLineCap, error) {
	p.Lock()
	defer p.Unlock()

	pageObjectHandle, err := p.getPageObjectHandle(request.PageObject)
	if err != nil {
		return nil, err
	}

	success := C.FPDFPageObj_SetLineJoin(pageObjectHandle.handle, C.int(request.LineCap))
	if int(success) == 0 {
		return nil, errors.New("could not set page object line cap")
	}

	return &responses.FPDFPageObj_SetLineCap{}, nil
}
Image

I'll file a bug fix

ZMbiubiubiu avatar Sep 23 '25 13:09 ZMbiubiubiu