95 #include <config_auto.h>
100 #include "allheaders.h"
107 static const l_int32 DefaultInputRes = 300;
117 static l_int32
l_generatePdf(l_uint8 **pdata,
size_t *pnbytes,
119 static void generateFixedStringsPdf(
L_PDF_DATA *lpd);
121 static void generateMediaboxPdf(
L_PDF_DATA *lpd);
122 static l_int32 generatePageStringPdf(
L_PDF_DATA *lpd);
123 static l_int32 generateContentStringPdf(
L_PDF_DATA *lpd);
124 static l_int32 generatePreXStringsPdf(
L_PDF_DATA *lpd);
125 static l_int32 generateColormapStringsPdf(
L_PDF_DATA *lpd);
126 static void generateTrailerPdf(
L_PDF_DATA *lpd);
127 static char *makeTrailerStringPdf(
L_DNA *daloc);
132 static char *generatePagesObjStringPdf(
NUMA *napage);
135 static L_PDF_DATA *pdfdataCreate(
const char *title);
136 static void pdfdataDestroy(
L_PDF_DATA **plpd);
142 static l_int32 var_WRITE_G4_IMAGE_MASK = 1;
144 static l_int32 var_WRITE_DATE_AND_VERSION = 1;
146 #define L_SMALLBUF 256
147 #define L_BIGBUF 2048
150 #ifndef NO_CONSOLE_IO
151 #define DEBUG_MULTIPAGE 0
202 l_int32 pixres, w, h, ret;
203 l_float32 xpt, ypt, wpt, hpt;
208 return ERROR_INT(
"&data not defined", __func__, 1);
211 return ERROR_INT(
"&nbytes not defined", __func__, 1);
214 return ERROR_INT(
"pix not defined", __func__, 1);
219 if (quality < 0 || quality > 100)
220 return ERROR_INT(
"invalid quality", __func__, 1);
231 return ERROR_INT(
"cid not made", __func__, 1);
240 res = (pixres > 0) ? pixres : DefaultInputRes;
248 if ((lpd = pdfdataCreate(title)) == NULL)
249 return ERROR_INT(
"lpd not made", __func__, 1);
251 if ((lpd = pdfdataCreate(title)) == NULL)
252 return ERROR_INT(
"lpd not made", __func__, 1);
268 pdfdataDestroy(&lpd);
269 if (plpd) *plpd = NULL;
271 return ERROR_INT(
"pdf output not made", __func__, 1);
323 char *fname, *str_pages, *str_trailer;
324 l_uint8 *pdfdata, *data;
325 l_int32 i, j, index, nobj, npages;
326 l_int32 *sizes, *locs;
328 L_BYTEA *bas, *bad, *bat1, *bat2;
329 L_DNA *da_locs, *da_sizes, *da_outlocs, *da;
331 NUMA *na_objs, *napage;
335 return ERROR_INT(
"&data not defined", __func__, 1);
338 return ERROR_INT(
"&nbytes not defined", __func__, 1);
341 return ERROR_INT(
"pa_data not defined", __func__, 1);
347 for (i = 0; i < npages; i++) {
354 L_ERROR(
"can't parse file %s; skipping\n", __func__, fname);
356 L_ERROR(
"can't parse file %d; skipping\n", __func__, i);
368 return ERROR_INT(
"no parsable pdf files found", __func__, 1);
375 for (i = 0; i < npages; i++) {
386 for (j = 4; j < nobj - 1; j++)
394 str_pages = generatePagesObjStringPdf(napage);
399 for (i = 0; i < npages; i++) {
413 for (j = 0; j < 4; j++)
416 for (j = 4; j < nobj; j++) {
435 str_trailer = makeTrailerStringPdf(da_outlocs);
446 lept_stderr(
"******** Page object numbers ***********");
449 lept_stderr(
"******** Pages object ***********\n");
457 LEPT_FREE(str_pages);
458 LEPT_FREE(str_trailer);
488 return ERROR_INT(
"file not found", __func__, 1);
492 return ERROR_INT(
"file not tiff format", __func__, 1);
537 l_int32 format, type;
542 return ERROR_INT(
"&cid not defined", __func__, 1);
545 return ERROR_INT(
"neither fname nor pix are defined", __func__, 1);
549 if (fname && strcmp(fname,
"-") != 0 && strcmp(fname,
"stdin") != 0) {
551 if (format == IFF_UNKNOWN)
552 L_WARNING(
"file %s format is unknown\n", __func__, fname);
553 if (format == IFF_PS || format == IFF_LPDF) {
554 L_ERROR(
"file %s is unsupported format %d\n",
555 __func__, fname, format);
558 if (format == IFF_JFIF_JPEG) {
560 }
else if (format == IFF_JP2) {
562 }
else if (format == IFF_PNG) {
574 return ERROR_INT(
"pixt not made", __func__, 1);
582 return ERROR_INT(
"cid not made from pix", __func__, 1);
620 l_int32 format, d, bps, spp, iscmap;
625 return ERROR_INT(
"&cid not defined", __func__, 1);
628 return ERROR_INT(
"fname not defined", __func__, 1);
631 return ERROR_INT(
"invalid conversion type", __func__, 1);
632 if (ascii85 != 0 && ascii85 != 1)
633 return ERROR_INT(
"invalid ascii85", __func__, 1);
636 pixReadHeader(fname, &format, NULL, NULL, &bps, &spp, &iscmap);
640 L_WARNING(
"pixs has cmap; using flate encoding\n", __func__);
643 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", __func__);
646 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", __func__);
649 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", __func__);
654 if (format == IFF_JFIF_JPEG) {
657 if ((pix =
pixRead(fname)) == NULL)
658 return ERROR_INT(
"pix not returned for JPEG", __func__, 1);
663 return ERROR_INT(
"jpeg data not made", __func__, 1);
665 if (format == IFF_JP2) {
668 if ((pix =
pixRead(fname)) == NULL)
669 return ERROR_INT(
"pix not returned for JP2K", __func__, 1);
674 return ERROR_INT(
"jp2k data not made", __func__, 1);
676 if ((pix =
pixRead(fname)) == NULL)
677 return ERROR_INT(
"pix not returned for G4", __func__, 1);
681 return ERROR_INT(
"g4 data not made", __func__, 1);
684 return ERROR_INT(
"flate data not made", __func__, 1);
686 return ERROR_INT(
"invalid conversion type", __func__, 1);
719 l_uint8 *pngcomp = NULL;
720 l_uint8 *datacomp = NULL;
721 l_uint8 *cmapdata = NULL;
722 char *cmapdatahex = NULL;
724 l_int32 format, interlaced;
728 l_int32 w, h, cmapflag;
730 size_t nbytescomp = 0, nbytespng = 0;
737 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", __func__, NULL);
743 if (format == IFF_PNG) {
746 return (
L_COMP_DATA *)ERROR_PTR(
"bad png input", __func__, NULL);
757 if (format != IFF_PNG ||
758 (format == IFF_PNG && (interlaced || bps == 1 || spp == 4 || spp == 2)))
765 return (
L_COMP_DATA *)ERROR_PTR(
"pix not made", __func__, NULL);
775 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", __func__, NULL);
777 fgetPngResolution(fp, &xres, &yres);
785 if ((pngcomp =
l_binaryRead(fname, &nbytespng)) == NULL)
786 return (
L_COMP_DATA *)ERROR_PTR(
"unable to read file",
795 if ((datacomp = (l_uint8 *)LEPT_CALLOC(1, nbytespng)) == NULL) {
797 return (
L_COMP_DATA *)ERROR_PTR(
"unable to allocate memory",
811 for (i = 16; i < nbytespng; i += 12) {
813 n = pngcomp[i - 8] << 24;
814 n += pngcomp[i - 7] << 16;
815 n += pngcomp[i - 6] << 8;
816 n += pngcomp[i - 5] << 0;
817 if (n >= nbytespng - i) {
821 L_ERROR(
"invalid png: i = %d, n = %d, nbytes = %zu\n", __func__,
827 if (memcmp(pngcomp + i - 4,
"IDAT", 4) == 0) {
828 memcpy(datacomp + nbytescomp, pngcomp + i, n);
833 if (cmapflag && !cmap &&
834 memcmp(pngcomp + i - 4,
"PLTE", 4) == 0) {
835 if ((n / 3) > (1 << bps)) {
839 L_ERROR(
"invalid png: i = %d, n = %d, cmapsize = %d\n",
840 __func__, i, n, (1 << bps));
844 for (j = i; j < i + n; j += 3) {
853 if (nbytescomp == 0) {
856 return (
L_COMP_DATA *)ERROR_PTR(
"invalid PNG file", __func__, NULL);
866 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
917 l_uint8 *data = NULL;
918 l_int32 w, h, xres, yres, bps, spp;
919 size_t nbytes, nbytes85;
924 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", __func__, NULL);
926 if (ascii85flag != 0 && ascii85flag != 1)
927 return (
L_COMP_DATA *)ERROR_PTR(
"wrong ascii85flags", __func__, NULL);
931 return (
L_COMP_DATA *)ERROR_PTR(
"bad jpeg metadata", __func__, NULL);
934 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", __func__, NULL);
935 fgetJpegResolution(fp, &xres, &yres);
941 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", __func__, NULL);
944 if (ascii85flag == 1) {
945 data85 = encodeAscii85(data, nbytes, &nbytes85);
948 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", __func__, NULL);
950 data85[nbytes85 - 1] =
'\0';
954 if (ascii85flag == 0) {
992 l_int32 w, h, xres, yres, bps, spp;
997 return (
L_COMP_DATA *)ERROR_PTR(
"data not defined", __func__, NULL);
1002 return (
L_COMP_DATA *)ERROR_PTR(
"bad jpeg metadata", __func__, NULL);
1008 if (ascii85flag == 1) {
1009 data85 = encodeAscii85(data, nbytes, &nbytes85);
1012 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", __func__, NULL);
1014 data85[nbytes85 - 1] =
'\0';
1018 if (ascii85flag == 0) {
1049 l_int32 w, h, bps, spp, xres, yres;
1055 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", __func__, NULL);
1058 return (
L_COMP_DATA *)ERROR_PTR(
"bad jp2k metadata", __func__, NULL);
1064 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", __func__, NULL);
1069 fgetJp2kResolution(fp, &xres, &yres);
1100 l_int32 ascii85flag)
1102 l_uint8 *datacomp = NULL;
1103 char *data85 = NULL;
1104 l_int32 w, h, xres, yres, npages;
1106 size_t nbytes85, nbytescomp;
1111 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", __func__, NULL);
1115 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", __func__, NULL);
1119 L_ERROR(
" %d page tiff; only works with 1 page\n", __func__, npages);
1125 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", __func__, NULL);
1133 &w, &h, &minisblack)) {
1134 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not extracted",
1139 if (ascii85flag == 1) {
1140 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1141 LEPT_FREE(datacomp);
1143 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", __func__, NULL);
1145 data85[nbytes85 - 1] =
'\0';
1149 if (ascii85flag == 0) {
1194 l_int32 w, h, d, maxAsp;
1198 return ERROR_INT(
"&cid not defined", __func__, 1);
1201 return ERROR_INT(
"pixs not defined", __func__, 1);
1206 if (ascii85 != 0 && ascii85 != 1)
1207 return ERROR_INT(
"invalid ascii85", __func__, 1);
1209 if (w == 0 || h == 0)
1210 return ERROR_INT(
"invalid w or h", __func__, 1);
1211 maxAsp = L_MAX(w / h, h / w);
1213 return ERROR_INT(
"max asperity > 10", __func__, 1);
1217 #if defined(HAVE_LIBZ)
1218 # if !defined(HAVE_LIBJPEG)
1220 L_WARNING(
"no libjpeg; using flate encoding\n", __func__);
1224 # if !defined(HAVE_LIBJP2K)
1226 L_WARNING(
"no libjp2k; using flate encoding\n", __func__);
1230 # if !defined(HAVE_LIBTIFF)
1232 L_WARNING(
"no libtiff; using flate encoding\n", __func__);
1239 d = pixGetDepth(pixs);
1240 cmap = pixGetColormap(pixs);
1242 L_WARNING(
"pixs has cmap; using flate encoding\n", __func__);
1245 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", __func__);
1248 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", __func__);
1254 return ERROR_INT(
"jpeg data not made", __func__, 1);
1257 return ERROR_INT(
"jp2k data not made", __func__, 1);
1260 return ERROR_INT(
"g4 data not made", __func__, 1);
1263 return ERROR_INT(
"flate data not made", __func__, 1);
1291 l_int32 ascii85flag)
1297 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", __func__, NULL);
1299 if ((pixs =
pixRead(fname)) == NULL)
1300 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not made", __func__, NULL);
1326 l_int32 ascii85flag)
1328 l_uint8 *data = NULL;
1329 l_uint8 *datacomp = NULL;
1330 char *data85 = NULL;
1331 l_uint8 *cmapdata = NULL;
1332 char *cmapdata85 = NULL;
1333 char *cmapdatahex = NULL;
1337 l_int32 w, h, d, cmapflag;
1338 size_t ncmapbytes85 = 0;
1339 size_t nbytes85 = 0;
1340 size_t nbytes, nbytescomp;
1346 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1354 cmap = pixGetColormap(pixs);
1355 cmapflag = (cmap) ? 1 : 0;
1356 if (d == 2 || d == 4 || d == 16) {
1358 cmap = pixGetColormap(pixt);
1359 d = pixGetDepth(pixt);
1360 }
else if (d == 32 && pixGetSpp(pixs) == 4) {
1366 return (
L_COMP_DATA *)ERROR_PTR(
"pixt not made", __func__, NULL);
1367 spp = (d == 32) ? 3 : 1;
1368 bps = (d == 32) ? 8 : d;
1376 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
1380 cmapdata85 = encodeAscii85(cmapdata, 3 * ncolors, &ncmapbytes85);
1382 LEPT_FREE(cmapdata);
1389 LEPT_FREE(cmapdata85);
1390 LEPT_FREE(cmapdatahex);
1391 return (
L_COMP_DATA *)ERROR_PTR(
"data not returned", __func__, NULL);
1396 LEPT_FREE(cmapdata85);
1397 LEPT_FREE(cmapdatahex);
1398 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not made", __func__, NULL);
1402 if (ascii85flag == 1) {
1403 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1404 LEPT_FREE(datacomp);
1406 LEPT_FREE(cmapdata85);
1407 LEPT_FREE(cmapdatahex);
1408 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", __func__, NULL);
1410 data85[nbytes85 - 1] =
'\0';
1415 if (ascii85flag == 0) {
1430 cid->
res = pixGetXRes(pixs);
1454 l_int32 ascii85flag,
1462 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1463 if (pixGetColormap(pixs))
1464 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", __func__, NULL);
1465 d = pixGetDepth(pixs);
1466 if (d != 8 && d != 16 && d != 32)
1467 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 8, 16 or 32 bpp",
1480 L_ERROR(
"temp file %s was not deleted\n", __func__, fname);
1509 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1510 if (pixGetColormap(pixs))
1511 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", __func__, NULL);
1512 d = pixGetDepth(pixs);
1513 if (d != 8 && d != 32)
1514 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 8 or 32 bpp", __func__, NULL);
1518 if (pixWriteJp2k(fname, pixs, quality, 5, 0, 0)) {
1526 L_ERROR(
"temp file %s was not deleted\n", __func__, fname);
1548 l_int32 ascii85flag)
1554 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
1555 if (pixGetDepth(pixs) != 1)
1556 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
1557 if (pixGetColormap(pixs))
1558 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", __func__, NULL);
1562 if (pixWrite(fname, pixs, IFF_TIFF_G4)) {
1569 L_ERROR(
"temp file %s was not deleted\n", __func__, fname);
1600 if (!pdata || !pnbytes)
1601 return ERROR_INT(
"&data and &nbytes not both defined", __func__, 1);
1605 return ERROR_INT(
"cid not defined", __func__, 1);
1610 res = DefaultInputRes;
1611 wpt = cid->
w * 72. / res;
1612 hpt = cid->
h * 72. / res;
1615 if ((lpd = pdfdataCreate(title)) == NULL)
1616 return ERROR_INT(
"lpd not made", __func__, 1);
1624 pdfdataDestroy(&lpd);
1626 return ERROR_INT(
"pdf output not made", __func__, 1);
1643 L_WARNING(
"ptr address is null!\n", __func__);
1646 if ((cid = *pcid) == NULL)
1688 return ERROR_INT(
"&data not defined", __func__, 1);
1691 return ERROR_INT(
"&nbytes not defined", __func__, 1);
1694 return ERROR_INT(
"lpd not defined", __func__, 1);
1696 generateFixedStringsPdf(lpd);
1697 generateMediaboxPdf(lpd);
1698 generatePageStringPdf(lpd);
1699 generateContentStringPdf(lpd);
1700 generatePreXStringsPdf(lpd);
1701 generateColormapStringsPdf(lpd);
1702 generateTrailerPdf(lpd);
1710 char buf[L_SMALLBUF];
1711 char *version, *datestr;
1729 if (var_WRITE_DATE_AND_VERSION) {
1731 snprintf(buf,
sizeof(buf),
"/CreationDate (D:%s)\n", datestr);
1735 snprintf(buf,
sizeof(buf),
1736 "/Producer (leptonica: %s)\n", version);
1739 snprintf(buf,
sizeof(buf),
"/Producer (leptonica)\n");
1745 snprintf(buf,
sizeof(buf),
"/Title %s\n", hexstr);
1748 L_ERROR(
"title string is not ascii\n", __func__);
1795 l_int32 i, nchar, buflen;
1798 return (
char *)ERROR_PTR(
"str not defined", __func__, NULL);
1799 nchar = strlen(str);
1800 for (i = 0; i < nchar; i++) {
1802 return (
char *)ERROR_PTR(
"str not all ascii", __func__, NULL);
1805 buflen = 4 * nchar + 10;
1806 buffer = (
char *)LEPT_CALLOC(buflen,
sizeof(
char));
1808 for (i = 0; i < nchar; i++) {
1809 snprintf(smallbuf,
sizeof(smallbuf),
"%04x", str[i]);
1821 l_float32 xpt, ypt, wpt, hpt, maxx, maxy;
1826 for (i = 0; i < lpd->
n; i++) {
1829 maxx = L_MAX(maxx, xpt + wpt);
1830 maxy = L_MAX(maxy, ypt + hpt);
1834 (l_int32)(maxy + 0.5));
1840 for (i = 0; i < lpd->
n; i++) {
1853 l_int32 bufsize, i, wpt, hpt;
1859 bufsize = 1000 + 50 * lpd->
n;
1860 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1861 return ERROR_INT(
"calloc fail for buf", __func__, 1);
1865 for (i = 0; i < lpd->
n; i++) {
1866 snprintf(buf, bufsize,
"/Im%d %d 0 R ", i + 1, 6 + i);
1873 return ERROR_INT(
"xstr not made", __func__, 1);
1876 snprintf(buf, bufsize,
"4 0 obj\n"
1880 "/MediaBox [%d %d %d %d]\n"
1884 "/XObject << %s >>\n"
1885 "/ProcSet [ /ImageB /ImageI /ImageC ]\n"
1889 0, 0, wpt, hpt, xstr);
1906 l_float32 xpt, ypt, wpt, hpt;
1909 bufsize = 1000 + 200 * lpd->
n;
1910 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1911 return ERROR_INT(
"calloc fail for buf", __func__, 1);
1914 for (i = 0; i < lpd->
n; i++) {
1917 snprintf(buf, bufsize,
1918 "q %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
1919 wpt, 0.0, 0.0, hpt, xpt, ypt, i + 1);
1926 return ERROR_INT(
"cstr not made", __func__, 1);
1929 snprintf(buf, bufsize,
"5 0 obj\n"
1930 "<< /Length %d >>\n"
1935 (l_int32)strlen(cstr), cstr);
1951 char *cstr, *bstr, *fstr, *pstr, *xstr, *photometry;
1957 cmindex = 6 + lpd->
n;
1958 for (i = 0; i < lpd->
n; i++) {
1960 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
1961 return ERROR_INT(
"cid not found", __func__, 1);
1964 if (var_WRITE_G4_IMAGE_MASK) {
1966 "/ColorSpace /DeviceGray");
1968 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1970 bstr =
stringNew(
"/BitsPerComponent 1\n"
1971 "/Interpolate true");
1980 snprintf(buff,
sizeof(buff),
1981 "/Filter /CCITTFaxDecode\n"
1987 ">>", photometry, cid->
w);
1989 LEPT_FREE(photometry);
1992 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1993 else if (cid->
spp == 3)
1994 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1995 else if (cid->
spp == 4)
1996 cstr =
stringNew(
"/ColorSpace /DeviceCMYK");
1998 L_ERROR(
"in jpeg: spp != 1, 3 or 4\n", __func__);
1999 bstr =
stringNew(
"/BitsPerComponent 8");
2003 cstr =
stringNew(
"/ColorSpace /DeviceGray");
2004 else if (cid->
spp == 3)
2005 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
2007 L_ERROR(
"in jp2k: spp != 1 && spp != 3\n", __func__);
2008 bstr =
stringNew(
"/BitsPerComponent 8");
2012 snprintf(buff,
sizeof(buff),
"/ColorSpace %d 0 R", cmindex++);
2015 if (cid->
spp == 1 && cid->
bps == 1)
2016 cstr =
stringNew(
"/ColorSpace /DeviceGray\n"
2018 else if (cid->
spp == 1)
2019 cstr =
stringNew(
"/ColorSpace /DeviceGray");
2020 else if (cid->
spp == 3)
2021 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
2023 L_ERROR(
"unknown colorspace: spp = %d\n",
2024 __func__, cid->
spp);
2026 snprintf(buff,
sizeof(buff),
"/BitsPerComponent %d", cid->
bps);
2028 fstr =
stringNew(
"/Filter /FlateDecode");
2030 snprintf(buff,
sizeof(buff),
2036 " /BitsPerComponent %d\n"
2037 ">>\n", cid->
w, cid->
spp, cid->
bps);
2044 snprintf(buf,
sizeof(buf),
2058 cid->
w, cid->
h, bstr, fstr, pstr);
2078 l_int32 i, cmindex, ncmap;
2086 cmindex = 6 + lpd->
n;
2088 for (i = 0; i < lpd->
n; i++) {
2089 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
2090 return ERROR_INT(
"cid not found", __func__, 1);
2091 if (cid->
ncolors == 0)
continue;
2094 snprintf(buf,
sizeof(buf),
"%d 0 obj\n"
2095 "[ /Indexed /DeviceRGB\n"
2115 l_int32 i, n, size, linestart;
2116 L_DNA *daloc, *dasize;
2141 for (i = 0; i < n; i++) {
2149 lpd->
trailer = makeTrailerStringPdf(daloc);
2154 makeTrailerStringPdf(
L_DNA *daloc)
2158 l_int32 i, n, linestart, xrefloc;
2162 return (
char *)ERROR_PTR(
"daloc not defined", __func__, NULL);
2166 snprintf(buf,
sizeof(buf),
"xref\n"
2168 "0000000000 65535 f \n", n);
2170 for (i = 1; i < n; i++) {
2172 snprintf(buf,
sizeof(buf),
"%010d 00000 n \n", linestart);
2177 snprintf(buf,
sizeof(buf),
"trailer\n"
2185 "%%%%EOF\n", n, xrefloc);
2213 l_int32 nimages, i, len;
2214 l_int32 *sizes, *locs;
2219 return ERROR_INT(
"&data not defined", __func__, 1);
2222 return ERROR_INT(
"&nbytes not defined", __func__, 1);
2225 if ((data = (l_uint8 *)LEPT_CALLOC(nbytes,
sizeof(l_uint8))) == NULL)
2226 return ERROR_INT(
"calloc fail for data", __func__, 1);
2231 memcpy(data, lpd->
id, sizes[0]);
2232 memcpy(data + locs[1], lpd->
obj1, sizes[1]);
2233 memcpy(data + locs[2], lpd->
obj2, sizes[2]);
2234 memcpy(data + locs[3], lpd->
obj3, sizes[3]);
2235 memcpy(data + locs[4], lpd->
obj4, sizes[4]);
2236 memcpy(data + locs[5], lpd->
obj5, sizes[5]);
2241 for (i = 0; i < nimages; i++) {
2242 if ((cid = pdfdataGetCid(lpd, i)) == NULL) {
2245 return ERROR_INT(
"cid not found", __func__, 1);
2249 memcpy(data + locs[6 + i], str, len);
2250 memcpy(data + locs[6 + i] + len,
2252 memcpy(data + locs[6 + i] + len + cid->
nbytescomp,
2257 for (i = 0; i < lpd->
ncmap; i++) {
2259 memcpy(data + locs[6 + nimages + i], str, strlen(str));
2287 l_int32 i, j, start, startloc, xrefloc, found, loc, nobj, objno, trailer_ok;
2289 L_DNA *da, *daobj, *daxref;
2293 return ERROR_INT(
"&da not defined", __func__, 1);
2296 return ERROR_INT(
"bas not defined", __func__, 1);
2298 if (memcmp(data,
"%PDF-1.", 7) != 0)
2299 return ERROR_INT(
"PDF header signature not found", __func__, 1);
2306 (l_uint8 *)
"startxref\n", 10, &loc, &found);
2308 return ERROR_INT(
"startxref not found!", __func__, 1);
2309 if (sscanf((
char *)(data + start + loc + 10),
"%d\n", &xrefloc) != 1)
2310 return ERROR_INT(
"xrefloc not found!", __func__, 1);
2311 if (xrefloc < 0 || xrefloc >= size)
2312 return ERROR_INT(
"invalid xrefloc!", __func__, 1);
2315 if ((sscanf(str,
"0 %d", &nobj)) != 1) {
2317 return ERROR_INT(
"nobj not found", __func__, 1);
2324 for (i = 0; i < nobj; i++) {
2326 sscanf(str,
"%d", &startloc);
2332 lept_stderr(
"************** Trailer string ************\n");
2336 lept_stderr(
"************** Object locations ************");
2343 for (i = 1; i < nobj; i++) {
2345 if ((sscanf((
char *)(data + startloc),
"%d 0 obj", &objno)) != 1) {
2346 L_ERROR(
"bad trailer for object %d\n", __func__, i);
2354 L_INFO(
"rebuilding pdf trailer\n", __func__);
2359 for (i = 0; i < nobj; i++) {
2361 for (j = loc - 1; j > 0; j--) {
2379 generatePagesObjStringPdf(
NUMA *napage)
2383 l_int32 i, n, index, bufsize;
2387 return (
char *)ERROR_PTR(
"napage not defined", __func__, NULL);
2390 bufsize = 100 + 16 * n;
2391 buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char));
2393 for (i = 0; i < n; i++) {
2395 snprintf(buf, bufsize,
" %d 0 R ", index);
2400 snprintf(buf, bufsize - 1,
"3 0 obj\n"
2435 l_uint8 space =
' ';
2438 l_int32 start, nrepl, i, j, nobjs, objin, objout, found;
2439 l_int32 *objs, *matches;
2445 return (
L_BYTEA *)ERROR_PTR(
"bas not defined", __func__, NULL);
2447 return (
L_BYTEA *)ERROR_PTR(
"na_objs not defined", __func__, NULL);
2455 sscanf((
char *)datas,
"%d", &objin);
2456 if (objin < 0 || objin >= nobjs) {
2457 L_ERROR(
"index %d into array of size %d\n", __func__, objin, nobjs);
2461 objout = objs[objin];
2462 snprintf((
char *)buf, 32,
"%d", objout);
2477 for (i = 0; i < nrepl; i++) {
2479 for (j = matches[i] - 1; j > 0; j--) {
2480 if (datas[j] == space)
2485 sscanf((
char *)(datas + j + 1),
"%d", &objin);
2486 if (objin < 0 || objin >= nobjs) {
2487 L_ERROR(
"index %d into array of size %d\n", __func__, objin, nobjs);
2493 objout = objs[objin];
2494 snprintf((
char *)buf, 32,
"%d", objout);
2511 pdfdataCreate(
const char *title)
2535 L_WARNING(
"ptr address is null!\n", __func__);
2538 if ((lpd = *plpd) == NULL)
2542 for (i = 0; i < lpd->
n; i++) {
2548 if (lpd->
id) LEPT_FREE(lpd->
id);
2549 if (lpd->
obj1) LEPT_FREE(lpd->
obj1);
2550 if (lpd->
obj2) LEPT_FREE(lpd->
obj2);
2551 if (lpd->
obj3) LEPT_FREE(lpd->
obj3);
2552 if (lpd->
obj4) LEPT_FREE(lpd->
obj4);
2553 if (lpd->
obj5) LEPT_FREE(lpd->
obj5);
2573 return (
L_COMP_DATA *)ERROR_PTR(
"lpd not defined", __func__, NULL);
2574 if (index < 0 || index >= lpd->
n)
2575 return (
L_COMP_DATA *)ERROR_PTR(
"invalid image index", __func__, NULL);
2601 var_WRITE_G4_IMAGE_MASK = flag;
2621 var_WRITE_DATE_AND_VERSION = flag;
PIX * pixAlphaBlendUniform(PIX *pixs, l_uint32 color)
pixAlphaBlendUniform()
l_ok boxGetGeometry(const BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
void boxDestroy(BOX **pbox)
boxDestroy()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
l_uint8 * l_byteaCopyData(L_BYTEA *ba, size_t *psize)
l_byteaCopyData()
size_t l_byteaGetSize(L_BYTEA *ba)
l_byteaGetSize()
l_ok l_byteaFindEachSequence(L_BYTEA *ba, const l_uint8 *sequence, size_t seqlen, L_DNA **pda)
l_byteaFindEachSequence()
l_uint8 * l_byteaGetData(L_BYTEA *ba, size_t *psize)
l_byteaGetData()
L_BYTEA * l_byteaCreate(size_t nbytes)
l_byteaCreate()
void l_byteaDestroy(L_BYTEA **pba)
l_byteaDestroy()
L_BYTEA * l_byteaInitFromMem(const l_uint8 *data, size_t size)
l_byteaInitFromMem()
l_ok l_byteaAppendString(L_BYTEA *ba, const char *str)
l_byteaAppendString()
l_ok l_byteaAppendData(L_BYTEA *ba, const l_uint8 *newdata, size_t newbytes)
l_byteaAppendData()
void pixcmapDestroy(PIXCMAP **pcmap)
pixcmapDestroy()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
l_ok pixcmapSerializeToMemory(PIXCMAP *cmap, l_int32 cpc, l_int32 *pncolors, l_uint8 **pdata)
pixcmapSerializeToMemory()
char * pixcmapConvertToHex(l_uint8 *data, l_int32 ncolors)
pixcmapConvertToHex()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
L_DNA * l_dnaCreate(l_int32 n)
l_dnaCreate()
l_ok l_dnaGetIValue(L_DNA *da, l_int32 index, l_int32 *pival)
l_dnaGetIValue()
l_ok l_dnaAddNumber(L_DNA *da, l_float64 val)
l_dnaAddNumber()
L_DNA * l_dnaaGetDna(L_DNAA *daa, l_int32 index, l_int32 accessflag)
l_dnaaGetDna()
l_ok l_dnaEmpty(L_DNA *da)
l_dnaEmpty()
L_DNAA * l_dnaaCreate(l_int32 n)
l_dnaaCreate()
l_ok l_dnaaAddDna(L_DNAA *daa, L_DNA *da, l_int32 copyflag)
l_dnaaAddDna()
l_ok l_dnaWriteStderr(L_DNA *da)
l_dnaWriteStrderr()
void l_dnaDestroy(L_DNA **pda)
l_dnaDestroy()
l_int32 * l_dnaGetIArray(L_DNA *da)
l_dnaGetIArray()
l_int32 l_dnaGetCount(L_DNA *da)
l_dnaGetCount()
void l_dnaaDestroy(L_DNAA **pdaa)
l_dnaaDestroy()
L_DNA * l_dnaDiffAdjValues(L_DNA *das)
l_dnaDiffAdjValues()
l_ok readHeaderMemJpeg(const l_uint8 *data, size_t size, l_int32 *pw, l_int32 *ph, l_int32 *pspp, l_int32 *pycck, l_int32 *pcmyk)
readHeaderMemJpeg()
l_ok readResolutionMemJpeg(const l_uint8 *data, size_t size, l_int32 *pxres, l_int32 *pyres)
readResolutionMemJpeg()
l_ok readHeaderJpeg(const char *filename, l_int32 *pw, l_int32 *ph, l_int32 *pspp, l_int32 *pycck, l_int32 *pcmyk)
readHeaderJpeg()
l_ok pixWriteJpeg(const char *filename, PIX *pix, l_int32 quality, l_int32 progressive)
pixWriteJpeg()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_ok numaReplaceNumber(NUMA *na, l_int32 index, l_float32 val)
numaReplaceNumber()
l_ok numaWriteStderr(NUMA *na)
numaWriteStderr()
NUMA * numaCreate(l_int32 n)
numaCreate()
NUMA * numaaGetNuma(NUMAA *naa, l_int32 index, l_int32 accessflag)
numaaGetNuma()
l_ok numaaWriteStream(FILE *fp, NUMAA *naa)
numaaWriteStream()
void numaDestroy(NUMA **pna)
numaDestroy()
NUMAA * numaaCreate(l_int32 n)
numaaCreate()
l_ok numaSetValue(NUMA *na, l_int32 index, l_float32 val)
numaSetValue()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_ok numaaAddNuma(NUMAA *naa, NUMA *na, l_int32 copyflag)
numaaAddNuma()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
void numaaDestroy(NUMAA **pnaa)
numaaDestroy()
NUMA * numaMakeConstant(l_float32 val, l_int32 size)
numaMakeConstant()
NUMA * numaMakeSequence(l_float32 startval, l_float32 increment, l_int32 size)
numaMakeSequence()
l_ok pixaConvertToPdf(PIXA *pixa, l_int32 res, l_float32 scalefactor, l_int32 type, l_int32 quality, const char *title, const char *fileout)
pixaConvertToPdf()
l_ok selectDefaultPdfEncoding(PIX *pix, l_int32 *ptype)
selectDefaultPdfEncoding()
L_COMP_DATA * l_generateG4Data(const char *fname, l_int32 ascii85flag)
l_generateG4Data()
L_COMP_DATA * l_generateJpegDataMem(l_uint8 *data, size_t nbytes, l_int32 ascii85flag)
l_generateJpegDataMem()
L_COMP_DATA * l_generateJpegData(const char *fname, l_int32 ascii85flag)
l_generateJpegData()
void l_CIDataDestroy(L_COMP_DATA **pcid)
l_CIDataDestroy()
l_ok pixGenerateCIData(PIX *pixs, l_int32 type, l_int32 quality, l_int32 ascii85, L_COMP_DATA **pcid)
pixGenerateCIData()
L_COMP_DATA * l_generateFlateData(const char *fname, l_int32 ascii85flag)
l_generateFlateData()
static L_COMP_DATA * pixGenerateFlateData(PIX *pixs, l_int32 ascii85flag)
pixGenerateFlateData()
l_ok pixConvertToPdfData(PIX *pix, l_int32 type, l_int32 quality, l_uint8 **pdata, size_t *pnbytes, l_int32 x, l_int32 y, l_int32 res, const char *title, L_PDF_DATA **plpd, l_int32 position)
pixConvertToPdfData()
L_COMP_DATA * l_generateFlateDataPdf(const char *fname, PIX *pixs)
l_generateFlateDataPdf()
static char * generateEscapeString(const char *str)
generateEscapeString()
static L_COMP_DATA * pixGenerateJpegData(PIX *pixs, l_int32 ascii85flag, l_int32 quality)
pixGenerateJpegData()
void l_pdfSetDateAndVersion(l_int32 flag)
l_pdfSetDateAndVersion()
static L_BYTEA * substituteObjectNumbers(L_BYTEA *bas, NUMA *na_objs)
substituteObjectNumbers()
l_ok convertTiffMultipageToPdf(const char *filein, const char *fileout)
convertTiffMultipageToPdf()
l_ok l_generateCIData(const char *fname, l_int32 type, l_int32 quality, l_int32 ascii85, L_COMP_DATA **pcid)
l_generateCIData()
l_ok ptraConcatenatePdfToData(L_PTRA *pa_data, SARRAY *sa, l_uint8 **pdata, size_t *pnbytes)
ptraConcatenatePdfToData()
static l_int32 parseTrailerPdf(L_BYTEA *bas, L_DNA **pda)
parseTrailerPdf()
static L_COMP_DATA * pixGenerateG4Data(PIX *pixs, l_int32 ascii85flag)
pixGenerateG4Data()
void l_pdfSetG4ImageMask(l_int32 flag)
l_pdfSetG4ImageMask()
l_ok cidConvertToPdfData(L_COMP_DATA *cid, const char *title, l_uint8 **pdata, size_t *pnbytes)
cidConvertToPdfData()
static L_COMP_DATA * l_generateJp2kData(const char *fname)
l_generateJp2kData()
static l_int32 l_generatePdf(l_uint8 **pdata, size_t *pnbytes, L_PDF_DATA *lpd)
l_generatePdf()
l_ok l_generateCIDataForPdf(const char *fname, PIX *pix, l_int32 quality, L_COMP_DATA **pcid)
l_generateCIDataForPdf()
static l_int32 generateOutputDataPdf(l_uint8 **pdata, size_t *pnbytes, L_PDF_DATA *lpd)
generateOutputDataPdf()
static L_COMP_DATA * pixGenerateJp2kData(PIX *pixs, l_int32 quality)
pixGenerateJp2kData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixClone(PIX *pixs)
pixClone()
l_ok pixGetRasterData(PIX *pixs, l_uint8 **pdata, size_t *pnbytes)
pixGetRasterData()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
l_ok readHeaderPng(const char *filename, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
readHeaderPng()
l_ok isPngInterlaced(const char *filename, l_int32 *pinterlaced)
isPngInterlaced()
l_ok freadHeaderPng(FILE *fp, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
freadHeaderPng()
l_ok ptaSetPt(PTA *pta, l_int32 index, l_float32 x, l_float32 y)
ptaSetPt()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
l_ok ptaGetPt(PTA *pta, l_int32 index, l_float32 *px, l_float32 *py)
ptaGetPt()
PTA * ptaCreate(l_int32 n)
ptaCreate()
void ptaDestroy(PTA **ppta)
ptaDestroy()
L_PTRA * ptraCreate(l_int32 n)
ptraCreate()
l_ok ptraGetActualCount(L_PTRA *pa, l_int32 *pcount)
ptraGetActualCount()
l_ok ptraCompactArray(L_PTRA *pa)
ptraCompactArray()
l_ok ptraAdd(L_PTRA *pa, void *item)
ptraAdd()
void ptraDestroy(L_PTRA **ppa, l_int32 freeflag, l_int32 warnflag)
ptraDestroy()
void * ptraRemove(L_PTRA *pa, l_int32 index, l_int32 flag)
ptraRemove()
void * ptraGetPtrToItem(L_PTRA *pa, l_int32 index)
ptraGetPtrToItem()
l_ok pixReadHeader(const char *filename, l_int32 *pformat, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
pixReadHeader()
l_ok findFileFormat(const char *filename, l_int32 *pformat)
findFileFormat()
PIX * pixRead(const char *filename)
pixRead()
l_int32 fileFormatIsTiff(FILE *fp)
fileFormatIsTiff()
SARRAY * sarrayCreate(l_int32 n)
sarrayCreate()
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
l_ok sarrayWriteStderr(SARRAY *sa)
sarrayWriteStderr()
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
SARRAY * sarrayCreateLinesFromString(const char *string, l_int32 blankflag)
sarrayCreateLinesFromString()
l_ok sarrayAddString(SARRAY *sa, const char *string, l_int32 copyflag)
sarrayAddString()
char * sarrayToString(SARRAY *sa, l_int32 addnlflag)
sarrayToString()
l_ok getTiffResolution(FILE *fp, l_int32 *pxres, l_int32 *pyres)
getTiffResolution()
l_ok tiffGetCount(FILE *fp, l_int32 *pn)
tiffGetCount()
PIXA * pixaReadMultipageTiff(const char *filename)
pixaReadMultipageTiff()
l_ok extractG4DataFromFile(const char *filein, l_uint8 **pdata, size_t *pnbytes, l_int32 *pw, l_int32 *ph, l_int32 *pminisblack)
extractG4DataFromFile()
void lept_stderr(const char *fmt,...)
lept_stderr()
char * l_getFormattedDate(void)
l_getFormattedDate()
char * getLeptonicaVersion(void)
getLeptonicaVersion()
char * stringNew(const char *src)
stringNew()
l_int32 lept_rmfile(const char *filepath)
lept_rmfile()
char * l_makeTempFilename(void)
l_makeTempFilename()
l_int32 stringCat(char *dest, size_t size, const char *src)
stringCat()
L_DNA * arrayFindEachSequence(const l_uint8 *data, size_t datalen, const l_uint8 *sequence, size_t seqlen)
arrayFindEachSequence()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_uint8 * l_binaryRead(const char *filename, size_t *pnbytes)
l_binaryRead()
l_ok arrayFindSequence(const l_uint8 *data, size_t datalen, const l_uint8 *sequence, size_t seqlen, l_int32 *poffset, l_int32 *pfound)
arrayFindSequence()
l_uint8 * zlibCompress(const l_uint8 *datain, size_t nin, size_t *pnout)
zlibCompress()