[Module] pbPDF-Module

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.
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von Thorsten1867 »

Bugfix: PNG-Bilder einbetten
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von ThoPie »

Hallo zusammen,

ich nutze dieses Modul in meinem Projekt. Alles funktioniert - bis auf den automatischen Seitenumbruch. Es wird nur eine Seite erzeugt und der Text "fließt" unten raus.
Mein Code sieht wie folgt aus

Code: Alles auswählen

PDF::Create(#filPDF)
  PDF::SetHeaderProcedure(#filPDF,@Listenkopf())
  PDF::SetFooterProcedure(#filPDF,@Listenfuss())
  PDF::EnableHeader(#filPDF)
  PDF::EnableFooter(#filPDF)
  PDF::SetOpenAction(#filPDF)
  PDF::SetInfo(#filPDF,PDF::#Title,Listentitel)
  PDF::SetInfo(#filPDF,PDF::#Author,#PN+" "+#PV)
  PDF::SetPageMargins(#filPDF,20,10,10)
  PDF::SetAutoPageBreak(#filPDF,#True)
  PDF::AddPage(#filPDF)
Was mache ich da falsch? Vielen Dank.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von Thorsten1867 »

Bugfix: AutoPageBreak
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von ThoPie »

Hallo,
vielen Dank für den BugFix.
Leider brachte es bei mir keine Besserung.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von Thorsten1867 »

Ich habe ein Beispiel eingefügt (Seite 4-5) und es noch mal hochgeladen.
(Bei letztem Update sollte 26.6.2019 stehen.)
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von ThoPie »

Hallo nochmal,
also bei deinem Beispiel funktioniert der automatische Seitenumbruch. Aber bei meinem Beispiel will das nicht. So sieht mein Testcode aus. Was mache ich da falsch?

Code: Alles auswählen

Enumeration
  #filPDF  
EndEnumeration

Procedure PDFTest()
  PDF::Create(#filPDF)
  PDF::SetAliasTotalPages(#filPDF,"{tp}")
;   PDF::EnableHeader(#filPDF)
;   PDF::EnableFooter(#filPDF)
;   PDF::SetHeaderProcedure(#filPDF,@Listenkopf())
;   PDF::SetFooterProcedure(#filPDF,@Listenfuss())
  PDF::SetInfo(#filPDF,PDF::#Titel,"Titel")
  PDF::SetInfo(#filPDF,PDF::#Author,"Autor")
  PDF::SetPageMargins(#filPDF,20,10,10)
  PDF::SetPageNumbering(#filPDF,#True)
  PDF::AddPage(#filPDF)
  PDF::SetAutoPageBreak(#filPDF,#True) 
  PDF::SetFont(#filPDF,"Arial","",9)
  For i=0 To 100
    i+1
    PDF::Cell(#filPDF,Str(i),8,5,#False,#False,"R")
    PDF::Cell(#filPDF,"",3)
    PDF::Cell(#filPDF,"10000",20,5,0,0,"R")
    PDF::Cell(#filPDF,"Schmidt, Anton",50,5)
    PDF::Cell(#filPDF,"Teststraße 12",0,5,#False,PDF::#NextLine)
    PDF::Cell(#filPDF,"",81)
    PDF::Cell(#filPDF,"11111",15,5)
    PDF::Cell(#filPDF,"Testhausen",0,5,#False,PDF::#NextLine)
  Next
  PDF::Save(#filPDF,"C:\1\Test.pdf")
  RunProgram(#DQUOTE$+"C:\1\Test.pdf"+#DQUOTE$,"","")
EndProcedure

PDFTest()
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von Thorsten1867 »

Bugfix: Preferences for footer (AutoPageBreak)
Bugfix: AddPage (Fonts)
Zuletzt geändert von Thorsten1867 am 27.06.2019 10:28, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
ThoPie
Beiträge: 130
Registriert: 19.05.2006 15:18
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von ThoPie »

Und wieder mal ich.
Jetzt werden zwar die Seiten angelegt, aber sobald Header und Footer im Spiel sind sind die Seiten ab Seite 2 leer und es erscheint in PDF-Fehler.
Sind Header und Footer nicht drin, funktioniert es. Da ist dann die Schriftart und -größe ab Seite 2 allerdings dann auf "Standard" und nicht wie auf Seite 1.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von Thorsten1867 »

ThoPie hat geschrieben:Sind Header und Footer nicht drin, funktioniert es. Da ist dann die Schriftart und -größe ab Seite 2 allerdings dann auf "Standard" und nicht wie auf Seite 1.

Code: Alles auswählen

IncludeFile "pbPDFModule.pbi"

Enumeration 1
  #filPDF  
EndEnumeration

Procedure Listenkopf()
  
EndProcedure

Procedure Listenfuss()
  PDF::SetPosY(#filPDF, -15)
  PDF::SetFont(#filPDF, "Arial", "BI", 9)
  PDF::Cell(#filPDF, "Page {p} / {tp}", #PB_Default, 10, 0, 0, PDF::#CenterAlign)
EndProcedure

Procedure PDFTest()
  PDF::Create(#filPDF)
  
  PDF::SetHeaderProcedure(#filPDF, @Listenkopf())
  PDF::SetFooterProcedure(#filPDF, @Listenfuss()) ; muss definiert werden, bevor der Footer aktiviert wird!
  PDF::SetAliasTotalPages(#filPDF,"{tp}")
  
  PDF::EnableHeader(#filPDF)
  PDF::EnableFooter(#filPDF)
  PDF::SetInfo(#filPDF,PDF::#Titel,"Titel")
  PDF::SetInfo(#filPDF,PDF::#Author,"Autor")
  PDF::SetPageMargins(#filPDF,20,10,10)
  PDF::SetPageNumbering(#filPDF,#True)
  PDF::AddPage(#filPDF)
  PDF::SetAutoPageBreak(#filPDF, #True, 20) 
  PDF::SetFont(#filPDF,"Arial","",9)
  For i=0 To 100
    i+1
    PDF::Cell(#filPDF,Str(i),8,5,#False,#False,"R")
    PDF::Cell(#filPDF,"",3)
    PDF::Cell(#filPDF,"10000",20,5,0,0,"R")
    PDF::Cell(#filPDF,"Schmidt, Anton",50,5)
    PDF::Cell(#filPDF,"Teststraße 12",0,5,#False,PDF::#NextLine)
    PDF::Cell(#filPDF,"",81)
    PDF::Cell(#filPDF,"11111",15,5)
    PDF::Cell(#filPDF,"Testhausen",0,5,#False,PDF::#NextLine)
  Next
  PDF::Save(#filPDF,"Test.pdf")
  RunProgram(#DQUOTE$+"Test.pdf"+#DQUOTE$,"","")
EndProcedure

PDFTest()
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: [Module] pbPDF-Module

Beitrag von MenschMarkus »

Sorry für die Störung

ich verwende Deinen Code wie folgt:

Code: Alles auswählen

XIncludeFile "pbPDFModule.pbi"

#PDFFile = 1

Procedure   PDFFooter_Module()
  PDF::SetPosY(#PDFFile,-15)
  PDF::SetFont(#PDFFile,"Arial","I",9)
  PDF::Cell(#PDFFile,"Seite  {p} / {tp}",#PB_Default,10,0,0,PDF::#CenterAlign)
  PDF::Ln(#PDFFile,6)
  PDF::SetFont(#PDFFile,"Helvetica","I",4)
  PDF::Cell(#PDFFile,"( © <Name> 2019 )  <Complete footer information> ",#PB_Default,10,0,0,PDF::#CenterAlign)
EndProcedure

; Procedure   pdfHeader_Module()
;   PDF::SETFont(#PDFFile,"Arial","",10)  
;   PDF::Image(#PDFFile,"D:\......\ZSPDF.jpg",5,5,56,16)
; EndProcedure


Procedure runPDF()
  Protected i.i
  PDF::SETFont(#PDFFile,"Arial","",10)  
  ;PDF::HeaderProcedure(@pdfHeader_Module())
  PDF::FooterProcedure(@PDFFooter_Module())
  PDF::Create(#PDFFile,"P")
  PDF::SetAliasTotalPages(#PDFFile,"{tp}")
  ;PDF::EnableHeader(#PDFFile,#True)
  PDF::EnableFooter(#PDFFile,#True)
  PDF::SetPageNumbering(#PDFFile,#True)
  PDF::AddPage(#PDFFile)
  PDF::SetPosX(#PDFFile,10)
  For i = 33 To 1000
    PDF::Cell(#PDFFile,Chr(i),PDF::GetStringWidth(#PDFFile,Chr(i)),5,0,0,PDF::#LeftAlign)   ;Problemzeile
    If PDF::GetPosX(#PDFFile) > (PDF::GetPageWidth(#PDFFile) - 20)    ;Zeilenumbruch am rechten Rand
      PDF::Ln(#PDFFile,5)
      PDF::SetPosX(#PDFFile,10)
    EndIf
  Next
  PDF::AddPage(#PDFFile)
  PDF::Close(#PDFFile,"Savepdftest.pdf")
  PDF::Save(#PDFFile,"Savepdftest.pdf")
  RunProgram("Savepdftest.pdf")
EndProcedure

runPDF()
Bei Aufruf der Problemzeile erhalte ich die Meldung:

Die MAP hat kein aktuelles Element in folgender Procedure aus Deiner pbi

Code: Alles auswählen

 Procedure.d GetStringWidth_(String.s, Scale.i=#True)
    Define i.i, Width.i, Char.s, vReturn.d

    For i = 1 To Len(String)
      
      Char = Mid(String, i, 1)
      If Asc(Char) > 255
        Width + 600 ; for Unicode characters
      Else
        Width + PDF()\Fonts()\CharWidth(Char)                     ;<<<   Fehler erscheint bei Aufruf dieser Zeile (CodeZeile 1531)
      EndIf
      
    Next
    
    If Scale
      ProcedureReturn (Width * PDF()\Font\Size) / 1000
    Else
      ProcedureReturn Width
    EndIf

  EndProcedure   
  
Erstaunlich ist, der Fehler tritt nur auf, wenn die den Header, so wie oben angezeigt, auskommentiere. Nehme ich den Header wieder dazu, funktioniert der Code ohne Probleme.
(Compiliert mit PB 5.70)

Mache ich da was falsch ?
Wissen schadet nur dem, der es nicht hat !
Antworten