PurePDF - Probleme mit MultiCell()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

PurePDF - Probleme mit MultiCell()

Beitrag von Thorsten1867 »

Bei der Verwendung von MultiCell() tritt bei mir ein seltsames Phänomen auf.
Die erzeugten PDFs schauen ganz normal aus, aber wenn man diese dann ausdruckt, werden die Zeilenumbrüche mitgedruckt (Kästchen für unbekanntes Zeichen).
In der ersten Zeile wird ein Chr13 und ein Chr10 gedruckt und in den folgenden Zeilen nur noch ein Chr13.
Wenn ich jetzt aus meinen Text alle Chr13 entferne, wird trotzdem immer noch in der ersten Zeile der Zeilenumbruch (Chr10) in Form eines Kästchens mitgedruckt.

Ich vermute mal, das hier ein Bug vorliegt.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: PurePDF - Probleme mit MultiCell()

Beitrag von Häns »

Hallo Thorsten,

ich gehe davon aus, dass Du die aktuelle Version 2.19 nimmst. In meinen Projekten hatte ich das Problem mal gehabt. Es lag aber an der alten Version und trat nur beim bestimmten Schrifttyp auf.

Kannst Du uns einen Beispielcode geben?

Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: PurePDF - Probleme mit MultiCell()

Beitrag von Thorsten1867 »

Ich habe versucht die Procedure etwas zu kürzen, da diese recht komplex ist.

Code: Alles auswählen

