A questo punto ho cominciato a cercare una libreria che mi permettesse di aprire un file pdf esistente (il file generato dal mio motore di reportistica) e modificarlo per inserire 'a mano' il codice a barre.
Nei miei pellegrinaggi mi sono imbattuto in una libreria opensource iTextSharp che è il porting .NET della potente libreria iText di java.
La mia idea iniziale era quella di andare ad includere il file ttf come risorsa all'interno del pdf, idea che poi è naufragata per la mia scarsa conoscenza della libreria (se qualcuno è riuscito a fare questo, può postare un commento sul blog nel quale può spiegare la tecnica a tutti o deridermi!).
Alla fine mi sono arreso a una soluzione paliativa, ma comunque funzionante. La libreria iTextSharp contiene svariate classi per la generazione di codici a barre, quindi non mi serviva altro che utilizzarle per modificare il mio file.
Partiamo con i passi base: prendere lo stream del nostro file pdf e renderlo modificabile con iTextSharp:
MemoryStream m = new MemoryStream(); PdfReader r = new PdfReader(pdfContent); PdfStamper pdf = new PdfStamper(r, m);Lo strem iniziale conterrà il file finale con la modifica, il PdfReader permette di leggere il flusso stream del file (pdfContent è un byte[]) e PdfStamper permette di prendere il file letto dal reader, eseguire delle modifice e scrivere il nuovo contenuto nel MemoryStream.
A questo punto dobbiamo andare a aprire una pagina del pdf (alla fine inseriremo il codice a barre su ogni pagina), creare una classe che ci permetterà di controllare il codice a barre, stampigliarlo sopra e salvare il tutto.
for (int i = 1; i <= r.NumberOfPages; i++){ //Craezione della classe per la generazione del codice a barre Barcode128 b = new Barcode128(); b.Code = '1234656789ABCDE' b.StartStopText = true; b.GenerateChecksum = false; b.Extended = true; b.BarHeight = 30; //Apertura della pagina PdfContentByte cb = pdf.GetOverContent(i); iTextSharp.text.Image img = b.CreateImageWithBarcode(cb, null, null); //Aggiunta in una posizione fissa del codice a barre img.SetAbsolutePosition(200, 20); cb.AddImage(img); } pdf.Close(); Response.Clear(); Response.AddHeader("content-disposition", "attachment;filename=" + "PDF.pdf"); Response.Charset = ""; Response.ContentType = "application/pdf"; Response.BinaryWrite(m.ToArray()); Response.Flush(); Response.End();L'unico difetto di questa tecnica è la posizione assoluta del codice a barre. Ma con un pochino di fantasia possiamo andare a cercare qualche elemento sempre presente nel pdf e a leggere la sua posizione, quindi impostare il left e il top in base a questo valore. Ma questa è un'altra storia.
Una precisazione, credo che la codifica usata dalla classe Barcode128 sia quella C (CODE 128C) di conseguenza le lettere non sono ammesse (è una codifica più compatta però), quindi l'esempio è sbagliato!
RispondiElimina