2016-01-29 11 views
8

Mam do utworzenia pliku PDF, w którym trzeba dodać linie w lewym dolnym, jak stopka.Jak dodać wiele linii na dole (stopce) pliku PDF?

następujący kod działa:

import StringIO 
from reportlab.pdfgen import canvas 
import uuid 

def test(pdf_file_name="abc.pdf", pdf_size=(432, 648), font_details=("Times-Roman", 9)): 
    # create a new PDF with Reportla 
    text_to_add = "I am writing here.." 
    new_pdf = "test_%s.pdf"%(str(uuid.uuid4())) 

    packet = StringIO.StringIO() 
    packet.seek(0) 

    c = canvas.Canvas(pdf_file_name, pagesize = pdf_size) 
    #- Get the length of text in a PDF. 
    text_len = c.stringWidth(text_to_add, font_details[0], font_details[1]) 
    #- take margin 20 and 20 in both axis 
    #- Adjust starting point on x axis according to text_len 
    x = pdf_size[0]-20 - text_len 
    y = 20 
    #- set font. 
    c.setFont(font_details[0], font_details[1]) 
    #- write text, 
    c.drawString(x, y, text_to_add) 

    c.showPage() 
    c.save() 
    return pdf_file_name 

Teraz, jeśli tekst ma wiele linii to nie działa, ponieważ długość tekstu jest większa niż szerokość rozmiaru strony. Zrozumiany.

próbuję z Frame i paragraph ale nadal nie można napisać tekst w prawidłowej pozycji w PDF

Poniższy kod:

from reportlab.lib.pagesizes import letter 
from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph 

styles = getSampleStyleSheet() 
styleN = styles['Normal'] 
styleH = styles['Heading1'] 

def footer(canvas, doc): 
    canvas.saveState() 
    P = Paragraph("This is a multi-line footer. It goes on every page. " * 10, styleN) 
    w, h = P.wrap(doc.width, doc.bottomMargin) 
    print "w, h:", w, h 
    print "doc.leftMargin:", doc.leftMargin 
    P.drawOn(canvas, 10, 30) 
    canvas.restoreState() 

def test(): 
    doc = BaseDocTemplate('test.pdf', pagesize=(432, 648)) 
    print "doc.leftMargin:", doc.leftMargin 
    print "doc.bottomMargin:", doc.bottomMargin 
    print "doc.width:", doc.width 
    print "doc.height:", doc.height 
    frame = Frame(10, 50, 432, 648, id='normal') 
    template = PageTemplate(id='test', frames=frame, onPage=footer) 
    doc.addPageTemplates([template]) 

    text = [] 
    for i in range(1): 
     text.append(Paragraph("", styleN)) 

    doc.build(text) 

Nie rozumiem, dlaczego wielkość zmiany widoku, bo ustawiony (432, 648) ale pokazują (288.0, 504.0)

doc.leftMargin: 72.0 
doc.bottomMargin: 72.0 
doc.width: 288.0 
doc.height: 504.0 

Również Rozmiar ramki:

w, h: 288.0 96 
doc.leftMargin: 72.0 

Nie wiem, jak rozwiązać ten problem. odsyłam this Link

Odpowiedz

6

najpierw tajemnicy odnośnie doc.width The doc.width nie jest rzeczywista szerokość dokumentu. Jest to szerokość obszaru między marginesami, więc w tym przypadku doc.width + doc.leftMargin + doc.rightMargin jest równa szerokości rzeczywistej strony.

Teraz wracamy do tego, dlaczego stopka nie obejmowała całej szerokości strony. Wynika to z tego samego problemu, co opisany powyżej, a mianowicie doc.width nie jest faktyczną szerokością papieru.

Zakładając chcesz stopka aby objąć całą stronę

def footer(canvas, doc): 
    canvas.saveState() 

    P = Paragraph("This is a multi-line footer. It goes on every page. " * 10, styleN) 

    # Notice the letter[0] which is the width of the letter page size 
    w, h = P.wrap(letter[0] - 20, doc.bottomMargin) 

    P.drawOn(canvas, 10, 10) 
    canvas.restoreState() 

Zakładając chcesz stopkę span szerokość zapisywalnego obszaru

uwaga: marże na ustawieniach domyślnych są dość duże, dlatego jest tak dużo pustej przestrzeni po bokach.

def footer(canvas, doc): 
    canvas.saveState() 
    P = Paragraph("This is a multi-line footer. It goes on every page. " * 10, styleN) 
    w, h = P.wrap(doc.width, doc.bottomMargin) 
    print "w, h:", w, h 
    print "doc.leftMargin:", doc.leftMargin 
    P.drawOn(canvas, doc.leftMargin, 10) 
    canvas.restoreState() 

EDIT:

Jak to może być przydatne wiedzieć, gdzie normalny tekst powinien zacząć. Musimy określić wysokość naszej stopki. W normalnych okolicznościach nie możemy użyć P.height, ponieważ zależy to od szerokości tekstu, wywołanie go podniosą AttributeError.

W naszym przypadku rzeczywiście jesteśmy w stanie uzyskać wysokość stopki bezpośrednio od P.wrap (The h) lub dzwoniąc P.height po nazwaliśmy P.wrap.

Po uruchomieniu naszej Frame na wysokości stopki nigdy nie zachodzi nakładający się tekst.Jednak ważne jest, aby pamiętać, aby ustawić wartość Frame na doc.height - footer.height, aby zapewnić, że tekst nie zostanie umieszczony poza stroną.

+0

ok Sprawdzę i dam znać. Zrobiłem klatkę. to działa. ale jeśli jest 5 linii i jak znaleźć pozycję startową to mój problem już teraz. –

+0

Pozycja początkowa "Akapitu" znajduje się w lewym dolnym rogu, tak jak zawsze w laboratorium raportu. Gdy dodasz więcej linii, "Akapit" zacznie rosnąć pionowo, ale pozostanie przywiązany do lewego dolnego rogu. Jeśli potrzebujesz znać prawy górny róg, możesz użyć 'P.height' w połączeniu z pozycją wyjściową w tym przypadku 10. – B8vrede

+0

@VivekSable Czy to wyjaśniło? Jeśli chcesz, mogę dodać go do odpowiedzi. – B8vrede

Powiązane problemy