2016-01-29 13 views
8

Devo creare un file PDF in cui è necessario aggiungere righe in basso a sinistra come il piè di pagina.Come aggiungere più righe nella parte inferiore (piè di pagina) del PDF?

seguito il codice sta lavorando:

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 

Ora, se il testo dispone di più linee, allora questo non funziona perché la lunghezza del testo è superiore alla larghezza del formato pagina. Inteso.

provo con Frame e paragraph, ma ancora non è possibile scrivere il testo in posizione corretta in un PDF

seguito riporta il codice:

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) 

non capisco perché dimensione della pagina cambiano, perché ho impostato (432, 648) ma è mostrare (288.0, 504.0)

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

Anche dimensione frame:

w, h: 288.0 96 
doc.leftMargin: 72.0 

Non so come risolvere questo problema. Mi riferisco this collegamento

risposta

6

primo mistero per quanto riguarda la doc.width, il doc.width non è la larghezza effettiva del documento. È la larghezza dell'area tra i margini, quindi in questo caso doc.width + doc.leftMargin + doc.rightMargin corrisponde alla larghezza della pagina effettiva.

Ora torniamo al motivo per cui il piè di pagina non ha esteso l'intera larghezza della pagina come desiderato. Questo a causa dello stesso problema descritto sopra, ovvero doc.width non è la larghezza effettiva della carta.

si Supponendo che desidera che il piè di pagina per coprire l'intera pagina

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() 

Supponendo che si desidera che il piè di coprire la larghezza dell'area scrivibile

Nota: i margini sulla impostazione di default sono abbastanza grandi, ecco perché c'è così tanto spazio vuoto ai lati.

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:

come potrebbe essere utile sapere dove il testo normale dovrebbe iniziare. Dobbiamo capire l'altezza del nostro footer. In circostanze normali non possiamo usare P.height in quanto dipende dalla larghezza del testo, chiamandolo solleverà un AttributeError.

Nel nostro caso abbiamo effettivamente sono in grado di ottenere l'altezza del piè di pagina direttamente dal P.wrap (la h) o chiamando P.height dopo che abbiamo chiamato P.wrap.

Avviando il nostro Frame all'altezza del piè di pagina non avremo mai testo sovrapposto.Tuttavia è importante ricordare di impostare l'altezza dello Frame su doc.height - footer.height per garantire che il testo non venga posizionato all'esterno della pagina.

+0

ok controllerò e ti farò sapere. L'ho fatto per fotogramma funziona. ma se ci sono 5 linee e come trovare la posizione di partenza è il mio problema ora. –

+0

La posizione iniziale del 'paragrafo 'è in basso a sinistra come sempre nel laboratorio di report. Quando aggiungi più linee, il 'paragrafo 'inizierà a crescere verticalmente ma rimarrà attaccato all'angolo in basso a sinistra. Se hai bisogno di conoscere l'angolo in alto a destra puoi usare 'P.height' in combinazione con la posizione di partenza in questo caso 10. – B8vrede

+0

@VivekSable Lo hai chiarito? Posso aggiungerlo alla risposta, se vuoi. – B8vrede

Problemi correlati