2011-08-22 14 views
5

Ho visto molte soluzioni qui ma nessuna è chiara o buona risposta.Come sostituire il testo in un PDF con C#?

Ecco la mia semplice domanda, sperando in una risposta diretta.

Ho un file PDF (un modello) che viene creato avendo testo simile al seguente:

{FIRSTNAME} {LASTNAME} {INDIRIZZO} {PHONENUMBER}

è possibile avere un codice C# che sostituisca questi template con un testo a mia scelta?

Nessun campo, nessun'altra roba complessa.

C'è qualche libreria Open source che mi aiuti a raggiungere questo obiettivo?

+0

Avete qualche codice che è possibile condividere con noi, potrebbe rendere più facile? – diceler

+0

Questo altra domanda potrebbe essere simile: [Modificare PDF in C#] [1] [1]: http://stackoverflow.com/questions/1781208/is-there-any-api-in-c -o-net-to-edit-pdf-documents – malinois

+0

Puoi usare http://sourceforge.net/projects/itextsharp/, ci sono tutorial facili da seguire (ma un po 'sorpassati) là fuori: http: // asp- net-whidbey.blogspot.com/2006/04/generating-pdf-files-with-itextsharp.html – Andreas

risposta

2

Come indicato in similar thread, questo non è davvero possibile in modo semplice. Il modo più semplice è ottenere un file DocX e utilizzare la libreria DocX che consente di scambiare facilmente le parole e quindi convertire DocX in PDF (utilizzando la stampante PDF Creator o giù di lì).

Oppure utilizzare pdf sharp/migradoc per creare nuovi documenti.

+0

Ciò è interessante, perché il mio modello è effettivamente realizzato con la parola e salvato in PDF! quindi posso tenerlo come docx e usarlo come modello! :-) –

+0

questo funziona bene, ma se ho un testo formattato, cambierà il formato con quello predefinito! sembra che ci sia un bug in esso e spero che lo risolvano, ma davvero grazie per aver postato qui :-) –

+0

Leggi attraverso il forum forse c'è già una soluzione per questo. Ricordo di averlo visto lì – MadBoy

2

Il "problema" con i documenti PDF è che non sono intrinsecamente adatti per la modifica. Soprattutto quelli senza campi. La cosa migliore è fare un passo indietro e osservare il tuo processo e vedere se c'è un modo per sostituire il testo prima che il PDF sia stato generato. Ovviamente, potresti non avere sempre questa libertà.

Se si è in grado di sostituire il testo, è necessario tenere presente che non ci sarà il riflusso automatico del testo dopo il testo sostituito. Dato che stai bene con quello, allora ci sono pochissime soluzioni che ti permettono di sostituire il testo.

So che stai cercando una soluzione OpenSource quindi mi sento riluttante a offrirti una soluzione commerciale. Offriamo uno chiamato PDFKit.NET. Ti permette di estrarre tutto il contenuto di una pagina come le cosiddette forme (testo, immagini, curve, ecc.). Vedere il metodo Page.CreateShapes nel riferimento al tipo. È quindi possibile navigare e modificare a livello di programmazione questa struttura di forme e quindi riscriverle nuovamente in un PDF.

Eccolo: http://www.tallcomponents.com/pdfkit3.aspx

Disclosure: Io sono il fondatore di TallComponents, fornitore di questo componente

+0

se non c'è una soluzione Open-Source, allora dovrò cercarne uno commerciale :-) –

+0

In effetti, la stragrande maggioranza dei PDF usa font subsetificati. Ciò significa che sono incorporati solo glifi dei caratteri necessari. Ad esempio, se il tuo PDF esistente non contiene la lettera "A", non puoi aggiungerlo. A meno che, naturalmente, il file di font originale esista ancora sul tuo computer. Altrimenti potresti dover trovare un font abbastanza simile. –

3

Questo thread è morto, ma sto postando la mia soluzione per le altre anime perse che possono insorgere per questo problema in futuro. Purtroppo la mia azienda non consente la pubblicazione di codice online, quindi descriverò la soluzione :).

Quindi in pratica quello che devi fare è usare PdfSharp e modificare questo sample per sostituire il testo in streaming, ma devi tenere conto che il testo può essere diviso in molte parentesi (converti stream in string per vedere qual è il formato) .

Quindi, con codice simile a this sample attraversare la pagina di origine pdf per pagina e modificare la pagina corrente cercando gli elementi PdfContent all'interno degli elementi PdfReference e sostituendo il testo nel flusso del contenuto.

2

Per testo semplice, sostituire la libreria iTextSharp. Il codice che sostituisce una stringa con un'altra è sotto. Si noti che questo sostituirà solo il testo semplice e potrebbe non funzionare in tutti i casi.

//using iTextSharp.text.pdf; 
    void VerySimpleReplaceText(string OrigFile, string ResultFile, string origText, string replaceText) 
    { 
     using (PdfReader reader = new PdfReader(OrigFile)) 
     { 
      for (int i = 1; i <= reader.NumberOfPages; i++) 
      { 
       byte[] contentBytes = reader.GetPageContent(i); 
       string contentString = PdfEncodings.ConvertToString(contentBytes, PdfObject.TEXT_PDFDOCENCODING); 
       contentString = contentString.Replace(origText, replaceText); 
       reader.SetPageContent(i, PdfEncodings.ConvertToBytes(contentString, PdfObject.TEXT_PDFDOCENCODING)); 
      } 
      new PdfStamper(reader, new FileStream(ResultFile, FileMode.Create, FileAccess.Write)).Close(); 
     } 
    } 
+0

Purtroppo questa soluzione non funziona nemmeno per un PDF molto semplice. Ho controllato 'contentString' e non contiene alcun testo dal PDF. Potresti avere una versione aggiornata? I PDF con cui lavoro sono molto semplici e anche il testo cercato è unico. –

Problemi correlati