Seite 1 von 2

VecVi - Dokumentenerstellung und -ausgabe mit VectorDrawing

Verfasst: 22.11.2017 18:37
von Andesdaf
Hallo zusammen,

dieses Modul habe ich als Include für ein anderes Projekt begonnen. Dort ist es häufig nötig, Dokumente zu erstellen und als PDF zu speichern bzw. zu drucken. Bisher habe ich dafür PurePDF genutzt und mir noch einen Wrapper mit einigen Funktionen drumherumgebastelt, die mir gefehlt haben. Vor ein paar Wochen war ich dann an dem Punkt angelangt, an dem ich PurePDF nicht mehr so einfach für meine Bedürfnisse anpassen konnte, außerdem wollte ich eine Art Druckvorschau haben und die VectorDrawing Bibliothek mal ausprobieren.

Herausgekommen ist also VecVi (VectorView). Bei der Erstellung und der Arbeitsweise habe ich mich an PurePDF orientiert. Funktionen:
  • einmalige Definition eines Dokuments und dann wahlweise Ausgabe auf CanvasGadget, Image, Window, Drucker, SVG oder PDF
  • Text- und Bildzellen mit variablem Rahmen, Füllung, Textausrichtung, Schriftart etc.
  • horizontale, vertikale und freie Linien
  • Rechtecke, Ellipsen, Ellipsensegmente (für Diagramme) und Bézier-Kurven
  • automatisch eingefügte und wahlweise pro Seite anpassbare Kopf- und Fußbereiche
  • automatische Seitenumbrüche
  • Vermeidung von Seitenumbrüchen innerhalb zusammengehörender Blöcke
  • automatische Seitennummerierung mit freiem Startwert, Ausschluss einzelner Seiten aus der Nummerierung, Ermittlung der Gesamtseitenzahl
  • Anzeige im CanvasGadget wahlweise als Einzelseiten oder mit Scrollmöglichkeit (siehe Beispielcode)
Code: https://raw.githubusercontent.com/hgzh/ ... r/VecVi.pb
Beispiel: https://raw.githubusercontent.com/hgzh/ ... preview.pb

Bild

Schönen Abend noch!

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 22.11.2017 19:45
von ts-soft
:allright: Sehr schön, so was steht schon länger auf meiner Wunschliste :)

Im eigenem Interesse, gutes gelingen bei der Weiterentwicklung,

Thomas

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 23.11.2017 01:30
von Andre
Schaut sehr vielversprechend aus :allright:

Danke für die öffentliche Bereitstellung :D

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 23.11.2017 08:41
von juergenkulow
Hallo Andesdaf,
die Druckvorschau nutzt nur 18% meines Bildschirms aus.
Wie kann man VecVi einfach an die aktuelle Bildschirmauslösung anpassen, hier beim Testsystem 1280x1920 oder im Produktionssystem 2160x3840?

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 23.11.2017 16:50
von Andesdaf
Danke schon mal für die positiven Rückmeldungen!

@juergenkulow:
Das CanvasGadget kannst du ja automatisch an die verfügbaren Abmessungen anpassen.
Mit SetOutputScale() kannst du dein am Anfang gewähltes Seitenformat beliebig
hoch- oder runterskalieren.

Da VecVi mit Millimetern als Einheit arbeitet, müsstest du zuerst die Pixel-Werte des A4-Formats
über den PPI-Wert deines Monitors und dann daraus und den Pixel-Abmessungen deines
Desktops den Skalierungsfaktor berechnen.

Vielleicht füge ich dafür noch eine Funktion hinzu, mal sehen.

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 23.11.2017 17:19
von NicTheQuick
Um aus Auflösung und Displaygröße PPI zu berechnen, hier eine Funktion

Code: Alles auswählen

Procedure.d	gimmePPI(width.i, height.i, inch.d)
	ProcedureReturn Sqr(width * width + height * height) / inch
EndProcedure

; Beispiel Samsung Galaxy S4
Debug gimmePPI(1920, 1080, 5)

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 23.11.2017 22:27
von juergenkulow
Hallo Andesdaf,

ich habe noch eine Frage zur Skalierung:
In der Procedure Main gibt es jetzt einen ZoomFaktor und der ist für die Testumgebung 1200x1920 gut.

Code: Alles auswählen

