Generowanie kodów 2D w C# na przykładzie PDF417

Kody 2D, czyli popularne kody kreskowe są dość powszechne a, że obecnie pracuje w branży finansowej to miałem okazję, aby kilka wygenerować do dokumentu PDF. Poniżej przedstawiam możliwości jak wygenerować kody 2D w C# w szczególności kod w formacie PDF417.

Biblioteki

Z tego co wiem istnieją dwie biblioteki(darmowe) do generowania kodów 2D. Płatnych jest pełno i na pewno są bardzo dobre ale używanie ich jest nie możliwe w większości firmach ze względu na koszty. Poniżej przedstawiam to co znalazłem.

Biblioteka SharpPdf417

Biblioteka dostępna w NuGet-ach  oraz na github-ie

Prosta i szybka biblioteka do generowania kodów w tylko formacie PDF417.

Jednak ani wersja w nugetach ani wersja z github-a nie działa do końca prawidłowo.

To znaczy kody się generują ale jest błąd, że tekst w kodzie jest powtórzony (jak jak by były dwie te same wiadomości). Pracuje nad tym, aby to naprawić, zgłosiłem również issue  na githubie ale brak odzewu.  Piszę jednak o niej, bo jest dokładnie tym czego potrzebuje i jestem zwolennikiem taki prostych rozwiązań. Mam nadzieje, że udało się ją naprawić.
Biblioteka nie ma dokumentacji ale przykład na github-ie jest wystarczający aby zrozumieć jak to działa. Oto przykład:

W skrócie biblioteka generuje tablicę z listą wierszy i jeśli ma być czarne pole to generuje „1” dla pozostałych jest „0”. W zależności od zastosowanego mechanizmu możemy w łatwy sposób odrysować kod na dokumencie.

Biblioteka wydawała się idealna, bo kod 2D miałem wstawiać do PDF-a a w pdf-ie można łatwo rysować małe prostokąty, jednak jak mówiłem wcześniej, biblioteka nie działa za dobrze.

Ciekawą opcją jest za to zmienna:

 int aspectRatio = 2;

, która to definiuje rozdzielczość tablicy, co powinno skutkować dobrym mechanizmem skalowania wielkością kodu. Faktycznie skalowanie istnieje ale nie udało mi się odpowiednio wyskalować tego w PDF-fie.

Biblioteka ZXing.Net

Biblioteka dostępna na CodePlex  jest to również port z javy (ZXing) ale tym razem lepszej jakości i wszystko działa jak należy.

Bibliotekę przetestowałem i działa bardzo dobrze.

Plusami są:

1. Możliwość kodowania jak i dekodowania kodów 2D.
2. Duża ilość obsługiwanych formatów.
3. Przykłady i wersje bibliotek na każdą platformę używającą .NET-a.

Programowanie

Przykład dekodowania:

IBarcodeReader reader = new BarcodeReader();

var barcodeBitmap = (Bitmap)Bitmap.LoadFrom("C:\\sample-barcode-image.png");

var result = reader.Decode(barcodeBitmap);

if (result != null)
{
   txtDecoderType.Text = result.BarcodeFormat.ToString();
   txtDecoderContent.Text = result.Text;
}

Kod jest bardzo prosty w użyciu. Tworzymy obiekt BarcodeReader. Wczytujemy odpowiedni plik z kodem, następnie wykorzystujemy metodę Decode aby dostać właściwą wiadomość.

a przykład kodowania poniżej:

using System.Drawing;
using ZXing;
using ZXing.PDF417;

var bw = new BarcodeWriter
{
 Format = BarcodeFormat.PDF_417,
 Options = new PDF417EncodingOptions
 {
  Height = 100,
  Width = 100
 }
};

var image= bw.Write("Hello World");

using (var stream = new FileStream("c:\\test.bmp", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
 var bitmMapAsBytes = ImageToByte(image);
 stream.Write(bitmMapAsBytes, 0, aztecAsBytes.Length);
}

Kod jest prosty. Tworzymy odpowiedni obiekt BarcodeWriter wybierając interesujący Nas sposób kodowania znaków w tym przypadku to PDF417 (ciekawostka: ten sam typ kodowania jest na kartach pokładowych Ryanair-a). Obiekt PDF417EncodingOptions jest opcjonalny i dla PDF417 nie zauważyłem aby miał jakikolwiek znaczenie. Następnie w metodzie Write dajemy komunikat do zakodowania a metoda zwraca obiekt BitMap z przestrzeni nazw System.Drawing.

W tym momencie pozostaje Nam jakoś to obrobić na przykład narysować w PDF-fie. W tym przypadku zapisujemy plik na dysk, który zawiera gotowy obrazek kodu 2D.

Testy

Testować oczywiście możemy kodując i dekodując wiadomość lub organoleptyczne.

Do testowania używałem telefonu i aplikacji PDF417 Barcode Scaner  na Andorida. Popularna aplikacji BarCode Scaner nie rozpoznaje kodów PDF417.

Ważne jest to aby zawsze po zmianie wielkości kodu 2D sprawdzić czy nadal możemy go zeskanować. Zbyt mały obrazek może zmienić swój wygląd i nie będzie możliwości skanowania go.

W następnym poście opowiem o tworzeniu pdf-a w C# i powiem jak taki obrazek umieścić w pdf-ie.

Jedno przemyślenie nt. „Generowanie kodów 2D w C# na przykładzie PDF417

  1. Pingback: dotnetomaniak.pl

Możliwość komentowania jest wyłączona.