Procedure.b PDF_Beobachtungen(Sid.l)
  
  ;{ ========== StartPDFDoc ==========
  pdf_Create("P", "mm", #PDF_PAGE_FORMAT_A4)
  ; pdf_SetProcHeader(@PDF_SchuelerHeader())
  pdf_SetDisplayMode(#PDF_ZOOM_FULLWIDTH)
  pdf_SetTitle("Beobachtungen")
  pdf_SetSubject("Beobachtungen zu dem Schüler") 
  pdf_SetAuthor("KvGS - (c) Thorsten Hoeppner")
  pdf_SetTopMargin(15)  
  pdf_SetLeftMargin(25)  
  pdf_SetRightMargin(15)  
  pdf_SetAutoPageBreak(1,20) 
  pdf_SetFillColor(200)
  ;} ============================== 
  
  If OpenDatabaseSQLite(#DBKlasse, KLDaten\dbfile) ; Datenbank öffnen
    ;{ --- Schülername auslesen ---
    If DatabaseTableQuery(#DBKlasse, "SELECT vname, name FROM schueler WHERE sid = "+Str(Sid)+";")
      If FirstDatabaseRow(#DBKlasse)
        SchuelerName = GetDatabaseString(#DBKlasse, 0) + " " + GetDatabaseString(#DBKlasse, 1)
      EndIf
      FinishDatabaseQuery(#DBKlasse)
    EndIf ;}
    pdf_AddPage()
    pdf_Ln(3)
    If DatabaseTableQuery(#DBKlasse, "SELECT datum, titel, bem, wert, fid FROM beobachtung WHERE sid = "+Str(Sid)+" ORDER BY datum DESC;")
      Row = 0
      pdf_SetFont("Arial", "B", 12) : pdf_Cell(170, 5.6, "Beobachtungen", 1, 1, #PDF_ALIGN_CENTER, 1)
      While NextDatabaseRow(#DBKlasse)
        pdf_SetFont("Arial", "B", 8)
        pdf_Cell(18, 4.6, Datum(GetDatabaseString(#DBKlasse, 0))+" ", 1, 0, #PDF_ALIGN_RIGHT) ; Datum
        pdf_Cell(115, 4.6, " "+GetDatabaseString(#DBKlasse, 1), 1, 0, #PDF_ALIGN_LEFT) ; Titel
        ; pdf_Cell(37, 4.6, Fach(GetDatabaseLong(#DBKlasse, 4), #AF_name), 1, 1, #PDF_ALIGN_CENTER)
        pdf_SetFont("Arial", "", 8)
        ; ==== Hier tritt das Problem auf ====
        Text$ = GetDatabaseString(#DBKlasse, 2)
        If Trim(Text$)
          pdf_MultiCell(170, 4.4, Text$ , 1)
        EndIf
        ; ====================================
      Wend
      FinishDatabaseQuery(#DBKlasse)
      pdf_Ln(3)
    EndIf
    CloseDatabase(#DBKlasse)
  EndIf
  ; ========== EndPDFDoc ==========
  pdf_Save(KvGS\dir+"ausgabe.pdf") 
  ; ==============================
EndProcedure
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Re: PurePDF - Probleme mit MultiCell()

Beitrag von Häns »

Hallo Thorsten,

ich musste deine Procedure etwas umschreiben, damit ich sie bei mir direkt nachvollziehen konnte:

Code: Alles auswählen

  ;{ ========== StartPDFDoc ==========
  pdf_Create("L", "mm", #PDF_PAGE_FORMAT_A4)
  ; pdf_SetProcHeader(@PDF_SchuelerHeader())
  pdf_SetDisplayMode(#PDF_ZOOM_FULLWIDTH)
  pdf_SetTitle("Beobachtungen")
  pdf_SetSubject("Beobachtungen zu dem Schüler")
  pdf_SetAuthor("KvGS - (c) Thorsten Hoeppner")
  pdf_SetTopMargin(15)
  pdf_SetLeftMargin(25)
  pdf_SetRightMargin(15)
  pdf_SetAutoPageBreak(1, 20)
  pdf_SetFillColor(200)
  ;} ==============================

  ;   If OpenDatabaseSQLite(#DBKlasse, KLDaten\dbfile) ; Datenbank öffnen
  ;     ;{ --- Schülername auslesen ---
  ;     If DatabaseTableQuery(#DBKlasse, "SELECT vname, name FROM schueler WHERE sid = "+Str(Sid)+";")
  ;       If FirstDatabaseRow(#DBKlasse)
  ;         SchuelerName = GetDatabaseString(#DBKlasse, 0) + " " + GetDatabaseString(#DBKlasse, 1)
  ;       EndIf
  ;       FinishDatabaseQuery(#DBKlasse)
  ;     EndIf ;}
  pdf_AddPage()
  pdf_Ln(3)
  ;     If DatabaseTableQuery(#DBKlasse, "SELECT datum, titel, bem, wert, fid FROM beobachtung WHERE sid = "+Str(Sid)+" ORDER BY datum DESC;")
  Row = 0
  pdf_SetFont("Arial", "B", 12) : pdf_Cell(170, 5.6, "Beobachtungen", 1, 1, #PDF_ALIGN_CENTER, 1)
  ;       While NextDatabaseRow(#DBKlasse)
  For i = 1 To 10
    pdf_SetFont("Arial", "B", 8)
    ;         pdf_Cell(18, 4.6, Datum(GetDatabaseString(#DBKlasse, 0))+" ", 1, 0, #PDF_ALIGN_RIGHT) ; Datum
    pdf_Cell(18, 4.6, FormatDate("%dd.%mm.%yy", Date()) + " ", 1, 0, #PDF_ALIGN_RIGHT) ; Datum

    ;         pdf_Cell(115, 4.6, " "+GetDatabaseString(#DBKlasse, 1), 1, 0, #PDF_ALIGN_LEFT) ; Titel
    pdf_Cell(115, 4.6, " " + Str(i), 1, 0, #PDF_ALIGN_LEFT) ; Titel
    ; pdf_Cell(37, 4.6, Fach(GetDatabaseLong(#DBKlasse, 4), #AF_name), 1, 1, #PDF_ALIGN_CENTER)
    pdf_SetFont("Arial", "", 8)
    ; ==== Hier tritt das Problem auf ====
    ;         Text$ = GetDatabaseString(#DBKlasse, 2)
    Text$ = "   Test   " + #CRLF$  ; <--  ABSICHT!!
    If Trim(Text$)
      pdf_MultiCell(170, 4.4, Text$, 1)
    EndIf
    ; ====================================
    ;       Wend
    ;       FinishDatabaseQuery(#DBKlasse)

    pdf_Ln(3)
  Next
  ;     EndIf
  ;     CloseDatabase(#DBKlasse)
  ;   EndIf
  ; ========== EndPDFDoc ==========
  ;   pdf_Save(KvGS\dir+"ausgabe.pdf")

  If pdf_GetErrorCode() > -1
    pdf_Save("ausgabe.pdf")
  Else
    MessageRequester("Fehler PDF", "Das Erstellen einer PDF-Datei konnte nicht ausgeführt werden!" + #CRLF$ + #CRLF$ + pdf_GetErrorMessage())
  EndIf

  If RunProgram ("ausgabe.pdf")
  Else
    MessageRequester("Fehler!", "Der Ausdruck war nicht erfolgreich!", #MB_ICONWARNING)
  EndIf

  ; ==============================

Bei der Ausgabe habe ich keinen Fehler entdeckt. Ich vermute eher, dass das Problem der Darstellung im PDF-Browser steckt (ich benutze PDF-Creator).
Hast Du mal mit einem anderen Browser ausprobiert?

Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: PurePDF - Probleme mit MultiCell()

Beitrag von Thorsten1867 »

Mit dem Acrobat Reader X funktioniert es.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Re: PurePDF - Probleme mit MultiCell()

Beitrag von ABBKlaus »

Hallo Thorsten,

ich habe mal in die PDF-Refenz geschaut und es hat sich herausgestellt, daß PurePDF die Escape-Sequenzen spezifikationsgetreu umsetzt. Seite 15 (23/756) PDF32000_2008.pdf)

Code: Alles auswählen

pdf_MultiCell(170, 4.4, "Zeilenumbruch"+#CRLF$+"Neue Zeile", 1)
Ich kann natürlich als workaround die Funktion ipf_Cell() so modifizieren, daß die letzten beiden Zeichen (wenn CR oder LF) entfernt werden.

Code: Alles auswählen

Procedure ipf_Cell(w.f,h.f=0,Text$="",Border.w=0,Ln.f=0,Align$="",Fill.f=0,Link.w=0)
  ;Output a cell
  Protected l_k.f
  Protected l_x.f
  Protected l_y.f
  Protected l_ws.f
  Protected l_s.s
  Protected l_op.s
  Protected l_dx.f, wmax.f, wlink.f
  Protected l_txt.s
  Protected TextLen.f
  Protected eText$
  
  If Right(Text$,1)=Chr(10)
    Text$=Mid(Text$,1,Len(Text$)-1)
  EndIf
  If Right(Text$,1)=Chr(13)
    Text$=Mid(Text$,1,Len(Text$)-1)
  EndIf
Aber ich empfehle dir natürlich, und auch weil es einfacher ist, die unnötigen Zeichen selber herauszufiltern.

Gruss Klaus
Zuletzt geändert von ABBKlaus am 18.02.2011 18:01, insgesamt 1-mal geändert.
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: PurePDF - Probleme mit MultiCell()

Beitrag von Thorsten1867 »

Ich habe gerade auch noch den FoxitReader getestet und der druckt auch anstandslos.

Um welche Escapesequenzen handelt es sich, damit ich das Problem an die Macher des "PDF-XChange Viewer" melden kann.

Danke,
Thorsten
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Re: PurePDF - Probleme mit MultiCell()

Beitrag von ABBKlaus »

vermutlich sind es diese :

Code: Alles auswählen

\n - LINE FEED (0Ah) (LF)
\r - CARRIAGE RETURN (0Dh) (CR)
\t - HORIZONTAL TAB (09h) (HT)
\b - BACKSPACE (08h) (BS)
\f - FORM FEED (FF)
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Antworten