⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iec16022.c

📁 IEC16022 bar code generation library and RS encode
💻 C
📖 第 1 页 / 共 2 页
字号:
   {                            // auto size
      if (!eccstr)
         ecc = 200;             // default is even sizes only unless explicit ecc set to force odd sizes
   }

   if (tolower (*format) == 's')
   {                            // special stamp format checks & defaults
      if (!W)
         W = H = 32;
      if (ecc != 200 || W != 32 || H != 32)
         fprintf (stderr, "Stamps must be 32x32\n");
      if (encoding)
         fprintf (stderr, "Stamps should use auto encoding\n");
      else
      {
         int n;
         for (n = 0; n < barcodelen && (barcode[n] == ' ' || isdigit (barcode[n]) || isupper (barcode[n])); n++);
         if (n < barcodelen)
            fprintf (stderr, "Has invalid characters for a stamp\n");
         else
         {                      // Generate simplistic encoding rules as used by the windows app
            // TBA - does not always match the windows app...
            n = 0;
            encoding = safemalloc (barcodelen + 1);
            while (n < barcodelen)
            {
               // ASCII
               while (1)
               {
                  if (n == barcodelen || n + 3 <= barcodelen && (!isdigit (barcode[n]) || !isdigit (barcode[n + 1])))
                     break;
                  encoding[n++] = 'A';
                  if (n < barcodelen && isdigit (barcode[n - 1]) && isdigit (barcode[n]))
                     encoding[n++] = 'A';
               }
               // C40
               while (1)
               {
                  int r = 0;
                  while (n + r < barcodelen && isdigit (barcode[n + r]))
                     r++;
                  if (n + 3 > barcodelen || r >= 6)
                     break;
                  encoding[n++] = 'C';
                  encoding[n++] = 'C';
                  encoding[n++] = 'C';
               }
            }
            encoding[n] = 0;
            //fprintf (stderr, "%s\n%s\n", barcode, encoding);
         }
      }
   }
   // processing stamps
   if ((W & 1) || ecc < 200)
   {                            // odd sizes
      fprintf (stderr, "Not done odd sizes yet, sorry\n");
   } else
   {                            // even sizes
      grid = iec16022ecc200 (&W, &H, &encoding, barcodelen, barcode, &len, &maxlen, &ecclen);
   }

   // output
   if (!grid || !W)
   {
      fprintf (stderr, "No barcode produced\n");
      return 1;
   }
   switch (tolower (*format))
   {
   case 'i':                   // info
      printf ("Size    : %dx%d\n", W, H);
      printf ("Encoded : %d of %d bytes with %d bytes of ecc\n", len, maxlen, ecclen);
      printf ("Barcode : %s\n", barcode);
      printf ("Encoding: %s\n", encoding);
      break;
   case 'h':                   // hex
      dumphex (grid, W, H, 0);
      break;
   case 'b':                   // bin
      {
         int y;
         for (y = 0; y < H; y++)
         {
            int v = 0,
               x,
               b = 128;
            for (x = 0; x < W; x++)
            {
               if (grid[y * W + x])
                  v |= b;
               b >>= 1;
               if (!b)
               {
                  putchar (v);
                  v = 0;
                  b = 128;
               }
            }
            if (b != 128)
               putchar (v);
         }
      }
      break;
   case 't':                   // text
      {
         int y;
         for (y = H - 1; y >= 0; y--)
         {
            int x;
            for (x = 0; x < W; x++)
               printf ("%c", grid[W * y + x] ? '*' : ' ');
            printf ("\n");
         }
      }
      break;
   case 'e':                   // EPS
      printf ("%%!PS-Adobe-3.0 EPSF-3.0\n" "%%%%Creator: IEC16022 barcode/stamp generator\n" "%%%%BarcodeData: %s\n"
              "%%%%BarcodeSize: %dx%d\n" "%%%%BarcodeFormat: ECC200\n" "%%%%DocumentData: Clean7Bit\n" "%%%%LanguageLevel: 1\n"
              "%%%%Pages: 1\n" "%%%%BoundingBox: 0 0 %d %d\n" "%%%%EndComments\n" "%%%%Page: 1 1\n" "%d %d 1[1 0 0 1 -1 -1]{<\n",
              barcode, W, H, W + 2, H + 2, W, H);
      dumphex (grid, W, H, 0xFF);
      printf (">}image\n");
      break;
   case 's':                   // Stamp
      {
         char temp[74],
           c;
         time_t now;
         struct tm t = {
            0
         };
         int v;
         if (barcodelen < 74)
         {
            fprintf (stderr, "Does not look like a stamp barcode\n");
            return 1;
         }
         memcpy (temp, barcode, 74);
         c = temp[5];
         temp[56] = 0;
         t.tm_year = atoi (temp + 54) + 100;
         t.tm_mday = 1;
         now = mktime (&t);
         temp[54] = 0;
         now += 86400 * (atoi (temp + 51) - 1);
         t = *gmtime (&now);
         temp[46] = 0;
         v = atoi (temp + 36);
         printf ("%%!PS-Adobe-3.0 EPSF-3.0\n" "%%%%Creator: IEC16022 barcode/stamp generator\n" "%%%%BarcodeData: %s\n"
                 "%%%%BarcodeSize: %dx%d\n" "%%%%DocumentData: Clean7Bit\n" "%%%%LanguageLevel: 1\n"
                 "%%%%Pages: 1\n" "%%%%BoundingBox: 0 0 190 80\n" "%%%%EndComments\n" "%%%%Page: 1 1\n"
                 "10 dict begin/f{findfont exch scalefont setfont}bind def/rm/rmoveto load def/m/moveto load def/rl/rlineto load def\n"
                 "/l/lineto load def/cp/closepath load def/c{dup stringwidth pop -2 div 0 rmoveto show}bind def\n"
                 "gsave 72 25.4 div dup scale 0 0 m 67 0 rl 0 28 rl -67 0 rl cp clip 1 setgray fill 0 setgray 0.5 0 translate 0.3 setlinewidth\n"
                 "32 32 1[2 0 0 2 0 -11]{<\n", barcode, W, H);
         dumphex (grid, W, H, 0xFF);
         printf (">}image\n"
                 "3.25/Helvetica-Bold f 8 25.3 m(\\243%d.%02d)c\n"
                 "2.6/Helvetica f 8 22.3 m(%.4s %.4s)c\n"
                 "1.5/Helvetica f 8 3.3 m(POST BY)c\n"
                 "3.3/Helvetica f 8 0.25 m(%02d.%02d.%02d)c\n",
                 v / 100, v % 100, temp + 6, temp + 10, t.tm_mday, t.tm_mon + 1, t.tm_year % 100);
         if (c == '1' || c == '2' || c == 'A' || c == 'S')
         {
            if (c == '2')
               printf ("42 0 m 10 0 rl 0 28 rl -10 0 rl cp 57 0 m 5 0 rl 0 28 rl -5 0 rl cp");
            else
               printf ("42 0 m 5 0 rl 0 28 rl -5 0 rl cp 52 0 m 10 0 rl 0 28 rl -10 0 rl cp");
            printf (" 21 0 m 16 0 rl 0 28 rl -16 0 rl cp fill\n"
                    "21.3 0.3 m 15.4 0 rl 0 13 rl -15.4 0 rl cp 1 setgray fill gsave 21.3 0.3 15.4 27.4 rectclip newpath\n");
            switch (c)
            {
            case '1':
               printf
                  ("27/Helvetica-Bold f 27 8.7 m(1)show grestore 0 setgray 1.5/Helvetica-Bold f 22 3.3 m(POSTAGE PAID GB)show 1.7/Helvetica f 29 1.5 m(DumbStamp.co.uk)c\n");
               break;
            case '2':
               printf
                  ("21/Helvetica-Bold f 23.5 13 m(2)1.25 1 scale show grestore 0 setgray 1.5/Helvetica-Bold f 22 3.3 m(POSTAGE PAID GB)show 1.7/Helvetica f 29 1.5 m(DumbStamp.co.uk)c\n");
               break;
            case 'A':
               printf
                  ("16/Helvetica-Bold f 29 14.75 m 1.1 1 scale(A)c grestore 0 setgray 1.5/Helvetica-Bold f 22 3.3 m(POSTAGE PAID GB)show 1.7/Helvetica f 22 1.5 m(Par Avion)show\n");
               break;
            case 'S':
               printf ("10/Helvetica-Bold f 29 17 m(SU)c grestore 0 setgray 1.5/Helvetica-Bold f 22 1.5 m(POSTAGE PAID GB)show\n");
               break;
            }
            printf ("2.3/Helvetica-Bold f 29 10 m(LOYAL MAIL)c\n");
         } else if (c == 'P')
         {                      // Standard Parcels
            printf ("21 0 m 41 0 rl 0 28 rl -41 0 rl cp fill\n"
                    "37.7 0.3 m 24 0 rl 0 27.4 rl -24 0 rl cp 1 setgray fill gsave 21.3 0.3 16.4 27.4 rectclip newpath\n"
                    "22.5/Helvetica-Bold f 37.75 -1.25 m 90 rotate(SP)show grestore 0 setgray\n"
                    "3.5/Helvetica-Bold f 49.7 21.5 m(LOYAL MAIL)c\n"
                    "2.3/Helvetica-Bold f 49.7 7 m(POSTAGE PAID GB)c\n" "2.6/Helveica f 49.7 4.25 m(DumbStamp.co.uk)c\n");
         } else if (c == '3'||c=='9')
            printf ("21.15 0.15 40.7 27.7 rectstroke\n"
                    "21 0 m 41 0 rl 0 5 rl -41 0 rl cp fill\n"
                    "0 1 2{0 1 18{dup 1.525 mul 22.9 add 24 3 index 1.525 mul add 3 -1 roll 9 add 29 div 0 360 arc fill}for pop}for\n"
                    "50.5 23.07 m 11.5 0 rl 0 5 rl -11.5 0 rl cp fill\n"
                    "5.85/Helvetica f 23.7 15.6 m(Loyal Mail)show\n"
                    "4.75/Helvetica-Bold f 24 11 m(special)show 4.9/Helvetica f(delivery)show\n"
                    "gsave 1 setgray 3.2/Helvetica-Bold f 24 1.6 m(%s)show 26 10.15 m 2 0 rl stroke grestore\n"
                    "21.15 9.9 m 53.8 9.9 l stroke 53.8 9.9 0.4 0 360 arc fill\n",(c=='3')?"next day":"9.00am");
         printf ("end grestore\n");
      }
      break;
   case 'p':                   // png
      {
         int x,
           y;
         Image *i = ImageNew (W + 2, H + 2, 2);
         i->Colour[0] = 0xFFFFFF;
         i->Colour[1] = 0;
         for (y = 0; y < H; y++)
            for (x = 0; x < W; x++)
               if (grid[y * W + x])
                  ImagePixel (i, x + 1, H - y) = 1;
         ImageWritePNG (i, fileno (stdout), 0, -1, barcode);
         ImageFree (i);
      }
      break;
   default:
      fprintf (stderr, "Unknown output format %s\n", format);
      break;
   }
   return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -