VecVi - Dokumentenerstellung und -ausgabe mit VectorDrawing

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

VecVi - Dokumentenerstellung und -ausgabe mit VectorDrawing

Beitrag 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 (Linux) oder PDF (nicht Windows)
  • 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)
Das Ganze ist ein Anfang, sicher noch nicht fertig und auch nicht komplett durchgetestet, aber
meiner Meinung nach grundsätzlich schon einsetzbar.
Wer möchte, kann ja mal einen Blick drauf werfen. Die direkte Ausgabe als PDF und SVG kann ich
als Windowsnutzer leider nicht testen. Ich hoffe, das kommt irgendwann noch!

Code: https://raw.githubusercontent.com/hgzh/ ... r/VecVi.pb
Beispiel: https://raw.githubusercontent.com/hgzh/ ... preview.pb

Bild

Schönen Abend noch!
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag von Andre »

Schaut sehr vielversprechend aus :allright:

Danke für die öffentliche Bereitstellung :D
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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?
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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)
Bild
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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.
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Antworten