Seite 1 von 1

PurePDF - Probleme mit MultiCell()

Verfasst: 17.02.2011 17:59
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.

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 17.02.2011 19:09
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

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 17.02.2011 19:25
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

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 18.02.2011 13:35
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

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 18.02.2011 15:56
von Thorsten1867
Mit dem Acrobat Reader X funktioniert es.

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 18.02.2011 17:55
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

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 18.02.2011 18:01
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

Re: PurePDF - Probleme mit MultiCell()

Verfasst: 18.02.2011 18:04
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)