Hello,
has anybody some experience with the C library pdflib (http://www.pdflib.com/), either version 9 or 7 (the previous free one) under RHEL ?
I have been trying to use them under Centos (=RHEL) 5.9 or 7.2, either 32 bits or 64 bits but encounter problems with "signal 11".
Regards,
Alain
I give a little more information :
I am trying to use pdflib 9 (and/or 7) with VC 2.3 under Centos 7.2 (64 bits) and VC 2.1 under Centos 5.9 (32 bits).
I created a little Cobol program translated from a C program working perfectly (hello.c) given ith pdflib.
When I create an executable standalone program with
$ cob -x hello.cbl -L./lib -lpdf -lm -lstdc
and execute it :
$ ./hello
I have the following error :
Execution error : file 'hello'
error code: 114, pc=0, call=1, seg=0
114 Attempt to access item beyond bounds of memory (Signal 11)
I generate a runtim :
$ cob -xo rtspdf -L./lib -lpdf -lm -lstdc -e ""
compile hello :
$ cob hello.cbl
and start it
$ ./rtspdf hello.int
and I have anothe error, not at the same point (!) :
Load error : file 'PDF_new'
error code: 173, pc=68, call=1, seg=0
173 Called program file not found in drive/directory
Same kind of problem with another program called pdfclock and translated to Cobol.
Calling C from Cobol does not seem so easy...
Regards
Alain
$set sourceformat"free"
*>
*> PDFlib client: hello example in Cobol
*>
*> Compile with :
*> cob -x hello.cbl -L./lib -lpdf -lm -lstdc
*>
program-id. "hello".
special-names.
data division.
working-storage section.
*>copy "ctypes.cpy".
1 return-status pic s9(9) comp-5.
1 p usage pointer.
1 font pic s9(9) comp-5.
1 a4width comp-2 value 595.
1 a4height comp-2 value 842.
procedure division.
*> create a new PDFlib object
display "PDF_new"
call "PDF_new" returning p
if p = NULL then
display "Couldn't create PDFlib object (out of memory)!"
goback
end-if
*> This means we must check return values of load_font() etc.
display "PDF_set_option"
call "PDF_set_option" using by value p, by content z"errorpolicy=return"
display "PDF_begin_document"
call "PDF_begin_document" using by value p, by content z"hello.pdf", by value 0, by content z"" returning return-status
if return-status = -1 then
display "Error: " *> PDF_get_errmsg(p)
goback
end-if
*> This line is required to avoid problems on Japanese systems
display "PDF_set_option"
call "PDF_set_option" using by value p, by content z"hypertextencoding=host"
display "PDF_set_info"
call "PDF_set_info" using by value p, by content z"Creator", z"hello.c"
call "PDF_set_info" using by value p, by content z"Author", z"Thomas Merz"
call "PDF_set_info" using by value p, by content z"Title", z"Hello, world (C)!"
move 595 to a4width
move 842 to a4height
display "PDF_begin_page_ext"
call "PDF_begin_page_ext" using by value p, a4width, a4height, by content z""
*>call "PDF_begin_page_ext" using by value p, 595, 842, by content z""
*> Change "host" encoding to "winansi" or whatever you need!
display "PDF_load_font"
call "PDF_load_font" using by value p, by content z"Helvetica-Bold", by value 0, by content z"host", z"" returning font
if (font = -1) then
display "Error: " *> PDF_get_errmsg(p)
call "PDF_delete" using by value p
goback
end-if
call "PDF_setfont" using by value p, font, 24
call "PDF_set_text_pos" using by value p, 50, 700
call "PDF_show" using by value p, by content z"Hello, world!"
call "PDF_continue_text" using by value p, by content z"(says C)"
call "PDF_end_page_ext" using by value p, by content z""
call "PDF_end_document" using by value p, by content z""
call "PDF_delete" using by value p
goback
.
end program hello.
and the other program :
$set sourceformat"free"
*>
*> A little PDFlib application to draw an analog clock.
*>
*> cob -x pdfclock.cbl -L./lib -lpdf -lm -lstdc
*>
program-id. "pdfclock".
special-names.
*>call-convention 8 is litlink.
data division.
working-storage section.
copy "ctypes.cpy".
78 RADIUS value 200.0.
78 MARGIN value 20.0.
1 return-status pic s9(9) comp-5.
1 p usage pointer.
1 alpha usage is comp-2.
1 x usage is comp-2.
1 y usage is comp-2.
1 z usage is comp-2.
1 c1 usage is comp-2.
1 c2 usage is comp-2.
1 c3 usage is comp-2.
1 c4 usage is comp-2.
1 width usage is comp-2.
1 height usage is comp-2.
1 getopt usage is comp-2.
1 myradius usage is comp-2.
1 tm_hour usage is comp-2.
1 tm_min usage is comp-2.
1 tm_sec usage is comp-2.
1 optlist pic x(100).
*>----------------------------------------
*> date systeme
*>----------------------------------------
1 wrk-date.
2 date-heure.
3 date-jour.
4 wrk-i4-aa pic 9(4).
4 wrk-i2-mm pic 9(2).
4 wrk-i2-jj pic 9(2).
3 redefines date-jour.
4 wrk-date-cc PIC 99.
4 wrk-date-yy PIC 99.
4 wrk-date-mm PIC 99.
4 wrk-date-dd PIC 99.
3 wrk-time.
5 wrk-date-hh PIC 99.
5 wrk-date-min PIC 99.
5 wrk-date-sec PIC 99.
5 PIC X(7).
procedure division.
*> call "CBL_DEBUGBREAK"
display "Start program"
set p to NULL
call "PDF_new" returning p
if p = NULL then
display "Couldn't create PDFlib object (out of memory)!"
goback
end-if
*>call "PDF_get_value" using by value p, by content z"major", by value 0 returning getopt
display "PDF_set_parameter"
call "PDF_set_parameter" using by value p, by content z"errorpolicy", z"return"
display "PDF_begin_document"
move 0 to z
call "PDF_begin_document" using by value p, by content z"cbl_pdfclock.pdf", by value z, by content z""
if return-status = -1 then
display "Error: " *>PDF_get_errmsg(p))
goback
end-if
*> This line is required to avoid problems on Japanese systems */
display "PDF_set_parameter"
call "PDF_set_parameter" using by value p, by content z"hypertextencoding", z"host"
display "PDF_set_info"
call "PDF_set_info" using by value p, by content z"Creator", z"pdfclock.c"
call "PDF_set_info" using by value p, by content z"Author", z"Thomas Merz"
call "PDF_set_info" using by value p, by content z"Title", z"PDF clock (C)"
compute width = 2 * (RADIUS MARGIN)
compute height = 2 * (RADIUS MARGIN)
display "width =" width
display "height=" height
display "PDF_begin_page_ext"
move z"" to optlist
*>call "PDF_begin_page_ext" using by value p, by value width, height, by content z""
call "PDF_begin_page_ext" using by value p, by value width, height, by content optlist
compute x = RADIUS MARGIN
compute y = RADIUS MARGIN
display "PDF_translate"
call "PDF_translate" using by value p, x, y
move 0 to c1
move 0 to c2
move 1 to c3
move 0 to c4
display "PDF_setcolor"
call "PDF_setcolor" using by value p, by content z"fillstroke", z"rgb", by value c1, c2, c3, c4
display "PDF_save"
call "PDF_save" using by value p
*> minute strokes
display "minute strokes"
move 2 to width
call "PDF_setlinewidth" using by value p, width
perform varying alpha from 0 by 6 until alpha >= 360
compute myRadius = 6
call "PDF_rotate" using by value p, myRadius
compute x = RADIUS
compute y = 0
call "PDF_moveto" using by value p, x, y
compute x = RADIUS - MARGIN/3
compute y = 0
call "PDF_lineto" using by value p, x , y
call "PDF_stroke" using by value p
end-perform
call "PDF_restore" using by value p
call "PDF_save" using by value p
*> 5 minute strokes
display "5 minute strokes"
move 3 to width
call "PDF_setlinewidth" using by value p, width
perform varying alpha from 0 by 30 until alpha >= 360
compute myRadius = 30
call "PDF_rotate" using by value p, myRadius
compute x = RADIUS
compute y = 0
call "PDF_moveto" using by value p, x, y
compute x = RADIUS - MARGIN
compute y = 0
call "PDF_lineto" using by value p, x , y
call "PDF_stroke" using by value p
end-perform
move function current-date to wrk-date
*> draw hour hand
call "PDF_save" using by value p
compute myRadius = -((wrk-date-min/60.0) wrk-date-hh - 3.0) * 30.0
call "PDF_rotate" using by value p, myRadius
compute x = - RADIUS/10
compute y = - RADIUS/20
call "PDF_moveto" using by value p, x , y
compute x = RADIUS/2
compute y = 0
call "PDF_lineto" using by value p, x, y
compute x = - RADIUS/10
compute y = RADIUS/20
call "PDF_lineto" using by value p, x , y
call "PDF_closepath" using by value p
call "PDF_fill" using by value p
call "PDF_restore" using by value p
*> draw minute hand
call "PDF_save" using by value p
compute myRadius = -( (wrk-date-sec / 60.0) wrk-date-min - 15.0 ) * 6.0
call "PDF_rotate" using by value p, myRadius
compute x = - RADIUS/10
compute y = - RADIUS/20
call "PDF_moveto" using by value p, x, y
compute x = RADIUS * 0.8
compute y = 0
call "PDF_lineto" using by value p, x , y
compute x = - RADIUS/10
compute y = RADIUS/20
call "PDF_lineto" using by value p, x, y
call "PDF_closepath" using by value p
call "PDF_fill" using by value p
call "PDF_restore" using by value p
*> draw second hand
display "draw second hand"
move 1 to c1
move 0 to c2
move 0 to c3
move 0 to c4
call "PDF_setcolor" using by value p, by content z"fillstroke", z"rgb", by value c1, c2, c3, c4
move 2 to width
call "PDF_setlinewidth" using by value p, width
call "PDF_save" using by value p
compute myRadius = -((wrk-date-sec - 15.0) * 6.0)
call "PDF_rotate" using by value p, myRadius
compute x = - RADIUS/5
compute y = 0
call "PDF_moveto" using by value p, x, y
compute x = RADIUS
compute y = 0
call "PDF_lineto" using by value p, x, y
call "PDF_stroke" using by value p
call "PDF_restore" using by value p
*> draw little circle at center
move 0 to x y
compute myRadius = RADIUS/30
call "PDF_circle" using by value p, x, y, myradius
call "PDF_fill" using by value p
call "PDF_restore" using by value p
call "PDF_end_page_ext" using by value p, by content z""
call "PDF_end_document" using by value p, by content z""
call "PDF_delete" using by value p
goback
.
All tests where done here with VC2.3 under RHEL7.2 with pdflib 9.
Regards,
Alain
Hello,
has anybody some experience with the C library pdflib (http://www.pdflib.com/), either version 9 or 7 (the previous free one) under RHEL ?
I have been trying to use them under Centos (=RHEL) 5.9 or 7.2, either 32 bits or 64 bits but encounter problems with "signal 11".
Regards,
Alain
Hello,
This is a follow up to indicate that the problem has been solved.
Passing double precision parameters from Cobol to C can only happen by reference and not by value. The pdflib C API uses by default a transmission by value. Calling directly the API makes the program crash.
I wrote a very simple C "wrapper". Cobol calls a routine with parameters passed by reference, which then calls the corresponding pdflib routine. Most of the time, this is only one line :
/* Set the current point for graphics output. */
void CBLPDF_moveto(PDF *p, double *x, double *y) {
PDF_moveto(p, *x, *y);
}
/* Draw a circle. */
void CBLPDF_circle(PDF *p, double *x, double *y, double *r){
PDF_circle(p, *x, *y, *r);
}
Then from Cobol :
1 x comp-2.
1 y comp-2.
1 radius comp-2.
....
call "CBLPDF_circle" using by value ps, by reference x, y, radius
pdflib can the be used without any problem under Centos 5/7, 32 or 64 bits.
We are able to generate quite complex reports with texts and graphics, sometimes from hundreds of pages.
Regards,