2014-11-19 22 views
11

Quando stampo un PDF da uno qualsiasi dei miei PDF di origine, le dimensioni del file diminuiscono e rimuovono le caselle di testo presenti nel modulo. In breve, appiattisce il file. Questo è un comportamento che voglio raggiungere.Genera PDF appiattito con Python

Il seguente codice per creare un PDF utilizzando un altro PDF come origine (quello che voglio appiattire), scrive anche il modulo delle caselle di testo.

Posso ottenere un PDF senza le caselle di testo, appiattirlo? Proprio come fa Adobe quando stampo un PDF come PDF.

mio altro codice assomigli a questo meno alcune cose:

import os 
import StringIO 
from pyPdf import PdfFileWriter, PdfFileReader 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

directory = os.path.join(os.getcwd(), "source") # dir we are interested in 
fif = [f for f in os.listdir(directory) if f[-3:] == 'pdf'] # get the PDFs 
for i in fif: 
    packet = StringIO.StringIO() 
    can = canvas.Canvas(packet, pagesize=letter) 
    can.rotate(-90) 
    can.save() 

    packet.seek(0) 
    new_pdf = PdfFileReader(packet) 
    fname = os.path.join('source', i) 
    existing_pdf = PdfFileReader(file(fname, "rb")) 
    output = PdfFileWriter() 
    nump = existing_pdf.getNumPages() 
    page = existing_pdf.getPage(0) 
    for l in range(nump): 
     output.addPage(existing_pdf.getPage(l)) 
    page.mergePage(new_pdf.getPage(0)) 
    outputStream = file("out-"+i, "wb") 
    output.write(outputStream) 
    outputStream.close() 
    print fName + " written as", i 

Riassumendo: Ho un pdf, ho aggiungere una casella di testo ad esso, coprire informazioni e l'aggiunta di nuove informazioni, e poi Stampo un pdf da quel pdf La casella di testo non diventa più modificabile o mobile. Volevo automatizzare quel processo ma tutto ciò che ho provato permetteva comunque che la casella di testo fosse modificabile.

+0

Anche cercando una soluzione a questo. Ho uno script Python con filigrana, ma la filigrana interferisce quando si tenta di selezionare o evidenziare il testo nel documento. Se potessi generare un PDF filigranato appiattito e quindi unirlo con i PDF di origine, questo lo risolverebbe. –

+0

I nomi dei file seguono alcune convenzioni specifiche? se sì, qual è il semantico? Qual è lo scopo di dividere il nome del file per spazio, e quindi con una virgola? (altrimenti, lo script fallisce, ma non sono sicuro che sia rilevante o meno per il problema che si sta affrontando) – gpoo

+0

+ MakeCents Non riesco a riprodurre il problema. Non ho scatole. Puoi incollare un'immagine con il risultato che ottieni e il risultato atteso? – gpoo

risposta

8

caso di installazione di un pacchetto di sistema operativo è un'opzione, allora si potrebbe utilizzare pdftk con il suo pitone involucro pypdftk come questo:

import pypdftk 
pypdftk.fill_form('filled.pdf', out_file='flattened.pdf', flatten=True) 

Si sarebbe anche bisogno di installare il pacchetto pdftk, che su Ubuntu potrebbe essere fatto come questo:

sudo apt-get install pdftk 

La biblioteca pypdftk può venire scaricato da PyPI:

pip install pypdftk 
+0

c'è un modo per farlo senza pdftk? Chiedo perché sto tentando di scrivere un clone pdftk dato che pdftk non funziona su centos7. Qualsiasi aiuto sarebbe molto apprezzato. –