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;
207 PROCNAME(
"pixConvertToPdfData");
210 return ERROR_INT(
"&data not defined", procName, 1);
213 return ERROR_INT(
"&nbytes not defined", procName, 1);
216 return ERROR_INT(
"pix not defined", procName, 1);
230 return ERROR_INT(
"cid not made", procName, 1);
242 res = DefaultInputRes;
251 if ((lpd = pdfdataCreate(title)) == NULL)
252 return ERROR_INT(
"lpd not made", procName, 1);
254 if ((lpd = pdfdataCreate(title)) == NULL)
255 return ERROR_INT(
"lpd not made", procName, 1);
271 pdfdataDestroy(&lpd);
272 if (plpd) *plpd = NULL;
274 return ERROR_INT(
"pdf output not made", procName, 1);
326 char *fname, *str_pages, *str_trailer;
327 l_uint8 *pdfdata, *data;
328 l_int32 i, j, index, nobj, npages;
329 l_int32 *sizes, *locs;
331 L_BYTEA *bas, *bad, *bat1, *bat2;
332 L_DNA *da_locs, *da_sizes, *da_outlocs, *da;
334 NUMA *na_objs, *napage;
337 PROCNAME(
"ptraConcatenatePdfToData");
340 return ERROR_INT(
"&data not defined", procName, 1);
343 return ERROR_INT(
"&nbytes not defined", procName, 1);
346 return ERROR_INT(
"pa_data not defined", procName, 1);
352 for (i = 0; i < npages; i++) {
359 L_ERROR(
"can't parse file %s; skipping\n", procName, fname);
361 L_ERROR(
"can't parse file %d; skipping\n", procName, i);
373 return ERROR_INT(
"no parsable pdf files found", procName, 1);
380 for (i = 0; i < npages; i++) {
391 for (j = 4; j < nobj - 1; j++)
399 str_pages = generatePagesObjStringPdf(napage);
404 for (i = 0; i < npages; i++) {
418 for (j = 0; j < 4; j++)
421 for (j = 4; j < nobj; j++) {
440 str_trailer = makeTrailerStringPdf(da_outlocs);
451 lept_stderr(
"******** Page object numbers ***********");
454 lept_stderr(
"******** Pages object ***********\n");
462 LEPT_FREE(str_pages);
463 LEPT_FREE(str_trailer);
492 PROCNAME(
"convertTiffMultipageToPdf");
495 return ERROR_INT(
"file not found", procName, 1);
499 return ERROR_INT(
"file not tiff format", procName, 1);
544 l_int32 format, type;
548 PROCNAME(
"l_generateCIDataForPdf");
551 return ERROR_INT(
"&cid not defined", procName, 1);
554 return ERROR_INT(
"neither fname nor pix are defined", procName, 1);
558 if (fname && strcmp(fname,
"-") != 0 && strcmp(fname,
"stdin") != 0) {
560 if (format == IFF_UNKNOWN)
561 L_WARNING(
"file %s format is unknown\n", procName, fname);
562 if (format == IFF_PS || format == IFF_LPDF) {
563 L_ERROR(
"file %s is unsupported format %d\n",
564 procName, fname, format);
567 if (format == IFF_JFIF_JPEG) {
569 }
else if (format == IFF_JP2) {
571 }
else if (format == IFF_PNG) {
584 return ERROR_INT(
"pixt not made", procName, 1);
593 L_ERROR(
"totally kerflummoxed\n", procName);
632 l_int32 format, d, bps, spp, iscmap;
636 PROCNAME(
"l_generateCIData");
639 return ERROR_INT(
"&cid not defined", procName, 1);
642 return ERROR_INT(
"fname not defined", procName, 1);
645 return ERROR_INT(
"invalid conversion type", procName, 1);
646 if (ascii85 != 0 && ascii85 != 1)
647 return ERROR_INT(
"invalid ascii85", procName, 1);
650 pixReadHeader(fname, &format, NULL, NULL, &bps, &spp, &iscmap);
654 L_WARNING(
"pixs has cmap; using flate encoding\n", procName);
657 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
660 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
663 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", procName);
668 if (format == IFF_JFIF_JPEG) {
671 if ((pix =
pixRead(fname)) == NULL)
672 return ERROR_INT(
"pix not returned for JPEG", procName, 1);
677 return ERROR_INT(
"jpeg data not made", procName, 1);
679 if (format == IFF_JP2) {
682 if ((pix =
pixRead(fname)) == NULL)
683 return ERROR_INT(
"pix not returned for JP2K", procName, 1);
688 return ERROR_INT(
"jp2k data not made", procName, 1);
690 if ((pix =
pixRead(fname)) == NULL)
691 return ERROR_INT(
"pix not returned for G4", procName, 1);
695 return ERROR_INT(
"g4 data not made", procName, 1);
698 return ERROR_INT(
"flate data not made", procName, 1);
700 return ERROR_INT(
"invalid conversion type", procName, 1);
733 l_uint8 *pngcomp = NULL;
734 l_uint8 *datacomp = NULL;
735 l_uint8 *cmapdata = NULL;
736 char *cmapdatahex = NULL;
738 l_int32 format, interlaced;
742 l_int32 w, h, cmapflag;
744 size_t nbytescomp = 0, nbytespng = 0;
750 PROCNAME(
"l_generateFlateDataPdf");
753 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
759 if (format == IFF_PNG) {
762 return (
L_COMP_DATA *)ERROR_PTR(
"bad png input", procName, NULL);
773 if (format != IFF_PNG ||
774 (format == IFF_PNG && (interlaced || bps == 1 || spp == 4 || spp == 2)))
781 return (
L_COMP_DATA *)ERROR_PTR(
"pix not made", procName, NULL);
791 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
793 fgetPngResolution(fp, &xres, &yres);
801 if ((pngcomp =
l_binaryRead(fname, &nbytespng)) == NULL)
802 return (
L_COMP_DATA *)ERROR_PTR(
"unable to read file",
811 if ((datacomp = (l_uint8 *)LEPT_CALLOC(1, nbytespng)) == NULL) {
813 return (
L_COMP_DATA *)ERROR_PTR(
"unable to allocate memory",
827 for (i = 16; i < nbytespng; i += 12) {
829 n = pngcomp[i - 8] << 24;
830 n += pngcomp[i - 7] << 16;
831 n += pngcomp[i - 6] << 8;
832 n += pngcomp[i - 5] << 0;
833 if (n >= nbytespng - i) {
837 L_ERROR(
"invalid png: i = %d, n = %d, nbytes = %zu\n", procName,
843 if (memcmp(pngcomp + i - 4,
"IDAT", 4) == 0) {
844 memcpy(datacomp + nbytescomp, pngcomp + i, n);
849 if (cmapflag && !cmap &&
850 memcmp(pngcomp + i - 4,
"PLTE", 4) == 0) {
851 if ((n / 3) > (1 << bps)) {
855 L_ERROR(
"invalid png: i = %d, n = %d, cmapsize = %d\n",
856 procName, i, n, (1 << bps));
860 for (j = i; j < i + n; j += 3) {
869 if (nbytescomp == 0) {
872 return (
L_COMP_DATA *)ERROR_PTR(
"invalid PNG file", procName, NULL);
882 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
933 l_uint8 *data = NULL;
934 l_int32 w, h, xres, yres, bps, spp;
935 size_t nbytes, nbytes85;
939 PROCNAME(
"l_generateJpegData");
942 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
946 return (
L_COMP_DATA *)ERROR_PTR(
"bad jpeg metadata", procName, NULL);
949 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
950 fgetJpegResolution(fp, &xres, &yres);
956 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", procName, NULL);
959 if (ascii85flag == 1) {
960 data85 = encodeAscii85(data, nbytes, &nbytes85);
963 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
965 data85[nbytes85 - 1] =
'\0';
969 if (ascii85flag == 0) {
1004 l_int32 ascii85flag)
1006 char *data85 = NULL;
1007 l_int32 w, h, xres, yres, bps, spp;
1011 PROCNAME(
"l_generateJpegDataMem");
1014 return (
L_COMP_DATA *)ERROR_PTR(
"data not defined", procName, NULL);
1019 return (
L_COMP_DATA *)ERROR_PTR(
"bad jpeg metadata", procName, NULL);
1025 if (ascii85flag == 1) {
1026 data85 = encodeAscii85(data, nbytes, &nbytes85);
1029 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1031 data85[nbytes85 - 1] =
'\0';
1035 if (ascii85flag == 0) {
1066 l_int32 w, h, bps, spp, xres, yres;
1071 PROCNAME(
"l_generateJp2kData");
1074 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1077 return (
L_COMP_DATA *)ERROR_PTR(
"bad jp2k metadata", procName, NULL);
1083 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", procName, NULL);
1088 fgetJp2kResolution(fp, &xres, &yres);
1119 l_int32 ascii85flag)
1121 l_uint8 *datacomp = NULL;
1122 char *data85 = NULL;
1123 l_int32 w, h, xres, yres, npages;
1125 size_t nbytes85, nbytescomp;
1129 PROCNAME(
"l_generateG4Data");
1132 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1136 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
1140 L_ERROR(
" %d page tiff; only works with 1 page\n", procName, npages);
1153 &w, &h, &minisblack)) {
1154 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not extracted",
1159 if (ascii85flag == 1) {
1160 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1161 LEPT_FREE(datacomp);
1163 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1165 data85[nbytes85 - 1] =
'\0';
1169 if (ascii85flag == 0) {
1216 PROCNAME(
"pixGenerateCIData");
1219 return ERROR_INT(
"&cid not defined", procName, 1);
1222 return ERROR_INT(
"pixs not defined", procName, 1);
1227 if (ascii85 != 0 && ascii85 != 1)
1228 return ERROR_INT(
"invalid ascii85", procName, 1);
1232 #if defined(HAVE_LIBZ) 1233 # if !defined(HAVE_LIBJPEG) 1235 L_WARNING(
"no libjpeg; using flate encoding\n", procName);
1239 # if !defined(HAVE_LIBJP2K) 1241 L_WARNING(
"no libjp2k; using flate encoding\n", procName);
1245 # if !defined(HAVE_LIBTIFF) 1247 L_WARNING(
"no libtiff; using flate encoding\n", procName);
1254 d = pixGetDepth(pixs);
1255 cmap = pixGetColormap(pixs);
1257 L_WARNING(
"pixs has cmap; using flate encoding\n", procName);
1260 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
1263 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", procName);
1269 return ERROR_INT(
"jpeg data not made", procName, 1);
1272 return ERROR_INT(
"jp2k data not made", procName, 1);
1275 return ERROR_INT(
"g4 data not made", procName, 1);
1278 return ERROR_INT(
"flate data not made", procName, 1);
1306 l_int32 ascii85flag)
1311 PROCNAME(
"l_generateFlateData");
1314 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1316 if ((pixs =
pixRead(fname)) == NULL)
1317 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not made", procName, NULL);
1343 l_int32 ascii85flag)
1345 l_uint8 *data = NULL;
1346 l_uint8 *datacomp = NULL;
1347 char *data85 = NULL;
1348 l_uint8 *cmapdata = NULL;
1349 char *cmapdata85 = NULL;
1350 char *cmapdatahex = NULL;
1354 l_int32 w, h, d, cmapflag;
1355 size_t ncmapbytes85 = 0;
1356 size_t nbytes85 = 0;
1357 size_t nbytes, nbytescomp;
1362 PROCNAME(
"pixGenerateFlateData");
1365 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1373 cmap = pixGetColormap(pixs);
1374 cmapflag = (cmap) ? 1 : 0;
1375 if (d == 2 || d == 4 || d == 16) {
1377 cmap = pixGetColormap(pixt);
1378 d = pixGetDepth(pixt);
1379 }
else if (d == 32 && pixGetSpp(pixs) == 4) {
1384 spp = (d == 32) ? 3 : 1;
1385 bps = (d == 32) ? 8 : d;
1393 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
1397 cmapdata85 = encodeAscii85(cmapdata, 3 * ncolors, &ncmapbytes85);
1399 LEPT_FREE(cmapdata);
1408 LEPT_FREE(cmapdata85);
1409 LEPT_FREE(cmapdatahex);
1410 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not made", procName, NULL);
1414 if (ascii85flag == 1) {
1415 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1416 LEPT_FREE(datacomp);
1418 LEPT_FREE(cmapdata85);
1419 LEPT_FREE(cmapdatahex);
1420 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1422 data85[nbytes85 - 1] =
'\0';
1427 if (ascii85flag == 0) {
1442 cid->
res = pixGetXRes(pixs);
1465 l_int32 ascii85flag,
1472 PROCNAME(
"pixGenerateJpegData");
1475 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1476 if (pixGetColormap(pixs))
1477 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", procName, NULL);
1478 d = pixGetDepth(pixs);
1479 if (d != 8 && d != 32)
1480 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
1492 L_ERROR(
"temp file %s was not deleted\n", procName, fname);
1520 PROCNAME(
"pixGenerateJp2kData");
1523 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1524 if (pixGetColormap(pixs))
1525 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", procName, NULL);
1526 d = pixGetDepth(pixs);
1527 if (d != 8 && d != 32)
1528 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
1532 if (pixWriteJp2k(fname, pixs, quality, 5, 0, 0)) {
1540 L_ERROR(
"temp file %s was not deleted\n", procName, fname);
1562 l_int32 ascii85flag)
1567 PROCNAME(
"pixGenerateG4Data");
1570 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1571 if (pixGetDepth(pixs) != 1)
1572 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
1573 if (pixGetColormap(pixs))
1574 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", procName, NULL);
1578 if (pixWrite(fname, pixs, IFF_TIFF_G4)) {
1585 L_ERROR(
"temp file %s was not deleted\n", procName, fname);
1616 PROCNAME(
"cidConvertToPdfData");
1618 if (!pdata || !pnbytes)
1619 return ERROR_INT(
"&data and &nbytes not both defined", procName, 1);
1623 return ERROR_INT(
"cid not defined", procName, 1);
1628 res = DefaultInputRes;
1629 wpt = cid->
w * 72. / res;
1630 hpt = cid->
h * 72. / res;
1633 if ((lpd = pdfdataCreate(title)) == NULL)
1634 return ERROR_INT(
"lpd not made", procName, 1);
1642 pdfdataDestroy(&lpd);
1644 return ERROR_INT(
"pdf output not made", procName, 1);
1660 PROCNAME(
"l_CIDataDestroy");
1663 L_WARNING(
"ptr address is null!\n", procName);
1666 if ((cid = *pcid) == NULL)
1707 PROCNAME(
"l_generatePdf");
1710 return ERROR_INT(
"&data not defined", procName, 1);
1713 return ERROR_INT(
"&nbytes not defined", procName, 1);
1716 return ERROR_INT(
"lpd not defined", procName, 1);
1718 generateFixedStringsPdf(lpd);
1719 generateMediaboxPdf(lpd);
1720 generatePageStringPdf(lpd);
1721 generateContentStringPdf(lpd);
1722 generatePreXStringsPdf(lpd);
1723 generateColormapStringsPdf(lpd);
1724 generateTrailerPdf(lpd);
1732 char buf[L_SMALLBUF];
1733 char *version, *datestr;
1736 PROCNAME(
"generateFixedStringsPdf");
1753 if (var_WRITE_DATE_AND_VERSION) {
1755 snprintf(buf,
sizeof(buf),
"/CreationDate (D:%s)\n", datestr);
1759 snprintf(buf,
sizeof(buf),
1760 "/Producer (leptonica: %s)\n", version);
1763 snprintf(buf,
sizeof(buf),
"/Producer (leptonica)\n");
1769 snprintf(buf,
sizeof(buf),
"/Title %s\n", hexstr);
1772 L_ERROR(
"title string is not ascii\n", procName);
1819 l_int32 i, nchar, buflen;
1821 PROCNAME(
"generateEscapeString");
1824 return (
char *)ERROR_PTR(
"str not defined", procName, NULL);
1825 nchar = strlen(str);
1826 for (i = 0; i < nchar; i++) {
1828 return (
char *)ERROR_PTR(
"str not all ascii", procName, NULL);
1831 buflen = 4 * nchar + 10;
1832 buffer = (
char *)LEPT_CALLOC(buflen,
sizeof(
char));
1834 for (i = 0; i < nchar; i++) {
1835 snprintf(smallbuf,
sizeof(smallbuf),
"%04x", str[i]);
1847 l_float32 xpt, ypt, wpt, hpt, maxx, maxy;
1852 for (i = 0; i < lpd->
n; i++) {
1855 maxx = L_MAX(maxx, xpt + wpt);
1856 maxy = L_MAX(maxy, ypt + hpt);
1860 (l_int32)(maxy + 0.5));
1866 for (i = 0; i < lpd->
n; i++) {
1879 l_int32 bufsize, i, wpt, hpt;
1882 PROCNAME(
"generatePageStringPdf");
1887 bufsize = 1000 + 50 * lpd->
n;
1888 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1889 return ERROR_INT(
"calloc fail for buf", procName, 1);
1893 for (i = 0; i < lpd->
n; i++) {
1894 snprintf(buf, bufsize,
"/Im%d %d 0 R ", i + 1, 6 + i);
1901 return ERROR_INT(
"xstr not made", procName, 1);
1904 snprintf(buf, bufsize,
"4 0 obj\n" 1908 "/MediaBox [%d %d %d %d]\n" 1912 "/XObject << %s >>\n" 1913 "/ProcSet [ /ImageB /ImageI /ImageC ]\n" 1917 0, 0, wpt, hpt, xstr);
1934 l_float32 xpt, ypt, wpt, hpt;
1937 PROCNAME(
"generateContentStringPdf");
1939 bufsize = 1000 + 200 * lpd->
n;
1940 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1941 return ERROR_INT(
"calloc fail for buf", procName, 1);
1944 for (i = 0; i < lpd->
n; i++) {
1947 snprintf(buf, bufsize,
1948 "q %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
1949 wpt, 0.0, 0.0, hpt, xpt, ypt, i + 1);
1956 return ERROR_INT(
"cstr not made", procName, 1);
1959 snprintf(buf, bufsize,
"5 0 obj\n" 1960 "<< /Length %d >>\n" 1965 (l_int32)strlen(cstr), cstr);
1981 char *cstr, *bstr, *fstr, *pstr, *xstr, *photometry;
1986 PROCNAME(
"generatePreXStringsPdf");
1989 cmindex = 6 + lpd->
n;
1990 for (i = 0; i < lpd->
n; i++) {
1992 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
1993 return ERROR_INT(
"cid not found", procName, 1);
1996 if (var_WRITE_G4_IMAGE_MASK) {
1998 "/ColorSpace /DeviceGray");
2000 cstr =
stringNew(
"/ColorSpace /DeviceGray");
2002 bstr =
stringNew(
"/BitsPerComponent 1\n" 2003 "/Interpolate true");
2007 snprintf(buff,
sizeof(buff),
2008 "/Filter /CCITTFaxDecode\n" 2014 ">>", photometry, cid->
w);
2016 LEPT_FREE(photometry);
2019 cstr =
stringNew(
"/ColorSpace /DeviceGray");
2020 else if (cid->
spp == 3)
2021 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
2022 else if (cid->
spp == 4)
2023 cstr =
stringNew(
"/ColorSpace /DeviceCMYK");
2025 L_ERROR(
"in jpeg: spp != 1, 3 or 4\n", procName);
2026 bstr =
stringNew(
"/BitsPerComponent 8");
2030 cstr =
stringNew(
"/ColorSpace /DeviceGray");
2031 else if (cid->
spp == 3)
2032 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
2034 L_ERROR(
"in jp2k: spp != 1 && spp != 3\n", procName);
2035 bstr =
stringNew(
"/BitsPerComponent 8");
2039 snprintf(buff,
sizeof(buff),
"/ColorSpace %d 0 R", cmindex++);
2042 if (cid->
spp == 1 && cid->
bps == 1)
2043 cstr =
stringNew(
"/ColorSpace /DeviceGray\n" 2045 else if (cid->
spp == 1)
2046 cstr =
stringNew(
"/ColorSpace /DeviceGray");
2047 else if (cid->
spp == 3)
2048 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
2050 L_ERROR(
"unknown colorspace: spp = %d\n",
2051 procName, cid->
spp);
2053 snprintf(buff,
sizeof(buff),
"/BitsPerComponent %d", cid->
bps);
2055 fstr =
stringNew(
"/Filter /FlateDecode");
2057 snprintf(buff,
sizeof(buff),
2063 " /BitsPerComponent %d\n" 2064 ">>\n", cid->
w, cid->
spp, cid->
bps);
2071 snprintf(buf,
sizeof(buf),
2085 cid->
w, cid->
h, bstr, fstr, pstr);
2105 l_int32 i, cmindex, ncmap;
2109 PROCNAME(
"generateColormapStringsPdf");
2115 cmindex = 6 + lpd->
n;
2117 for (i = 0; i < lpd->
n; i++) {
2118 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
2119 return ERROR_INT(
"cid not found", procName, 1);
2120 if (cid->
ncolors == 0)
continue;
2123 snprintf(buf,
sizeof(buf),
"%d 0 obj\n" 2124 "[ /Indexed /DeviceRGB\n" 2144 l_int32 i, n, size, linestart;
2145 L_DNA *daloc, *dasize;
2170 for (i = 0; i < n; i++) {
2178 lpd->
trailer = makeTrailerStringPdf(daloc);
2183 makeTrailerStringPdf(
L_DNA *daloc)
2187 l_int32 i, n, linestart, xrefloc;
2190 PROCNAME(
"makeTrailerStringPdf");
2193 return (
char *)ERROR_PTR(
"daloc not defined", procName, NULL);
2197 snprintf(buf,
sizeof(buf),
"xref\n" 2199 "0000000000 65535 f \n", n);
2201 for (i = 1; i < n; i++) {
2203 snprintf(buf,
sizeof(buf),
"%010d 00000 n \n", linestart);
2208 snprintf(buf,
sizeof(buf),
"trailer\n" 2216 "%%%%EOF\n", n, xrefloc);
2244 l_int32 nimages, i, len;
2245 l_int32 *sizes, *locs;
2249 PROCNAME(
"generateOutputDataPdf");
2252 return ERROR_INT(
"&data not defined", procName, 1);
2255 return ERROR_INT(
"&nbytes not defined", procName, 1);
2258 if ((data = (l_uint8 *)LEPT_CALLOC(nbytes,
sizeof(l_uint8))) == NULL)
2259 return ERROR_INT(
"calloc fail for data", procName, 1);
2264 memcpy(data, lpd->
id, sizes[0]);
2265 memcpy(data + locs[1], lpd->
obj1, sizes[1]);
2266 memcpy(data + locs[2], lpd->
obj2, sizes[2]);
2267 memcpy(data + locs[3], lpd->
obj3, sizes[3]);
2268 memcpy(data + locs[4], lpd->
obj4, sizes[4]);
2269 memcpy(data + locs[5], lpd->
obj5, sizes[5]);
2274 for (i = 0; i < nimages; i++) {
2275 if ((cid = pdfdataGetCid(lpd, i)) == NULL) {
2278 return ERROR_INT(
"cid not found", procName, 1);
2282 memcpy(data + locs[6 + i], str, len);
2283 memcpy(data + locs[6 + i] + len,
2285 memcpy(data + locs[6 + i] + len + cid->
nbytescomp,
2290 for (i = 0; i < lpd->
ncmap; i++) {
2292 memcpy(data + locs[6 + nimages + i], str, strlen(str));
2320 l_int32 i, j, start, startloc, xrefloc, found, loc, nobj, objno, trailer_ok;
2322 L_DNA *da, *daobj, *daxref;
2325 PROCNAME(
"parseTrailerPdf");
2328 return ERROR_INT(
"&da not defined", procName, 1);
2331 return ERROR_INT(
"bas not defined", procName, 1);
2333 if (memcmp(data,
"%PDF-1.", 7) != 0)
2334 return ERROR_INT(
"PDF header signature not found", procName, 1);
2341 (l_uint8 *)
"startxref\n", 10, &loc, &found);
2343 return ERROR_INT(
"startxref not found!", procName, 1);
2344 if (sscanf((
char *)(data + start + loc + 10),
"%d\n", &xrefloc) != 1)
2345 return ERROR_INT(
"xrefloc not found!", procName, 1);
2346 if (xrefloc < 0 || xrefloc >= size)
2347 return ERROR_INT(
"invalid xrefloc!", procName, 1);
2350 if ((sscanf(str,
"0 %d", &nobj)) != 1) {
2352 return ERROR_INT(
"nobj not found", procName, 1);
2359 for (i = 0; i < nobj; i++) {
2361 sscanf(str,
"%d", &startloc);
2367 lept_stderr(
"************** Trailer string ************\n");
2371 lept_stderr(
"************** Object locations ************");
2378 for (i = 1; i < nobj; i++) {
2380 if ((sscanf((
char *)(data + startloc),
"%d 0 obj", &objno)) != 1) {
2381 L_ERROR(
"bad trailer for object %d\n", procName, i);
2389 L_INFO(
"rebuilding pdf trailer\n", procName);
2394 for (i = 0; i < nobj; i++) {
2396 for (j = loc - 1; j > 0; j--) {
2414 generatePagesObjStringPdf(
NUMA *napage)
2418 l_int32 i, n, index, bufsize;
2421 PROCNAME(
"generatePagesObjStringPdf");
2424 return (
char *)ERROR_PTR(
"napage not defined", procName, NULL);
2427 bufsize = 100 + 16 * n;
2428 buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char));
2430 for (i = 0; i < n; i++) {
2432 snprintf(buf, bufsize,
" %d 0 R ", index);
2437 snprintf(buf, bufsize - 1,
"3 0 obj\n" 2470 l_uint8 space =
' ';
2473 l_int32 start, nrepl, i, j, nobjs, objin, objout, found;
2474 l_int32 *objs, *matches;
2479 PROCNAME(
"substituteObjectNumbers");
2481 return (
L_BYTEA *)ERROR_PTR(
"bas not defined", procName, NULL);
2483 return (
L_BYTEA *)ERROR_PTR(
"na_objs not defined", procName, NULL);
2491 sscanf((
char *)datas,
"%d", &objin);
2492 if (objin < 0 || objin >= nobjs) {
2493 L_ERROR(
"index %d into array of size %d\n", procName, objin, nobjs);
2497 objout = objs[objin];
2498 snprintf((
char *)buf, 32,
"%d", objout);
2513 for (i = 0; i < nrepl; i++) {
2515 for (j = matches[i] - 1; j > 0; j--) {
2516 if (datas[j] == space)
2521 sscanf((
char *)(datas + j + 1),
"%d", &objin);
2522 if (objin < 0 || objin >= nobjs) {
2523 L_ERROR(
"index %d into array of size %d\n", procName, objin, nobjs);
2529 objout = objs[objin];
2530 snprintf((
char *)buf, 32,
"%d", objout);
2547 pdfdataCreate(
const char *title)
2570 PROCNAME(
"pdfdataDestroy");
2573 L_WARNING(
"ptr address is null!\n", procName);
2576 if ((lpd = *plpd) == NULL)
2580 for (i = 0; i < lpd->
n; i++) {
2586 if (lpd->
id) LEPT_FREE(lpd->
id);
2587 if (lpd->
obj1) LEPT_FREE(lpd->
obj1);
2588 if (lpd->
obj2) LEPT_FREE(lpd->
obj2);
2589 if (lpd->
obj3) LEPT_FREE(lpd->
obj3);
2590 if (lpd->
obj4) LEPT_FREE(lpd->
obj4);
2591 if (lpd->
obj5) LEPT_FREE(lpd->
obj5);
2610 PROCNAME(
"pdfdataGetCid");
2613 return (
L_COMP_DATA *)ERROR_PTR(
"lpd not defined", procName, NULL);
2614 if (index < 0 || index >= lpd->
n)
2615 return (
L_COMP_DATA *)ERROR_PTR(
"invalid image index", procName, NULL);
2641 var_WRITE_G4_IMAGE_MASK = flag;
2661 var_WRITE_DATE_AND_VERSION = flag;
void * ptraGetPtrToItem(L_PTRA *pa, l_int32 index)
ptraGetPtrToItem()
l_ok readResolutionMemJpeg(const l_uint8 *data, size_t size, l_int32 *pxres, l_int32 *pyres)
readResolutionMemJpeg()
size_t l_byteaGetSize(L_BYTEA *ba)
l_byteaGetSize()
l_ok ptraConcatenatePdfToData(L_PTRA *pa_data, SARRAY *sa, l_uint8 **pdata, size_t *pnbytes)
ptraConcatenatePdfToData()
char * sarrayToString(SARRAY *sa, l_int32 addnlflag)
sarrayToString()
l_ok l_byteaAppendString(L_BYTEA *ba, const char *str)
l_byteaAppendString()
l_int32 * l_dnaGetIArray(L_DNA *da)
l_dnaGetIArray()
l_ok ptraGetActualCount(L_PTRA *pa, l_int32 *pcount)
ptraGetActualCount()
PIXA * pixaReadMultipageTiff(const char *filename)
pixaReadMultipageTiff()
l_ok l_dnaaAddDna(L_DNAA *daa, L_DNA *da, l_int32 copyflag)
l_dnaaAddDna()
l_int32 l_dnaGetCount(L_DNA *da)
l_dnaGetCount()
l_ok extractG4DataFromFile(const char *filein, l_uint8 **pdata, size_t *pnbytes, l_int32 *pw, l_int32 *ph, l_int32 *pminisblack)
extractG4DataFromFile()
char * pixcmapConvertToHex(l_uint8 *data, l_int32 ncolors)
pixcmapConvertToHex()
static L_COMP_DATA * pixGenerateFlateData(PIX *pixs, l_int32 ascii85flag)
pixGenerateFlateData()
static L_COMP_DATA * pixGenerateJp2kData(PIX *pixs, l_int32 quality)
pixGenerateJp2kData()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
L_DNA * arrayFindEachSequence(const l_uint8 *data, size_t datalen, const l_uint8 *sequence, size_t seqlen)
arrayFindEachSequence()
L_BYTEA * l_byteaCreate(size_t nbytes)
l_byteaCreate()
char * l_makeTempFilename(void)
l_makeTempFilename()
L_COMP_DATA * l_generateG4Data(const char *fname, l_int32 ascii85flag)
l_generateG4Data()
static L_COMP_DATA * pixGenerateG4Data(PIX *pixs, l_int32 ascii85flag)
pixGenerateG4Data()
void l_dnaDestroy(L_DNA **pda)
l_dnaDestroy()
static L_COMP_DATA * pixGenerateJpegData(PIX *pixs, l_int32 ascii85flag, l_int32 quality)
pixGenerateJpegData()
char * stringNew(const char *src)
stringNew()
l_ok pixGenerateCIData(PIX *pixs, l_int32 type, l_int32 quality, l_int32 ascii85, L_COMP_DATA **pcid)
pixGenerateCIData()
l_uint8 * l_byteaGetData(L_BYTEA *ba, size_t *psize)
l_byteaGetData()
l_ok freadHeaderPng(FILE *fp, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
freadHeaderPng()
PTA * ptaCreate(l_int32 n)
ptaCreate()
static l_int32 l_generatePdf(l_uint8 **pdata, size_t *pnbytes, L_PDF_DATA *lpd)
l_generatePdf()
l_ok pixGetRasterData(PIX *pixs, l_uint8 **pdata, size_t *pnbytes)
pixGetRasterData()
PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag)
pixConvertTo8()
L_DNAA * l_dnaaCreate(l_int32 n)
l_dnaaCreate()
static L_BYTEA * substituteObjectNumbers(L_BYTEA *bas, NUMA *na_objs)
substituteObjectNumbers()
NUMA * numaMakeConstant(l_float32 val, l_int32 size)
numaMakeConstant()
void lept_stderr(const char *fmt,...)
lept_stderr()
l_ok l_dnaGetIValue(L_DNA *da, l_int32 index, l_int32 *pival)
l_dnaGetIValue()
l_ok pixcmapSerializeToMemory(PIXCMAP *cmap, l_int32 cpc, l_int32 *pncolors, l_uint8 **pdata)
pixcmapSerializeToMemory()
L_BYTEA * l_byteaInitFromMem(const l_uint8 *data, size_t size)
l_byteaInitFromMem()
SARRAY * sarrayCreate(l_int32 n)
sarrayCreate()
L_DNA * l_dnaaGetDna(L_DNAA *daa, l_int32 index, l_int32 accessflag)
l_dnaaGetDna()
void pixcmapDestroy(PIXCMAP **pcmap)
pixcmapDestroy()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_ok cidConvertToPdfData(L_COMP_DATA *cid, const char *title, l_uint8 **pdata, size_t *pnbytes)
cidConvertToPdfData()
l_ok l_dnaAddNumber(L_DNA *da, l_float64 val)
l_dnaAddNumber()
NUMAA * numaaCreate(l_int32 n)
numaaCreate()
l_ok numaSetValue(NUMA *na, l_int32 index, l_float32 val)
numaSetValue()
void numaaDestroy(NUMAA **pnaa)
numaaDestroy()
l_ok numaaWriteStream(FILE *fp, NUMAA *naa)
numaaWriteStream()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
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_int32 stringCat(char *dest, size_t size, const char *src)
stringCat()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
l_uint8 * l_binaryRead(const char *filename, size_t *pnbytes)
l_binaryRead()
NUMA * numaaGetNuma(NUMAA *naa, l_int32 index, l_int32 accessflag)
numaaGetNuma()
l_ok readHeaderPng(const char *filename, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
readHeaderPng()
void l_CIDataDestroy(L_COMP_DATA **pcid)
l_CIDataDestroy()
PIX * pixAlphaBlendUniform(PIX *pixs, l_uint32 color)
pixAlphaBlendUniform()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
L_PTRA * ptraCreate(l_int32 n)
ptraCreate()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok getTiffResolution(FILE *fp, l_int32 *pxres, l_int32 *pyres)
getTiffResolution()
l_ok sarrayAddString(SARRAY *sa, const char *string, l_int32 copyflag)
sarrayAddString()
l_ok l_byteaAppendData(L_BYTEA *ba, const l_uint8 *newdata, size_t newbytes)
l_byteaAppendData()
l_ok l_dnaEmpty(L_DNA *da)
l_dnaEmpty()
l_ok ptraCompactArray(L_PTRA *pa)
ptraCompactArray()
void l_pdfSetDateAndVersion(l_int32 flag)
l_pdfSetDateAndVersion()
l_ok convertTiffMultipageToPdf(const char *filein, const char *fileout)
convertTiffMultipageToPdf()
l_ok ptaGetPt(PTA *pta, l_int32 index, l_float32 *px, l_float32 *py)
ptaGetPt()
l_ok findFileFormat(const char *filename, l_int32 *pformat)
findFileFormat()
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
char * l_getFormattedDate(void)
l_getFormattedDate()
l_ok pixWriteJpeg(const char *filename, PIX *pix, l_int32 quality, l_int32 progressive)
pixWriteJpeg()
PIX * pixClone(PIX *pixs)
pixClone()
L_DNA * l_dnaDiffAdjValues(L_DNA *das)
l_dnaDiffAdjValues()
void pixDestroy(PIX **ppix)
pixDestroy()
NUMA * numaMakeSequence(l_float32 startval, l_float32 increment, l_int32 size)
numaMakeSequence()
void l_dnaaDestroy(L_DNAA **pdaa)
l_dnaaDestroy()
L_COMP_DATA * l_generateFlateDataPdf(const char *fname, PIX *pixs)
l_generateFlateDataPdf()
l_ok selectDefaultPdfEncoding(PIX *pix, l_int32 *ptype)
selectDefaultPdfEncoding()
static l_int32 generateOutputDataPdf(l_uint8 **pdata, size_t *pnbytes, L_PDF_DATA *lpd)
generateOutputDataPdf()
SARRAY * sarrayCreateLinesFromString(const char *string, l_int32 blankflag)
sarrayCreateLinesFromString()
l_ok ptaSetPt(PTA *pta, l_int32 index, l_float32 x, l_float32 y)
ptaSetPt()
void numaDestroy(NUMA **pna)
numaDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
l_ok l_byteaFindEachSequence(L_BYTEA *ba, const l_uint8 *sequence, size_t seqlen, L_DNA **pda)
l_byteaFindEachSequence()
static L_COMP_DATA * l_generateJp2kData(const char *fname)
l_generateJp2kData()
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_int32 fileFormatIsTiff(FILE *fp)
fileFormatIsTiff()
void ptraDestroy(L_PTRA **ppa, l_int32 freeflag, l_int32 warnflag)
ptraDestroy()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_ok ptraAdd(L_PTRA *pa, void *item)
ptraAdd()
PIX * pixRead(const char *filename)
pixRead()
l_ok sarrayWriteStderr(SARRAY *sa)
sarrayWriteStderr()
void l_pdfSetG4ImageMask(l_int32 flag)
l_pdfSetG4ImageMask()
l_ok isPngInterlaced(const char *filename, l_int32 *pinterlaced)
isPngInterlaced()
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 l_generateCIDataForPdf(const char *fname, PIX *pix, l_int32 quality, L_COMP_DATA **pcid)
l_generateCIDataForPdf()
L_DNA * l_dnaCreate(l_int32 n)
l_dnaCreate()
void * ptraRemove(L_PTRA *pa, l_int32 index, l_int32 flag)
ptraRemove()
void ptaDestroy(PTA **ppta)
ptaDestroy()
l_ok numaReplaceNumber(NUMA *na, l_int32 index, l_float32 val)
numaReplaceNumber()
void boxDestroy(BOX **pbox)
boxDestroy()
l_uint8 * zlibCompress(const l_uint8 *datain, size_t nin, size_t *pnout)
zlibCompress()
static l_int32 parseTrailerPdf(L_BYTEA *bas, L_DNA **pda)
parseTrailerPdf()
L_COMP_DATA * l_generateJpegData(const char *fname, l_int32 ascii85flag)
l_generateJpegData()
static char * generateEscapeString(const char *str)
generateEscapeString()
void l_byteaDestroy(L_BYTEA **pba)
l_byteaDestroy()
L_COMP_DATA * l_generateJpegDataMem(l_uint8 *data, size_t nbytes, l_int32 ascii85flag)
l_generateJpegDataMem()
l_ok pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
l_ok boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
l_ok readHeaderJpeg(const char *filename, l_int32 *pw, l_int32 *ph, l_int32 *pspp, l_int32 *pycck, l_int32 *pcmyk)
readHeaderJpeg()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
l_ok tiffGetCount(FILE *fp, l_int32 *pn)
tiffGetCount()
L_COMP_DATA * l_generateFlateData(const char *fname, l_int32 ascii85flag)
l_generateFlateData()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
l_ok l_dnaWriteStderr(L_DNA *da)
l_dnaWriteStrderr()
char * getLeptonicaVersion(void)
getLeptonicaVersion()
l_uint8 * l_byteaCopyData(L_BYTEA *ba, size_t *psize)
l_byteaCopyData()
l_ok numaWriteStderr(NUMA *na)
numaWriteStderr()
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_ok numaaAddNuma(NUMAA *naa, NUMA *na, l_int32 copyflag)
numaaAddNuma()
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 l_generateCIData(const char *fname, l_int32 type, l_int32 quality, l_int32 ascii85, L_COMP_DATA **pcid)
l_generateCIData()
l_int32 lept_rmfile(const char *filepath)
lept_rmfile()
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()