go-pdfium
go-pdfium copied to clipboard
I use FPDFPageObj_SetLineCap to set FPDF_LINECAP_ROUND, but not work
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.
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
}
I'll file a bug fix