PyRTF "\n"?? oder komischer zeilenabstand??

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Sonntag 7. Mai 2006, 20:08

ich habe eine textdatei und möchte sie in eine rtf umwandeln (wegen der farben und der daraus resultierenden besseren sichtbarkeit)
es klappt auch ganz gut:
die textdatei hat immer mindestens drei zeilen:

Code: Alles auswählen

Datum und Uhrzeit: 02/12/2006 11:01 AM
Sie haben eine Nachricht empfangen von  ABSENDERNAME
DiesIstDerGesendeteText
also habe ich in meinem "konvertierer" stehen:

Code: Alles auswählen

#!/usr/bin/env python

from PyRTF import *
import codecs
import os
## wandlung von 16 bit auf 8 bit #
f_input = codecs.open("test_data.txt", mode='r', encoding="utf-16") 
f_output = codecs.open("ziel.txt", mode='w', encoding="iso-8859-1") 

for line in f_input: 
    f_output.write(line) 

f_input.close() 
f_output.close()
## wandlung in rtf ###############
def MakeExample4(datei) :
	doc     = Document()
	ss      = doc.StyleSheet
	section = Section()
	doc.Sections.append( section )
########	datum = datei[0][19:29]
	for s in dir(ss):
            print s
	erstezeile = datei.readline().rstrip()
	datum = erstezeile[19:29]
	datei.seek(0)
	p = Paragraph(ss.ParagraphStyles.Normal)
        pps = ParagraphPS()
        pps.SetSpaceBetweenLines(0)
        p.Properties = pps
                
	for line in datei.readlines():
            if line.startswith("Datum und Uhrzeit: "): # 19 zeichen lang
                # datum/zeit
                datum_neu = line[19:29]
                if datum_neu <> datum:
##                    p = Paragraph(ss.ParagraphStyles.Normal)
##                    pps = ParagraphPS()
##                    pps.SetSpaceBetweenLines(0)
##                    p.Properties = pps
                    p.append(TEXT(datum + "    tagwechsel " + 12*"*",
                                  colour = ss.Colours.Yellow,
                                  size = 16,
                                  bold = True))
##                    section.append(p)
                    datum = datum_neu
                zeit = line[30:-1]
                
            elif line.startswith("Sie haben eine Nachricht gesendet an  "): # 38 zeichen lang
                # empfaenger
                sender = "zackIV"
                farbe = ss.Colours.Blue
##                p = Paragraph(ss.ParagraphStyles.Normal)
##                pps = ParagraphPS()
##                pps.SetSpaceBetweenLines(0)
##                p.Properties = pps
                p.append(TEXT(sender+' ('+zeit+'):',
                              colour = farbe,
                              size = 22,
                              bold = True))
##                section.append(p)
                
            elif line.startswith("Sie haben eine Nachricht empfangen von  "): # 40 zeichen lang
                # absender
                sender = line[40:-1]
                farbe = ss.Colours.Red
##                p = Paragraph(ss.ParagraphStyles.Normal)
##                pps = ParagraphPS()
##                pps.SetSpaceBetweenLines(0)
##                p.Properties = pps
                p.append(TEXT(sender+' ('+zeit+'):',
                              colour = farbe,
                              size = 22,
                              bold = True))
##                section.append(p)

            else: # normaler text
                farbe = ss.Colours.Black
##                p = Paragraph(ss.ParagraphStyles.Normal)
##                pps = ParagraphPS()
##                pps.SetSpaceBetweenLines()
##                p.Properties = pps
                p.append(TEXT(line[:],
                         colour = farbe,
                         size = 22,
                         bold = False))
##                section.append(p)
        datei.close()
        os.remove(r"ziel.txt")
        section.append(p)
	return doc

if __name__ == '__main__' :
	DR = Renderer()

        datei = file("ziel.txt", "r")
	doc4 = MakeExample4(datei)
	DR.Write( doc4, file("icq_test.rtf", "w") )
	print "Finished"
(ich weiß auch, dass ich zuviele unnütze zeilen habe, aber ich weiß noch nicht ganz, welche ich davon immer auslassen kann!)
das ganze ist eigentlich für ICQ, wobei man die nachrichten/den verlauf als txt speichern kann und dann sie selbst - eigenhändig in rtf-s verwandelt...

wie man gut erkennen kann, habe ich manche sachen herauskommentiert:
wenn ich jedes mal einen Paragraph()-en erzeuge, ist ein merkwürdiger zeilenabstand (aber wenn man in den text klickt, ist "normaler zeilenabstand" angegeben, also liegt es irgendwo anders..)
wenn ich es jedoch so mache, wie hier im codebeispiel, so steht alles hintereinander, obwohl ich bei der dateiiteration schon datei.readlines() verwendet habe, wobei die "\n"-newlinezeichen dranhängen müssten..
diese funktionieren aber nicht wirklich...
kann mir jemand sagen, wie ich dort einen "normalaussehenden" zeilenumbruch hinbekomme?

danke im voraus
liebe grüße
hannes
BlackJack

Montag 8. Mai 2006, 21:28

Hannes-Spz hat geschrieben:wenn ich jedes mal einen Paragraph()-en erzeuge, ist ein merkwürdiger zeilenabstand (aber wenn man in den text klickt, ist "normaler zeilenabstand" angegeben, also liegt es
irgendwo anders..)
Das was Du da siehst ist nicht der Zeilenabstand sondern der Absatzabstand. Innerhalb eines Absatzes ist der Zeilenabstand natürlich "normal", aber nach einem Absatz wird etwas mehr Platz gelassen.
wenn ich es jedoch so mache, wie hier im codebeispiel, so steht alles hintereinander, obwohl ich bei der dateiiteration schon datei.readlines() verwendet habe, wobei die "\n"-newlinezeichen dranhängen müssten..
diese funktionieren aber nicht wirklich...
kann mir jemand sagen, wie ich dort einen "normalaussehenden" zeilenumbruch hinbekomme?
Die Zeilenende-Zeichen werden ähnlich wie bei HTML ignoriert. Und genau wie bei HTML muss man eine spezielle Auszeichnung verwenden, wenn man innerhalb eines Absatzes eine Zeilenschaltung in der Darstellung haben möchte. Bei PyRTF steht diese spezielle Auszeichnung als Konstante `LINE` zur Verfügung:

Code: Alles auswählen

from PyRTF import Document, Paragraph, Renderer, LINE

document = Document()
section = document.NewSection()
section.append(Paragraph('spam', LINE, 'ham', LINE, 'vikings'))

renderer = Renderer()
f = open('test.rtf', 'w')
renderer.Write(document, f)
f.close()
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Mittwoch 10. Mai 2006, 14:50

tausend dank, es hat eins-a geklappt :D :D :D
ganz liebe grüße
hannes
Antworten