PureBoard
http://forums.purebasic.com/german/

VecVi - Dokumentenerstellung und -ausgabe mit VectorDrawing
http://forums.purebasic.com/german/viewtopic.php?f=8&t=30474
Seite 1 von 1

Autor:  Andesdaf [ 22.11.2017 18:37 ]
Betreff des Beitrags:  VecVi - Dokumentenerstellung und -ausgabe mit VectorDrawing

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!

Autor:  ts-soft [ 22.11.2017 19:45 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

:allright: Sehr schön, so was steht schon länger auf meiner Wunschliste :)

Im eigenem Interesse, gutes gelingen bei der Weiterentwicklung,

Thomas

Autor:  Andre [ 23.11.2017 01:30 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Schaut sehr vielversprechend aus :allright:

Danke für die öffentliche Bereitstellung :D

Autor:  juergenkulow [ 23.11.2017 08:41 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

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?

Autor:  Andesdaf [ 23.11.2017 16:50 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

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.

Autor:  NicTheQuick [ 23.11.2017 17:19 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Um aus Auflösung und Displaygröße PPI zu berechnen, hier eine Funktion
Code:
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)

Autor:  juergenkulow [ 23.11.2017 22:27 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

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:
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.

Autor:  Andesdaf [ 24.11.2017 00:48 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

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:
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.

Autor:  Andesdaf [ 15.12.2017 18:52 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

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.

Autor:  Andesdaf [ 01.02.2019 19:18 ]
Betreff des Beitrags:  Re: VecVi - Dokumentenerstellung und -ausgabe mit VectorDraw

Bin seit Langem mal wieder zu einem kleinen Update gekommen. Aktuell ist jetzt v1.06.

Hier mal noch die letzten Änderungen nachgetragen:

Code:
;   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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/