[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
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Module] pbPDF-Module

Beitrag von HeX0R »

Wenn man die Header/Footer Prozeduren übergibt, kann man eigentlich davon ausgehen, dass man die auch nutzen möchte.
Von daher würde ich empfehlen die beiden Prozeduren wie folgt abzuändern:

Code: Alles auswählen

Procedure SetFooterProcedure(ID.i, *ProcAddress, *StructAddress=#Null)

  If FindMapElement(PDF(), Str(ID))
    PDF()\Footer\ProcPtr  = *ProcAddress
    PDF()\Footer\StrucPtr = *StructAddress
    PDF()\Footer\Flag     = #True
  EndIf

EndProcedure   

Procedure SetHeaderProcedure(ID.i, *ProcAddress, *StructAddress=#Null)

  If FindMapElement(PDF(), Str(ID))

    PDF()\Header\ProcPtr  = *ProcAddress
    PDF()\Header\StrucPtr = *StructAddress
    PDF()\Header\Flag     = #True
      
  EndIf
  
EndProcedure
Dann kann man sich das doppelt gemoppelte EnableHeader/Footer sparen.
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 »

Das ist in der Tat besser :allright:

Danke fürs drüberschauen.
Wissen schadet nur dem, der es nicht hat !
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: [Module] pbPDF-Module

Beitrag von Lord »

MenschMarkus hat geschrieben: 28.07.2021 12:25 @Lord
So nebenbei bemerkt, gemessen an Deinem hier ausgegebenen Code arbeitest Du mit einer älteren Version, was OK ist. Ich schätze mal die PBI heißt "purePDFModule.pbi".
Nein, ich nutze (immer noch) die PurePDF.pb V2.26 von Normeus.
Diese macht in meinem Programm das, was sie soll. Deshalb werde
ich das auch wohl nicht mehr ändern.
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 »

Ich bin da auf ein neues Problem gestoßen,

leider funktioniert das Footer Margin nicht richtig. Auch wenn ich den Y Versatz angebe, wird der Inhaltstext über die Fußzeile drüber gedruckt.

Hier mal Header und Footer Prozeduren

Code: Alles auswählen

Procedure PDFHeader()
  If PDF::GetPageNumber(#PDFFILE) = 1
    PDF::Image(#PDFFILE,".\Logo.jpg",165,5,36,10)
    PDF::SetFont(#PDFFILE,"Arial","B",14)
    PDF::SetColorRGB(#PDFFILE,PDF::#TextColor,127,127,127)  
    PDF::Cell(#PDFFILE,"Seitentitel",#False,8,#False,PDF::#NextLine,PDF::#CenterAlign,#False,"")
    PDF::Cell(#PDFFILE,"Dokumenten ID: [to be filled] ",#False,8,#False,PDF::#NextLine,PDF::#CenterAlign,#False,"")
  Else
    PDF::Image(#PDFFILE,".\Logo.jpg",165,5,36,10)    
  EndIf
EndProcedure

Procedure PDFFooter()
    PDF::SetFont(#PDFFILE,"Arial","I",8)
    PDF::SetPosY(#PDFFILE,-15)				;wird in der PDF Datei nicht umgesetzt !
    PDF::SetColorRGB(#PDFFILE,0,127,127,127)  
    PDF::Cell(#PDFFILE,"Hier der Text meiner Fußzeile",#False,8,#False,PDF::#NextLine,PDF::#CenterAlign,#False,"")
EndProcedure
Kann das jemand bestätigen?
Wissen schadet nur dem, der es nicht hat !
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: [Module] pbPDF-Module

Beitrag von Andesdaf »

Wie sieht denn dein SetAutoPageBreak()-Aufruf aus?
Win11 x64 | PB 6.00 (x64)
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 »

andesdaf hat geschrieben:Wie sieht denn dein SetAutoPageBreak()-Aufruf aus?

Code: Alles auswählen

PDF::SetAutoPageBreak(#PDFFILE,#True)
Es ist aber egal ob ich #True oder #False setze. Es ändert nichts am Ignorieren des Fußzeilenabstandes. /:->

Edit:
Ich sehe gerade, Beim Autopagebreak muss ich noch einen Margin Wert eingeben. Das war mir neu. OK vielleicht sollte man doch manchmal die Anleitung etwas genauer lesen <) . Der Gedankenanstoß war gut Andesdaf. Danke :allright:
Wissen schadet nur dem, der es nicht hat !
matlab
Beiträge: 5
Registriert: 25.04.2019 15:26

Re: [Module] pbPDF-Module

Beitrag von matlab »

Liebe Alle, ein wenig verzweifelt versuche ich unter Nutzung des tollen pdPDF-Module von Thorsten1867 Unicode-Schriften in das PDF einzubinden, um in der Ausgabe z.B. auch den kyrillische Zeichensatz (U+0400 bis U+04FF) - auch in italic und bold - nutzen zu können.

Ich habe es mit den Standardfonts (z.B. Arial) versucht, jedoch auch mit anderen True-Type-Fonts, die laut dp4fontviewer32 Unicode unterstützen und Glyphen für Kyrillisch beinhalten. Das Beispiel von Thorsten1867 funktioniert, jedoch gibt es für diesen Font keine Schnitte in italic oder bold. Folgende Probleme stellen sich regelmäßig ein:

1. Vor jeden String wird ein kleines Viereck oder schwarzes Viereck mit einem weißen Kreuz gesetzt und

2. zumindest der Adobe Acrobat Pro (bei anderen Viewern - z.B. SumatraPDF - ist das nicht so) gibt folgende Meldung aus: "In der Schrift [hier der Schriftname] ist der Wert für /Flags fehlerhaft"

Bild

Bild

3. Als Nebeneffekt ist mir noch aufgefallen, dass PDF::Bookmark nicht Unicode unterstützt (oder ich weiß nicht, wie). Hier werden die kyrillischen Zeichen als Fragezeichen ausgegeben.

Hier ein Beispielprogramm (font ArialMT (arial.ttf und Schnitte )sowie das Beispielprogramm in den Ordner Examples von pbPDF-Module kopieren)

Ich würde mich freuen, wenn jemand hierzu eine Idee hätte. Mir fällt jedenfalls nichts mehr ein. Danke!

Code: Alles auswählen

XIncludeFile "..\pbPDFModule.pbi"

Define.s Path2Font=""
Define.s Font="ArialMT-"
Define.s File=Font+"pbPDF-EmbedFont.pdf"
Define.s String=" <- "
Define.i i

For i=$0400 To $0410 ;testweise ein paar kyrillische Zeichen
  String=String+Chr(i)
Next i

#PDF = 1

If PDF::Create(#PDF)
  
  PDF::AddPage(#PDF)
   
  Debug PDF::EmbedFont(#PDF, Path2Font+"arial.ttf", "ArialMT", "", PDF::#Unicode)
  Debug PDF::EmbedFont(#PDF, Path2Font+"ariali.ttf", "ArialMT", "I", PDF::#Unicode)
  Debug PDF::EmbedFont(#PDF, Path2Font+"arialbd.ttf", "ArialMT", "B", PDF::#Unicode)
  Debug PDF::EmbedFont(#PDF, Path2Font+"arialbi.ttf", "ArialMT", "BI", PDF::#Unicode) 
  
  PDF::SetFont(#PDF,"ArialMT", "", 14)
  PDF::PlaceText(#PDF,Font+"Regular"+String, 10, 20) 
  PDF::SetFont(#PDF, "ArialMT", "I", 14)
  PDF::PlaceText(#PDF, Font+"Italic"+String, 10, 30)
  PDF::SetFont(#PDF, "ArialMT", "B", 14)
  PDF::PlaceText(#PDF, Font+"Bold"+string, 10, 40)
  PDF::SetFont(#PDF, "ArialMT", "BI", 14)
  PDF::PlaceText(#PDF, Font+"BoldItalic"+String, 10, 50)
  
  PDF::BookMark(#PDF, "Bookmark"+string, 0, #PB_Default, #PB_Default)
   
  PDF::Close(#PDF, File)
  
EndIf

RunProgram(File)
/code]
matlab
Beiträge: 5
Registriert: 25.04.2019 15:26

Re: [Module] pbPDF-Module

Beitrag von matlab »

Leider gab es ja für mein oben geschildertes Problem bisher keine grundsätzliche Lösung, jedoch habe ich - letztlich durch Testen verschiedener Fonts - einen Font mit mehreren Schnitten gefunden, der zumindest für mich funktioniert.

PT Sans in der Version 2.005 von Paratype (frei auf paratype.com verfügbar) stellt die Unicodezeichen ohne vorangestelltes Quadrat/Kreuz dar. Der Fehler mit dem Hinweis auf fehlerhafte Eintrage bei "/Flags" beim Aufruf mit Adobe-Viewern stört mich nicht, da er in dem von mir genutzten Viewer (SumatraPDF mit Kommandozeilenoptionen) nicht auftritt und sich so die erstellten Dokumente ohne Fehlermeldung ausdrucken lassen.
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 »

Habe mich situationsbedingt noch einmal intensiver mit dem PDF Modul beschäftig und mich um das Schriftenproblem gekümmert.( siehe hier ).
Mittlerweile bin ich auch dahinter gekommen warum ich keine Schriften einbetten konnte bzw diese nicht verwendet wurden.
Das Problem lag schlicht und ergreifend daran, dass das Einlesen des TTF Fonts fehlgeschlagen ist, da das System bzw. eine App die Datei bereits in Beschlag genommen hat. Um dieses Problem zu lösen habe ich eine kleine Ergänzung im Modul Source Code vorgenommen.
In der Procedure FileHeaderTTF_() wird zu Beginn das Font File mit ReadFile() geöffnet.
Hier wäre das

Code: Alles auswählen

    If ReadFile(#File, FileName)
durch ein

Code: Alles auswählen

    If ReadFile(#File, FileName,#PB_File_SharedRead)
zu ersetzen und so wäre zumindest dieses Problem schon einmal gelöst.
Das Font wird korrekt eingebettet und die im Font eingebetteten nicht lateinischen Schriftzeichen werden jetzt korrekt dargestellt.
Wissen schadet nur dem, der es nicht hat !
Antworten