LINUX.ORG.RU

pdf с полями ввода из tcl/tk

 , ,


1

2

Из программы на tcl/tk генерируется отчёт с текстом и картинками, затем экспортируется в pdf через библиотеку pdf4tcl (https://pdf4tcl.sourceforge.net/)

Облом когда понадобилось добавить поля ввода в pdf

pdf4tcl умеет добавлять такие поля (метод addForm), но система координат не совпадает

Хочется чтобы поля ввода были справа от Label1 и Label2

Кто виноват и что делать?

Минимальный тестовый фрагмент

#!/usr/bin/wish 

lappend auto_path [file join lib pdf4tcl094]
package require pdf4tcl

    set height 800
    set width  800

    canvas .canv -width $width -height $height 
    pack   .canv

    button .savePDF -text "save" -command savepdf
    pack .savePDF

	set font1 [font create -family Helvetica -size 10]

  .canv create text 0  0 -text "__________________________________________________________________________________________" -anchor w  -font $font1
  .canv create text 31  32 -text "Label 1 :" -anchor w -tag addform -font $font1
  .canv create text 90 450 -text "Label 2 :" -anchor w -tag addform -font $font1

proc savepdf {} {
    set fname {output.pdf}

    pdf4tcl::new mypdf -paper a4 -margin 15mm -compress 0

    mypdf startPage
    mypdf setFont 10 Helvetica
    mypdf canvas .canv
    foreach item [.canv find withtag addform] {
        set x [lindex [.canv bbox $item] 2]
        set y [lindex [.canv bbox $item] 3]
        puts "debug (x,y): $x,$y"
        mypdf addForm text [expr $x+20] $y 100 20 -init 0
    }
    mypdf write -file $fname
    mypdf destroy        

    exit 0
}

Вот полученный pdf

%PDF-1.4
5 0 obj
<<
/Length 6 0 R
>>
stream
/Helvetica 10 Tf
0 Tr
10 TL
q
1 w
[] 0 d
0 0 0 rg
0 0 0 RG
0 J
0 j
10.433 M
0.706317 0 0 -0.706317 43.226 793.83 cm
-1 -8 m
-1 459 l
721 459 l
721 -8 l
W
n
q
0 0 0 rg
BT
/Helvetica 17 Tf
0 Tr
17 TL
/Helvetica 14.388 Tf
0 Tr
14.388 TL
1 0 0 -1 0 4.079 Tm
(__________________________________________________________________________________________) Tj
ET
Q
q
0 0 0 rg
BT
/Helvetica 17 Tf
0 Tr
17 TL
/Helvetica 14.338 Tf
0 Tr
14.338 TL
1 0 0 -1 31 36.061 Tm
(Label 1 :) Tj
ET
Q
q
0 0 0 rg
BT
/Helvetica 17 Tf
0 Tr
17 TL
/Helvetica 14.338 Tf
0 Tr
14.338 TL
1 0 0 -1 90 454.061 Tm
(Label 2 :) Tj
ET
Q
Q

endstream
endobj

6 0 obj
599
endobj

4 0 obj
<</Type /Page
/Parent 2 0 R
/Resources 3 0 R
/Group <</S /Transparency /CS /DeviceRGB /I false /K false>>
/MediaBox [0 0 595 842]
/Contents [5 0 R]
/Annots [9 0 R
11 0 R]
>>
endobj

7 0 obj
<<
/Type /Font
/Subtype /Type1
/Encoding /WinAnsiEncoding
/Name /Helvetica
/BaseFont /Helvetica
>>
endobj
8 0 obj
<< /BBox [ 0 0 100 20] 
/Resources 3 0 R
/Subtype /Form
/Type /XObject

/Length 54
>>
stream
/Tx BMC BT /Helvetica 10 Tf 0 g 2 1.1 Td (0) Tj ET EMC
endstream
endobj
9 0 obj
<<
  /Subtype /Widget
  /P 4 0 R
  /Rect [149.52 738.48 249.52 758.48]
  /FT /Tx
  /T (textform8)
  /DA (/Helvetica 10 Tf 0 g)
  /Q 0
  /V (0)
  /AP << /N 8 0 R >>
  /F 4
>>

endobj
10 0 obj
<< /BBox [ 0 0 100 20] 
/Resources 3 0 R
/Subtype /Form
/Type /XObject

/Length 54
>>
stream
/Tx BMC BT /Helvetica 10 Tf 0 g 2 1.1 Td (0) Tj ET EMC
endstream
endobj
11 0 obj
<<
  /Subtype /Widget
  /P 4 0 R
  /Rect [208.52 320.48 308.52 340.48]
  /FT /Tx
  /T (textform10)
  /DA (/Helvetica 10 Tf 0 g)
  /Q 0
  /V (0)
  /AP << /N 10 0 R >>
  /F 4
>>

endobj
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/AcroForm 12 0 R
>>
endobj

2 0 obj
<<
/Type /Pages
/Count 1
/Kids [4 0 R ]
>>
endobj

3 0 obj
<<
/ProcSet[/PDF /Text /ImageC]
/Font <<
/Helvetica 7 0 R
>>
>>
endobj

12 0 obj
<<
/Fields [9 0 R
11 0 R]
/DR 3 0 R
>>
endobj

xref
0 13
0000000000 65535 f 
0000001720 00000 n 
0000001787 00000 n 
0000001846 00000 n 
0000000686 00000 n 
0000000014 00000 n 
0000000666 00000 n 
0000000876 00000 n 
0000000990 00000 n 
0000001163 00000 n 
0000001353 00000 n 
0000001527 00000 n 
0000001926 00000 n 
trailer
<<
/Size 13
/Root 1 0 R
>>

startxref
1982
%%EOF
★★★★★
Ответ на: комментарий от futurama

pdf4tcl

Без понятия. Я даже библиотеки такой не знаю. Более того, я не такой спец по тиклю, как может показаться. Так что увы, но не смогу помочь :(

но система координат не совпадает

Как вариант, можешь попробовать закостылить смещение как-нибудь.

u5er ★★★
()

посмотрел, даже покрутил :-)

сдаётся что одно из двух:

- почти точно, что у координат надо указывать юниты (mm,px,..)

- или врукопашную: у canvas dpi один, у pdf другой. И надо координаты тупо домножить на их отношение

MKuznetsov ★★★★★
()

С тиклем не сталкивался, но на всякий случай напомню, что в постскрипте основной единицей размерности является desktop publishing point (DTP), составляющая 1/72 дюйма. Пиксель же — величина плавающая, но при стандартном экранном разрешении в 96dpi — это, очевидно, 1/96.

Первое что я бы попробовал — подомножать координаты на 0.75.

Quote
()
Ответ на: комментарий от MKuznetsov

- почти точно, что у координат надо указывать юниты (mm,px,..)

и чтобы совсем было хорошо и правильно, в канве координаты объектов тоже задавать в дюймах,инчах,миллиметрах.

Выше верно заметили - не в пикселях

MKuznetsov ★★★★★
()

Поигрался, очевидного соотношения между единицами измерения в canvas и pdf не обнаружил (возможно, дело еще и в том, что у меня монитор с HighDPI, а с ним у Tcl/Tk 8.6 все не очень хорошо). Как workaround раздели высоту canvas на высоту ее образа в PDF, получишь коэффициент:

#!/usr/bin/wish 

lappend auto_path [file join lib pdf4tcl094]
package require pdf4tcl

set height 800
set width  800

canvas .canv -width $width -height $height 
pack   .canv

button .savePDF -text "save" -command savepdf
pack .savePDF

set font1 [font create -family Helvetica -size 10]

.canv create text 0  0 -text "__________________________________________________________________________________________" -anchor w  -font $font1
.canv create text 31  32 -text "Label 1 :" -anchor w -tag addform -font $font1
.canv create text 90 450 -text "Label 2 :" -anchor w -tag addform -font $font1

proc savepdf {} {
    set fname {output.pdf}

    pdf4tcl::new mypdf -paper a4 -margin 15mm -compress 0

    mypdf startPage
    mypdf setFont 10 Helvetica
    lassign [.canv bbox all] _ y01 _ y02
    lassign [mypdf canvas .canv] x1 y1 _ y2
    set scale [expr {($y02 - $y01) / ($y2 - $y1)}]
    foreach item [.canv find withtag addform] {
        set x [lindex [.canv bbox $item] 2]
        set y [lindex [.canv bbox $item] 3]
        puts "debug [.canv itemcget $item -text] (x,y): $x,$y"
        mypdf addForm text [expr {$x1 + $x/$scale + 20}] [expr {$y1 + $y/$scale - 20}] 100 20 -init $y
    }
    mypdf write -file $fname
    mypdf destroy        

    exit 0
}
TeopeTuK ★★★★★
()