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