Procedure main()
  Protected.i i,
           iEvent,
           iMaxPage
  Protected  AnzahlBildschirme=ExamineDesktops() ; JK Neu Anfang
  Protected  GroessterBildschirm=0
  Protected  k=1
  Protected  BildschirmHoehe=DesktopHeight(0)  
  While k<AnzahlBildschirme
    If DesktopHeight(k)>BildschirmHoehe 
      GroessterBildschirm=k
    EndIf
    k+1
  Wend  
  BildschirmHoehe=DesktopHeight(GroessterBildschirm)
  Protected BildschirmBreite=DesktopWidth(GroessterBildschirm) 
  Protected Fenster=OpenWindow(#PB_Any, DesktopX(GroessterBildschirm), DesktopY(GroessterBildschirm),
                               BildschirmBreite, BildschirmHoehe, "VecVi",
                               #PB_Window_BorderLess) ; JK Neu Ende 
  Protected ZoomFaktor=70 ; JK Neu 
  ButtonGadget(1, 5, 5, 100, 25, "Drucken")
  ButtonGadget(2, 110, 5, 50, 25, "<")
  StringGadget(3, 165, 5, 100, 25, "", #PB_String_ReadOnly)
  ButtonGadget(4, 270, 5, 50, 25, ">")
  TextGadget(6, 350, 5, 30, 25, "Zoom:") ; JK Zoom wirkt sich auf die Größe des Ausdrucks aus. 
  ScrollBarGadget(5, 400,  5, 300, 20, 0, 200, 1)
    SetGadgetState(5, 100)
  
  CanvasGadget(0, 0, 35, BildschirmBreite, BildschirmHoehe-50) ; JK Width, Height
  
  createVecVi()
  
  iMaxPage = VecVi::GetRealPageCount(*VecVi)
  i = 1
  SetGadgetText(3, "Seite " + Str(i) + " von " + Str(iMaxPage))
  VecVi::SetOutputScale(*VecVi, GetGadgetState(5) / ZoomFaktor, GetGadgetState(5) / ZoomFaktor) ;JK Neu 
  VecVi::OutputCanvas(*VecVi, 0, i)
  
  Repeat
    iEvent = WaitWindowEvent()
    
    Select iEvent
      Case #PB_Event_Gadget
        Select EventGadget()
          
          Case 1
            If Not PrintRequester()
              Continue
            EndIf
            If StartPrinting("Test")
              VecVi::OutputPrinter(*VecVi)
              StopPrinting()
            EndIf
            
          Case 2
            If i > 1
              i - 1
              SetGadgetText(3, "Seite " + Str(i) + " von " + Str(iMaxPage))
              VecVi::OutputCanvas(*VecVi, 0, i)
            EndIf
          
          Case 4
            If i < iMaxPage
              i + 1
              SetGadgetText(3, "Seite " + Str(i) + " von " + Str(iMaxPage))
              VecVi::OutputCanvas(*VecVi, 0, i)
            EndIf
            
          Case 5
            VecVi::SetOutputScale(*VecVi, GetGadgetState(5) / ZoomFaktor, GetGadgetState(5) / ZoomFaktor) ;JK Zoomfaktor
            VecVi::OutputCanvas(*VecVi, 0, i)
          
        EndSelect
        
    EndSelect
    
  Until iEvent = #PB_Event_CloseWindow
EndProcedure
Allerdings in der 4k Umgebung(2160x3840) müsste der ZoomFaktor um einen Faktor 2 anders gewählt werden, damit der Bildschirm gefüllt wird. Die physikalische Größe der beiden Bildschirme ist in cm fast gleich. Im Ausdruck ist dann nur ein Ausschitt zu sehen, etwa 1/4 des Inhalts.

TOP2
Die Grafik auf der letzten Seite wirkt im Ausdruck in allen Fällen viel kleiner als in der Druckvorschau.

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 24.11.2017 00:48
von Andesdaf
bitte verzeiht mir den nachlässigen Stil und eventuelle Denkfehler, ist schon spät.

So funktioniert es auf meinem 18,4-Zoll-Bildschirm, den Wert musst du anpassen,
genauso ob Höhe oder Breite maßgebend sind bei anderer Ausrichtung von Dokument/Monitor etc.
Benutzt den Code von Nic oben (Danke!)

Code: Alles auswählen

Procedure main()
  Protected.i i,
           iEvent,
           iMaxPage
  Protected  AnzahlBildschirme=ExamineDesktops() ; JK Neu Anfang
  Protected  GroessterBildschirm=0
  Protected  k=1
  Protected  BildschirmHoehe=DesktopHeight(0) 
  While k<AnzahlBildschirme
    If DesktopHeight(k)>BildschirmHoehe
      GroessterBildschirm=k
    EndIf
    k+1
  Wend 
  BildschirmHoehe=DesktopHeight(GroessterBildschirm)
  Protected BildschirmBreite=DesktopWidth(GroessterBildschirm)
  Protected Fenster=OpenWindow(#PB_Any, DesktopX(GroessterBildschirm), DesktopY(GroessterBildschirm),
                               BildschirmBreite, BildschirmHoehe, "VecVi",
                               #PB_Window_BorderLess) ; JK Neu Ende
  Protected.d PPI = gimmePPI(BildschirmBreite, BildschirmHoehe, 18.4)
  
  Protected pxW, pxH, pnW, pnH
  pxW = Val(StringField(VecVi::#FORMAT_A4, 1, ",")) * PPI / 25.4
  pxH = Val(StringField(VecVi::#FORMAT_A4, 2, ",")) * PPI / 25.4
  
  Protected.d Ratio = pxW / pxH
  
  Protected.d Zoom
  
  pnH = BildschirmHoehe
  pnW = pnH * Ratio
  
  Zoom = pnW/pxW
  
  ButtonGadget(1, 5, 5, 100, 25, "Drucken")
  ButtonGadget(2, 110, 5, 50, 25, "<")
  StringGadget(3, 165, 5, 100, 25, "", #PB_String_ReadOnly)
  ButtonGadget(4, 270, 5, 50, 25, ">")
  TextGadget(6, 350, 5, 30, 25, "Zoom:") ; JK Zoom wirkt sich auf die Größe des Ausdrucks aus.
  ScrollBarGadget(5, 400,  5, 300, 20, 0, 200, 1)
    SetGadgetState(5, Zoom * 100)
 
  CanvasGadget(0, 0, 35, BildschirmBreite, BildschirmHoehe-50) ; JK Width, Height
 
  createVecVi()
 
  iMaxPage = VecVi::GetRealPageCount(*VecVi)
  i = 1
  SetGadgetText(3, "Seite " + Str(i) + " von " + Str(iMaxPage))
  VecVi::SetOutputScale(*VecVi, Zoom, Zoom) ;JK Neu
  VecVi::OutputCanvas(*VecVi, 0, i)
 
  Repeat
    iEvent = WaitWindowEvent()
   
    Select iEvent
      Case #PB_Event_Gadget
        Select EventGadget()
         
          Case 1
            If Not PrintRequester()
              Continue
            EndIf
            If StartPrinting("Test")
              VecVi::OutputPrinter(*VecVi)
              StopPrinting()
            EndIf
           
          Case 2
            If i > 1
              i - 1
              SetGadgetText(3, "Seite " + Str(i) + " von " + Str(iMaxPage))
              VecVi::OutputCanvas(*VecVi, 0, i)
            EndIf
         
          Case 4
            If i < iMaxPage
              i + 1
              SetGadgetText(3, "Seite " + Str(i) + " von " + Str(iMaxPage))
              VecVi::OutputCanvas(*VecVi, 0, i)
            EndIf
           
          Case 5
            VecVi::SetOutputScale(*VecVi, GetGadgetState(5) / 100, GetGadgetState(5) / 100) ;JK Zoomfaktor
            VecVi::OutputCanvas(*VecVi, 0, i)
         
        EndSelect
       
    EndSelect
   
  Until iEvent = #PB_Event_CloseWindow
EndProcedure

main()
wenn du vor OutputPrinter() nochmal SetOutputScale(*VecVi, 1, 1) aufrufst, wird auch in Originalgröße
gedruckt.

Zum TOP2: dem Bild bei ImageCell() noch eigene Abmessungen mitgeben, sollte es erstmal beheben. Den
Rest muss ich mir erst in Ruhe anschauen.

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 15.12.2017 18:52
von Andesdaf
Hab eine neue Version (1.02) hochgeladen.

neben einigen Bugfixes gibt es jetzt auch die Möglichkeit, Rechtecke, Ellipsen(-segmente) und Kurven
anzulegen. Außerdem sind gestrichelte, gepunktete Linien/Rahmen etc. und die Verschiebung der gesamten
Seite in X/Y-Richtung möglich. Damit möchte ich demnächst einen vertikalen Seitenlauf und Verschiebung
beim Zoomen im CanvasGadget ermöglichen (so wie in gängigen PDF-Readern).

Edit:

in Version 1.03 ist jetzt Zoomen und Verschieben sowie die fortlaufende Darstellung der Seiten möglich.

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Verfasst: 01.02.2019 19:18
von Andesdaf
Bin seit Langem mal wieder zu einem kleinen Update gekommen. Aktuell ist jetzt v1.06.

Hier mal noch die letzten Änderungen nachgetragen:

Code: Alles auswählen

;   v.1.03 (2017-12-19)
;    - fixed bug with lines and offsets
;    - renamed constants: #ORIENTATION_* to #*
;    - added GetSinglePageOutput() / SetSinglePageOutput()
;    - added GetOutputSize()
;    - added GetRealPageStartOffset()
;    - added GetPageCount()
;    - added piNet support to GetPageWidth() / GetPageHeight()
;    - added GetCanvasOutputResolution()
;   v.1.04 (2018-01-06)
;    - fixed bug with orientations and format
;    - fixed bug with cell vertical/horizontal alignment
;    - fixed bug with cell borders
;    - fixed bugs with page breaks
;    - fixed bugs with total page count calculation
;   v.1.05 (2018-02-25)
;    - added GetFontSize() / SetFontSize()
;    - added GetFontStyle() / SetFontStyle()
;    - added GetTextWidth()
;    - changed internal image handling
;   v.1.06 (2019-01-31)
;    - added CanvasImage output channel
;    - fixed bug with negative x/y position changes
;    - fixed bug in GetPageHeight() using piNet parameter
Für Windows habe ich außerdem eine abgewandelte Version geschrieben, die VecVi
auch per PurePDF ins PDF-Format umwandeln kann. Falls jemand daran Interesse hat,
kann ich das auch noch zur Verfügung stellen.