94 #include "allheaders.h" 101 static const l_int32 DEFAULT_INPUT_RES = 300;
110 static l_int32
l_generatePdf(l_uint8 **pdata,
size_t *pnbytes,
112 static void generateFixedStringsPdf(
L_PDF_DATA *lpd);
113 static char *generateEscapeString(
const char *str);
114 static void generateMediaboxPdf(
L_PDF_DATA *lpd);
115 static l_int32 generatePageStringPdf(
L_PDF_DATA *lpd);
116 static l_int32 generateContentStringPdf(
L_PDF_DATA *lpd);
117 static l_int32 generatePreXStringsPdf(
L_PDF_DATA *lpd);
118 static l_int32 generateColormapStringsPdf(
L_PDF_DATA *lpd);
119 static void generateTrailerPdf(
L_PDF_DATA *lpd);
120 static char *makeTrailerStringPdf(
L_DNA *daloc);
125 static char *generatePagesObjStringPdf(
NUMA *napage);
128 static L_PDF_DATA *pdfdataCreate(
const char *title);
129 static void pdfdataDestroy(
L_PDF_DATA **plpd);
135 static l_int32 var_WRITE_G4_IMAGE_MASK = 1;
137 static l_int32 var_WRITE_DATE_AND_VERSION = 1;
139 #define L_SMALLBUF 256 140 #define L_BIGBUF 2048 143 #ifndef NO_CONSOLE_IO 144 #define DEBUG_MULTIPAGE 0 193 l_int32 pixres, w, h, ret;
194 l_float32 xpt, ypt, wpt, hpt;
198 PROCNAME(
"pixConvertToPdfData");
201 return ERROR_INT(
"&data not defined", procName, 1);
204 return ERROR_INT(
"&nbytes not defined", procName, 1);
207 return ERROR_INT(
"pix not defined", procName, 1);
217 return ERROR_INT(
"cid not made", procName, 1);
229 res = DEFAULT_INPUT_RES;
238 if ((lpd = pdfdataCreate(title)) == NULL)
239 return ERROR_INT(
"lpd not made", procName, 1);
241 if ((lpd = pdfdataCreate(title)) == NULL)
242 return ERROR_INT(
"lpd not made", procName, 1);
258 pdfdataDestroy(&lpd);
259 if (plpd) *plpd = NULL;
261 return ERROR_INT(
"pdf output not made", procName, 1);
311 char *fname, *str_pages, *str_trailer;
312 l_uint8 *pdfdata, *data;
313 l_int32 i, j, index, nobj, npages;
314 l_int32 *sizes, *locs;
316 L_BYTEA *bas, *bad, *bat1, *bat2;
317 L_DNA *da_locs, *da_sizes, *da_outlocs, *da;
319 NUMA *na_objs, *napage;
322 PROCNAME(
"ptraConcatenatePdfToData");
325 return ERROR_INT(
"&data not defined", procName, 1);
328 return ERROR_INT(
"&nbytes not defined", procName, 1);
331 return ERROR_INT(
"pa_data not defined", procName, 1);
337 for (i = 0; i < npages; i++) {
344 L_ERROR(
"can't parse file %s; skipping\n", procName, fname);
346 L_ERROR(
"can't parse file %d; skipping\n", procName, i);
358 return ERROR_INT(
"no parsable pdf files found", procName, 1);
365 for (i = 0; i < npages; i++) {
376 for (j = 4; j < nobj - 1; j++)
384 str_pages = generatePagesObjStringPdf(napage);
389 for (i = 0; i < npages; i++) {
403 for (j = 0; j < 4; j++)
406 for (j = 4; j < nobj; j++) {
425 str_trailer = makeTrailerStringPdf(da_outlocs);
433 fprintf(stderr,
"******** object mapper **********");
436 fprintf(stderr,
"******** Page object numbers ***********");
439 fprintf(stderr,
"******** Pages object ***********\n");
440 fprintf(stderr,
"%s\n", str_pages);
447 LEPT_FREE(str_pages);
448 LEPT_FREE(str_trailer);
477 PROCNAME(
"convertTiffMultipageToPdf");
480 return ERROR_INT(
"file not found", procName, 1);
484 return ERROR_INT(
"file not tiff format", procName, 1);
524 l_int32 format, type;
528 PROCNAME(
"l_generateCIDataForPdf");
531 return ERROR_INT(
"&cid not defined", procName, 1);
534 return ERROR_INT(
"neither fname nor pix are defined", procName, 1);
538 if (fname && strcmp(fname,
"-") != 0 && strcmp(fname,
"stdin") != 0) {
540 if (format == IFF_UNKNOWN)
541 L_WARNING(
"file %s format is unknown\n", procName, fname);
542 if (format == IFF_PS || format == IFF_LPDF) {
543 L_ERROR(
"file %s is unsupported format %d\n",
544 procName, fname, format);
547 if (format == IFF_JFIF_JPEG) {
549 }
else if (format == IFF_JP2) {
551 }
else if (format == IFF_PNG) {
564 return ERROR_INT(
"pixt not made", procName, 1);
570 L_ERROR(
"totally kerflummoxed\n", procName);
600 l_uint8 *pngcomp = NULL;
601 l_uint8 *datacomp = NULL;
602 l_uint8 *cmapdata = NULL;
603 char *cmapdatahex = NULL;
605 l_int32 format, interlaced;
609 l_int32 w, h, cmapflag;
611 size_t nbytescomp = 0, nbytespng = 0;
617 PROCNAME(
"l_generateFlateDataPdf");
620 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
625 if (format == IFF_PNG) {
639 if (format != IFF_PNG || interlaced || spp == 4 || spp == 2) {
645 return (
L_COMP_DATA *)ERROR_PTR(
"pix not made", procName, NULL);
655 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
657 fgetPngResolution(fp, &xres, &yres);
665 if ((pngcomp =
l_binaryRead(fname, &nbytespng)) == NULL)
666 return (
L_COMP_DATA *)ERROR_PTR(
"unable to read file",
675 if ((datacomp = (l_uint8 *)LEPT_CALLOC(1, nbytespng)) == NULL) {
677 return (
L_COMP_DATA *)ERROR_PTR(
"unable to allocate memory",
691 for (i = 16; i < nbytespng; i += 12) {
693 n = pngcomp[i - 8] << 24;
694 n += pngcomp[i - 7] << 16;
695 n += pngcomp[i - 6] << 8;
696 n += pngcomp[i - 5] << 0;
697 if (i + n >= nbytespng) {
701 L_ERROR(
"invalid png: i = %d, n = %d, nbytes = %lu\n", procName,
702 i, n, (
unsigned long)nbytespng);
707 if (strncmp((
const char *)(pngcomp + i - 4),
"IDAT", 4) == 0) {
708 memcpy(datacomp + nbytescomp, pngcomp + i, n);
713 if (cmapflag && !cmap &&
714 strncmp((
const char *)(pngcomp + i - 4),
"PLTE", 4) == 0) {
715 if ((n / 3) > (1 << bps)) {
719 L_ERROR(
"invalid png: i = %d, n = %d, cmapsize = %d\n",
720 procName, i, n, (1 << bps));
724 for (j = i; j < i + n; j += 3) {
733 if (nbytescomp == 0) {
736 return (
L_COMP_DATA *)ERROR_PTR(
"invalid PNG file", procName, NULL);
746 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
795 l_uint8 *datacomp = NULL;
797 l_int32 w, h, xres, yres, bps, spp;
803 PROCNAME(
"l_generateJpegData");
806 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
810 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
813 fgetJpegResolution(fp, &xres, &yres);
818 if ((datacomp =
l_binaryRead(fname, &nbytescomp)) == NULL)
819 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not extracted",
823 if (ascii85flag == 1) {
824 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
827 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
829 data85[nbytes85 - 1] =
'\0';
833 if (ascii85flag == 0) {
864 l_int32 w, h, bps, spp;
868 PROCNAME(
"l_generateJp2kData");
871 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
874 return (
L_COMP_DATA *)ERROR_PTR(
"cid not made", procName, NULL);
879 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", procName, NULL);
923 l_int32 format, d, bps, spp, iscmap;
927 PROCNAME(
"l_generateCIData");
930 return ERROR_INT(
"&cid not defined", procName, 1);
933 return ERROR_INT(
"fname not defined", procName, 1);
936 return ERROR_INT(
"invalid conversion type", procName, 1);
937 if (ascii85 != 0 && ascii85 != 1)
938 return ERROR_INT(
"invalid ascii85", procName, 1);
941 pixReadHeader(fname, &format, NULL, NULL, &bps, &spp, &iscmap);
945 L_WARNING(
"pixs has cmap; using flate encoding\n", procName);
948 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
951 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
954 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", procName);
959 if (format == IFF_JFIF_JPEG) {
962 if ((pix =
pixRead(fname)) == NULL)
963 return ERROR_INT(
"pix not returned", procName, 1);
968 return ERROR_INT(
"jpeg data not made", procName, 1);
970 if (format == IFF_JP2) {
973 if ((pix =
pixRead(fname)) == NULL)
974 return ERROR_INT(
"pix not returned", procName, 1);
979 return ERROR_INT(
"jpeg data not made", procName, 1);
982 return ERROR_INT(
"g4 data not made", procName, 1);
985 return ERROR_INT(
"flate data not made", procName, 1);
987 return ERROR_INT(
"invalid conversion type", procName, 1);
1022 PROCNAME(
"pixGenerateCIData");
1025 return ERROR_INT(
"&cid not defined", procName, 1);
1028 return ERROR_INT(
"pixs not defined", procName, 1);
1031 return ERROR_INT(
"invalid conversion type", procName, 1);
1032 if (ascii85 != 0 && ascii85 != 1)
1033 return ERROR_INT(
"invalid ascii85", procName, 1);
1036 d = pixGetDepth(pixs);
1037 cmap = pixGetColormap(pixs);
1039 L_WARNING(
"pixs has cmap; using flate encoding\n", procName);
1042 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
1045 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", procName);
1051 return ERROR_INT(
"jpeg data not made", procName, 1);
1054 return ERROR_INT(
"g4 data not made", procName, 1);
1057 return ERROR_INT(
"flate data not made", procName, 1);
1059 return ERROR_INT(
"invalid conversion type", procName, 1);
1087 l_int32 ascii85flag)
1092 PROCNAME(
"l_generateFlateData");
1095 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1097 if ((pixs =
pixRead(fname)) == NULL)
1098 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not made", procName, NULL);
1121 l_int32 ascii85flag)
1123 l_uint8 *data = NULL;
1124 l_uint8 *datacomp = NULL;
1125 char *data85 = NULL;
1126 l_uint8 *cmapdata = NULL;
1127 char *cmapdata85 = NULL;
1128 char *cmapdatahex = NULL;
1132 l_int32 w, h, d, cmapflag;
1133 l_int32 ncmapbytes85 = 0;
1134 l_int32 nbytes85 = 0;
1135 size_t nbytes, nbytescomp;
1140 PROCNAME(
"pixGenerateFlateData");
1143 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1151 cmap = pixGetColormap(pixs);
1152 cmapflag = (cmap) ? 1 : 0;
1153 if (d == 2 || d == 4 || d == 16) {
1155 cmap = pixGetColormap(pixt);
1156 d = pixGetDepth(pixt);
1160 spp = (d == 32) ? 3 : 1;
1161 bps = (d == 32) ? 8 : d;
1169 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
1173 cmapdata85 = encodeAscii85(cmapdata, 3 * ncolors, &ncmapbytes85);
1175 LEPT_FREE(cmapdata);
1184 LEPT_FREE(cmapdata85);
1185 LEPT_FREE(cmapdatahex);
1186 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not made", procName, NULL);
1190 if (ascii85flag == 1) {
1191 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1192 LEPT_FREE(datacomp);
1194 LEPT_FREE(cmapdata85);
1195 LEPT_FREE(cmapdatahex);
1196 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1198 data85[nbytes85 - 1] =
'\0';
1203 if (ascii85flag == 0) {
1218 cid->
res = pixGetXRes(pixs);
1241 l_int32 ascii85flag,
1248 PROCNAME(
"pixGenerateJpegData");
1251 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1252 if (pixGetColormap(pixs))
1253 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", procName, NULL);
1254 d = pixGetDepth(pixs);
1255 if (d != 8 && d != 32)
1256 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
1259 fname = l_makeTempFilename();
1285 l_int32 ascii85flag)
1290 PROCNAME(
"pixGenerateG4Data");
1293 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1294 if (pixGetDepth(pixs) != 1)
1295 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
1298 tname = l_makeTempFilename();
1299 pixWrite(tname, pixs, IFF_TIFF_G4);
1325 l_int32 ascii85flag)
1327 l_uint8 *datacomp = NULL;
1328 char *data85 = NULL;
1329 l_int32 w, h, xres, yres;
1336 PROCNAME(
"l_generateG4Data");
1339 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1343 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
1351 &w, &h, &minisblack)) {
1352 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not extracted",
1357 if (ascii85flag == 1) {
1358 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1359 LEPT_FREE(datacomp);
1361 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1363 data85[nbytes85 - 1] =
'\0';
1367 if (ascii85flag == 0) {
1410 PROCNAME(
"cidConvertToPdfData");
1412 if (!pdata || !pnbytes)
1413 return ERROR_INT(
"&data and &nbytes not both defined", procName, 1);
1417 return ERROR_INT(
"cid not defined", procName, 1);
1422 res = DEFAULT_INPUT_RES;
1423 wpt = cid->
w * 72. / res;
1424 hpt = cid->
h * 72. / res;
1427 if ((lpd = pdfdataCreate(title)) == NULL)
1428 return ERROR_INT(
"lpd not made", procName, 1);
1436 pdfdataDestroy(&lpd);
1438 return ERROR_INT(
"pdf output not made", procName, 1);
1454 PROCNAME(
"l_CIDataDestroy");
1457 L_WARNING(
"ptr address is null!\n", procName);
1460 if ((cid = *pcid) == NULL)
1502 PROCNAME(
"l_generatePdf");
1505 return ERROR_INT(
"&data not defined", procName, 1);
1508 return ERROR_INT(
"&nbytes not defined", procName, 1);
1511 return ERROR_INT(
"lpd not defined", procName, 1);
1513 generateFixedStringsPdf(lpd);
1514 generateMediaboxPdf(lpd);
1515 generatePageStringPdf(lpd);
1516 generateContentStringPdf(lpd);
1517 generatePreXStringsPdf(lpd);
1518 generateColormapStringsPdf(lpd);
1519 generateTrailerPdf(lpd);
1527 char buf[L_SMALLBUF];
1528 char *version, *datestr;
1531 PROCNAME(
"generateFixedStringsPdf");
1548 if (var_WRITE_DATE_AND_VERSION) {
1550 snprintf(buf,
sizeof(buf),
"/CreationDate (D:%s)\n", datestr);
1554 snprintf(buf,
sizeof(buf),
1555 "/Producer (leptonica: %s)\n", version);
1558 snprintf(buf,
sizeof(buf),
"/Producer (leptonica)\n");
1563 if ((hexstr = generateEscapeString(lpd->
title)) != NULL) {
1564 snprintf(buf,
sizeof(buf),
"/Title %s\n", hexstr);
1567 L_ERROR(
"title string is not ascii\n", procName);
1610 generateEscapeString(
const char *str)
1614 l_int32 i, nchar, buflen;
1616 PROCNAME(
"generateEscapeString");
1619 return (
char *)ERROR_PTR(
"str not defined", procName, NULL);
1620 nchar = strlen(str);
1621 for (i = 0; i < nchar; i++) {
1623 return (
char *)ERROR_PTR(
"str not all ascii", procName, NULL);
1626 buflen = 4 * nchar + 10;
1627 buffer = (
char *)LEPT_CALLOC(buflen,
sizeof(
char));
1629 for (i = 0; i < nchar; i++) {
1630 snprintf(smallbuf,
sizeof(smallbuf),
"%04x", str[i]);
1642 l_float32 xpt, ypt, wpt, hpt, maxx, maxy;
1647 for (i = 0; i < lpd->
n; i++) {
1650 maxx = L_MAX(maxx, xpt + wpt);
1651 maxy = L_MAX(maxy, ypt + hpt);
1655 (l_int32)(maxy + 0.5));
1661 for (i = 0; i < lpd->
n; i++) {
1676 l_int32 bufsize, i, wpt, hpt;
1679 PROCNAME(
"generatePageStringPdf");
1684 bufsize = 1000 + 50 * lpd->
n;
1685 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1686 return ERROR_INT(
"calloc fail for buf", procName, 1);
1690 for (i = 0; i < lpd->
n; i++) {
1691 snprintf(buf, bufsize,
"/Im%d %d 0 R ", i + 1, 6 + i);
1698 return ERROR_INT(
"xstr not made", procName, 1);
1701 snprintf(buf, bufsize,
"4 0 obj\n" 1705 "/MediaBox [%d %d %d %d]\n" 1709 "/XObject << %s >>\n" 1710 "/ProcSet [ /ImageB /ImageI /ImageC ]\n" 1714 0, 0, wpt, hpt, xstr);
1731 l_float32 xpt, ypt, wpt, hpt;
1734 PROCNAME(
"generateContentStringPdf");
1736 bufsize = 1000 + 200 * lpd->
n;
1737 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1738 return ERROR_INT(
"calloc fail for buf", procName, 1);
1741 for (i = 0; i < lpd->
n; i++) {
1744 snprintf(buf, bufsize,
1745 "q %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
1746 wpt, 0.0, 0.0, hpt, xpt, ypt, i + 1);
1753 return ERROR_INT(
"cstr not made", procName, 1);
1756 snprintf(buf, bufsize,
"5 0 obj\n" 1757 "<< /Length %d >>\n" 1762 (l_int32)strlen(cstr), cstr);
1778 char *cstr, *bstr, *fstr, *pstr, *xstr;
1783 PROCNAME(
"generatePreXStringsPdf");
1786 cmindex = 6 + lpd->
n;
1787 for (i = 0; i < lpd->
n; i++) {
1789 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
1790 return ERROR_INT(
"cid not found", procName, 1);
1793 if (var_WRITE_G4_IMAGE_MASK) {
1795 "/ColorSpace /DeviceGray");
1797 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1799 bstr =
stringNew(
"/BitsPerComponent 1\n" 1800 "/Interpolate true");
1801 snprintf(buff,
sizeof(buff),
1802 "/Filter /CCITTFaxDecode\n" 1811 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1812 else if (cid->
spp == 3)
1813 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1814 else if (cid->
spp == 4)
1815 cstr =
stringNew(
"/ColorSpace /DeviceCMYK");
1817 L_ERROR(
"in jpeg: spp != 1, 3 or 4\n", procName);
1818 bstr =
stringNew(
"/BitsPerComponent 8");
1822 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1823 else if (cid->
spp == 3)
1824 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1826 L_ERROR(
"in jp2k: spp != 1 && spp != 3\n", procName);
1827 bstr =
stringNew(
"/BitsPerComponent 8");
1831 snprintf(buff,
sizeof(buff),
"/ColorSpace %d 0 R", cmindex++);
1834 if (cid->
spp == 1 && cid->
bps == 1)
1835 cstr =
stringNew(
"/ColorSpace /DeviceGray\n" 1837 else if (cid->
spp == 1)
1838 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1839 else if (cid->
spp == 3)
1840 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1842 L_ERROR(
"unknown colorspace: spp = %d\n",
1843 procName, cid->
spp);
1845 snprintf(buff,
sizeof(buff),
"/BitsPerComponent %d", cid->
bps);
1847 fstr =
stringNew(
"/Filter /FlateDecode");
1849 snprintf(buff,
sizeof(buff),
1855 " /BitsPerComponent %d\n" 1856 ">>\n", cid->
w, cid->
spp, cid->
bps);
1863 snprintf(buf,
sizeof(buf),
1877 cid->
w, cid->
h, bstr, fstr, pstr);
1897 l_int32 i, cmindex, ncmap;
1901 PROCNAME(
"generateColormapStringsPdf");
1907 cmindex = 6 + lpd->
n;
1909 for (i = 0; i < lpd->
n; i++) {
1910 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
1911 return ERROR_INT(
"cid not found", procName, 1);
1912 if (cid->
ncolors == 0)
continue;
1915 snprintf(buf,
sizeof(buf),
"%d 0 obj\n" 1916 "[ /Indexed /DeviceRGB\n" 1936 l_int32 i, n, size, linestart;
1937 L_DNA *daloc, *dasize;
1962 for (i = 0; i < n; i++) {
1970 lpd->
trailer = makeTrailerStringPdf(daloc);
1975 makeTrailerStringPdf(
L_DNA *daloc)
1979 l_int32 i, n, linestart, xrefloc;
1982 PROCNAME(
"makeTrailerStringPdf");
1985 return (
char *)ERROR_PTR(
"daloc not defined", procName, NULL);
1989 snprintf(buf,
sizeof(buf),
"xref\n" 1991 "0000000000 65535 f \n", n);
1993 for (i = 1; i < n; i++) {
1995 snprintf(buf,
sizeof(buf),
"%010d 00000 n \n", linestart);
2000 snprintf(buf,
sizeof(buf),
"trailer\n" 2008 "%%%%EOF\n", n, xrefloc);
2036 l_int32 nimages, i, len;
2037 l_int32 *sizes, *locs;
2041 PROCNAME(
"generateOutputDataPdf");
2044 return ERROR_INT(
"&data not defined", procName, 1);
2047 return ERROR_INT(
"&nbytes not defined", procName, 1);
2050 if ((data = (l_uint8 *)LEPT_CALLOC(nbytes,
sizeof(l_uint8))) == NULL)
2051 return ERROR_INT(
"calloc fail for data", procName, 1);
2056 memcpy((
char *)data, lpd->
id, sizes[0]);
2057 memcpy((
char *)(data + locs[1]), lpd->
obj1, sizes[1]);
2058 memcpy((
char *)(data + locs[2]), lpd->
obj2, sizes[2]);
2059 memcpy((
char *)(data + locs[3]), lpd->
obj3, sizes[3]);
2060 memcpy((
char *)(data + locs[4]), lpd->
obj4, sizes[4]);
2061 memcpy((
char *)(data + locs[5]), lpd->
obj5, sizes[5]);
2066 for (i = 0; i < nimages; i++) {
2067 if ((cid = pdfdataGetCid(lpd, i)) == NULL) {
2070 return ERROR_INT(
"cid not found", procName, 1);
2074 memcpy((
char *)(data + locs[6 + i]), str, len);
2075 memcpy((
char *)(data + locs[6 + i] + len),
2077 memcpy((
char *)(data + locs[6 + i] + len + cid->
nbytescomp),
2082 for (i = 0; i < lpd->
ncmap; i++) {
2084 memcpy((
char *)(data + locs[6 + nimages + i]), str, strlen(str));
2112 l_int32 i, j, start, startloc, xrefloc, found, loc, nobj, objno, trailer_ok;
2114 L_DNA *da, *daobj, *daxref;
2117 PROCNAME(
"parseTrailerPdf");
2120 return ERROR_INT(
"&da not defined", procName, 1);
2123 return ERROR_INT(
"bas not defined", procName, 1);
2125 if (strncmp((
char *)data,
"%PDF-1.", 7) != 0)
2126 return ERROR_INT(
"PDF header signature not found", procName, 1);
2133 (l_uint8 *)
"startxref\n", 10, &loc, &found);
2135 return ERROR_INT(
"startxref not found!", procName, 1);
2136 if (sscanf((
char *)(data + start + loc + 10),
"%d\n", &xrefloc) != 1)
2137 return ERROR_INT(
"xrefloc not found!", procName, 1);
2138 if (xrefloc < 0 || xrefloc >= size)
2139 return ERROR_INT(
"invalid xrefloc!", procName, 1);
2142 if ((sscanf(str,
"0 %d", &nobj)) != 1) {
2144 return ERROR_INT(
"nobj not found", procName, 1);
2151 for (i = 0; i < nobj; i++) {
2153 sscanf(str,
"%d", &startloc);
2159 fprintf(stderr,
"************** Trailer string ************\n");
2160 fprintf(stderr,
"xrefloc = %d", xrefloc);
2163 fprintf(stderr,
"************** Object locations ************");
2170 for (i = 1; i < nobj; i++) {
2172 if ((sscanf((
char *)(data + startloc),
"%d 0 obj", &objno)) != 1) {
2173 L_ERROR(
"bad trailer for object %d\n", procName, i);
2181 L_INFO(
"rebuilding pdf trailer\n", procName);
2186 for (i = 0; i < nobj; i++) {
2188 for (j = loc - 1; j > 0; j--) {
2206 generatePagesObjStringPdf(
NUMA *napage)
2210 l_int32 i, n, index, bufsize;
2213 PROCNAME(
"generatePagesObjStringPdf");
2216 return (
char *)ERROR_PTR(
"napage not defined", procName, NULL);
2219 bufsize = 100 + 16 * n;
2220 buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char));
2222 for (i = 0; i < n; i++) {
2224 snprintf(buf, bufsize,
" %d 0 R ", index);
2229 snprintf(buf, bufsize - 1,
"3 0 obj\n" 2260 l_uint8 space =
' ';
2263 l_int32 start, nrepl, i, j, objin, objout, found;
2264 l_int32 *objs, *matches;
2274 sscanf((
char *)datas,
"%d", &objin);
2275 objout = objs[objin];
2276 snprintf((
char *)buf, 32,
"%d", objout);
2291 for (i = 0; i < nrepl; i++) {
2293 for (j = matches[i] - 1; j > 0; j--) {
2294 if (datas[j] == space)
2299 sscanf((
char *)(datas + j + 1),
"%d", &objin);
2300 objout = objs[objin];
2301 snprintf((
char *)buf, 32,
"%d", objout);
2318 pdfdataCreate(
const char *title)
2341 PROCNAME(
"pdfdataDestroy");
2344 L_WARNING(
"ptr address is null!\n", procName);
2347 if ((lpd = *plpd) == NULL)
2351 for (i = 0; i < lpd->
n; i++) {
2357 if (lpd->
id) LEPT_FREE(lpd->
id);
2358 if (lpd->
obj1) LEPT_FREE(lpd->
obj1);
2359 if (lpd->
obj2) LEPT_FREE(lpd->
obj2);
2360 if (lpd->
obj3) LEPT_FREE(lpd->
obj3);
2361 if (lpd->
obj4) LEPT_FREE(lpd->
obj4);
2362 if (lpd->
obj5) LEPT_FREE(lpd->
obj5);
2382 PROCNAME(
"pdfdataGetCid");
2385 return (
L_COMP_DATA *)ERROR_PTR(
"lpd not defined", procName, NULL);
2386 if (index < 0 || index >= lpd->
n)
2387 return (
L_COMP_DATA *)ERROR_PTR(
"invalid image index", procName, NULL);
2413 var_WRITE_G4_IMAGE_MASK = flag;
2433 var_WRITE_DATE_AND_VERSION = flag;
l_int32 selectDefaultPdfEncoding(PIX *pix, l_int32 *ptype)
selectDefaultPdfEncoding()
void * ptraGetPtrToItem(L_PTRA *pa, l_int32 index)
ptraGetPtrToItem()
l_int32 l_generateCIData(const char *fname, l_int32 type, l_int32 quality, l_int32 ascii85, L_COMP_DATA **pcid)
l_generateCIData()
size_t l_byteaGetSize(L_BYTEA *ba)
l_byteaGetSize()
l_uint8 * zlibCompress(l_uint8 *datain, size_t nin, size_t *pnout)
zlibCompress()
char * sarrayToString(SARRAY *sa, l_int32 addnlflag)
sarrayToString()
l_int32 numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_int32 * l_dnaGetIArray(L_DNA *da)
l_dnaGetIArray()
PIXA * pixaReadMultipageTiff(const char *filename)
pixaReadMultipageTiff()
l_int32 ptraCompactArray(L_PTRA *pa)
ptraCompactArray()
l_int32 l_dnaGetCount(L_DNA *da)
l_dnaGetCount()
l_int32 ptaSetPt(PTA *pta, l_int32 index, l_float32 x, l_float32 y)
ptaSetPt()
l_int32 ptraConcatenatePdfToData(L_PTRA *pa_data, SARRAY *sa, l_uint8 **pdata, size_t *pnbytes)
ptraConcatenatePdfToData()
l_int32 readHeaderPng(const char *filename, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
readHeaderPng()
char * pixcmapConvertToHex(l_uint8 *data, l_int32 ncolors)
pixcmapConvertToHex()
static L_COMP_DATA * pixGenerateFlateData(PIX *pixs, l_int32 ascii85flag)
pixGenerateFlateData()
l_int32 numaaWriteStream(FILE *fp, NUMAA *naa)
numaaWriteStream()
l_int32 l_dnaAddNumber(L_DNA *da, l_float64 val)
l_dnaAddNumber()
l_int32 ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
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()
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()
l_int32 ptaGetPt(PTA *pta, l_int32 index, l_float32 *px, l_float32 *py)
ptaGetPt()
static L_COMP_DATA * pixGenerateJpegData(PIX *pixs, l_int32 ascii85flag, l_int32 quality)
pixGenerateJpegData()
l_int32 freadHeaderPng(FILE *fp, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
freadHeaderPng()
l_int32 l_dnaWriteStream(FILE *fp, L_DNA *da)
l_dnaWriteStream()
l_int32 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()
char * stringNew(const char *src)
stringNew()
l_uint8 * l_byteaGetData(L_BYTEA *ba, size_t *psize)
l_byteaGetData()
PTA * ptaCreate(l_int32 n)
ptaCreate()
static l_int32 l_generatePdf(l_uint8 **pdata, size_t *pnbytes, L_PDF_DATA *lpd)
l_generatePdf()
l_int32 cidConvertToPdfData(L_COMP_DATA *cid, const char *title, l_uint8 **pdata, size_t *pnbytes)
cidConvertToPdfData()
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()
SARRAY * sarrayCreate(l_int32 n)
sarrayCreate()
L_DNA * l_dnaaGetDna(L_DNAA *daa, l_int32 index, l_int32 accessflag)
l_dnaaGetDna()
l_int32 sarrayWriteStream(FILE *fp, SARRAY *sa)
sarrayWriteStream()
void pixcmapDestroy(PIXCMAP **pcmap)
pixcmapDestroy()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 l_dnaEmpty(L_DNA *da)
l_dnaEmpty()
NUMAA * numaaCreate(l_int32 n)
numaaCreate()
l_int32 findFileFormat(const char *filename, l_int32 *pformat)
findFileFormat()
l_int32 ptraAdd(L_PTRA *pa, void *item)
ptraAdd()
void numaaDestroy(NUMAA **pnaa)
numaaDestroy()
l_int32 l_dnaGetIValue(L_DNA *da, l_int32 index, l_int32 *pival)
l_dnaGetIValue()
l_int32 numaaAddNuma(NUMAA *naa, NUMA *na, l_int32 copyflag)
numaaAddNuma()
l_int32 l_byteaFindEachSequence(L_BYTEA *ba, l_uint8 *sequence, l_int32 seqlen, L_DNA **pda)
l_byteaFindEachSequence()
PIXCMAP * pixcmapCreate(l_int32 depth)
pixcmapCreate()
l_int32 pixGetRasterData(PIX *pixs, l_uint8 **pdata, size_t *pnbytes)
pixGetRasterData()
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()
void l_CIDataDestroy(L_COMP_DATA **pcid)
l_CIDataDestroy()
static const l_int32 L_INSERT
l_int32 pixcmapAddColor(PIXCMAP *cmap, l_int32 rval, l_int32 gval, l_int32 bval)
pixcmapAddColor()
char * getLeptonicaVersion()
getLeptonicaVersion()
L_PTRA * ptraCreate(l_int32 n)
ptraCreate()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_int32 pixReadHeader(const char *filename, l_int32 *pformat, l_int32 *pw, l_int32 *ph, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
pixReadHeader()
l_int32 pixWriteJpeg(const char *filename, PIX *pix, l_int32 quality, l_int32 progressive)
pixWriteJpeg()
void l_pdfSetDateAndVersion(l_int32 flag)
l_pdfSetDateAndVersion()
l_int32 l_byteaAppendString(L_BYTEA *ba, char *str)
l_byteaAppendString()
l_int32 boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
l_int32 l_byteaAppendData(L_BYTEA *ba, l_uint8 *newdata, size_t newbytes)
l_byteaAppendData()
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
PIX * pixClone(PIX *pixs)
pixClone()
L_DNA * l_dnaDiffAdjValues(L_DNA *das)
l_dnaDiffAdjValues()
l_int32 sarrayAddString(SARRAY *sa, char *string, l_int32 copyflag)
sarrayAddString()
l_int32 ptraGetActualCount(L_PTRA *pa, l_int32 *pcount)
ptraGetActualCount()
l_int32 pixaConvertToPdf(PIXA *pixa, l_int32 res, l_float32 scalefactor, l_int32 type, l_int32 quality, const char *title, const char *fileout)
pixaConvertToPdf()
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_int32 convertTiffMultipageToPdf(const char *filein, const char *fileout)
convertTiffMultipageToPdf()
static l_int32 generateOutputDataPdf(l_uint8 **pdata, size_t *pnbytes, L_PDF_DATA *lpd)
generateEscapeString()
SARRAY * sarrayCreateLinesFromString(const char *string, l_int32 blankflag)
sarrayCreateLinesFromString()
void numaDestroy(NUMA **pna)
numaDestroy()
l_int32 isPngInterlaced(const char *filename, l_int32 *pinterlaced)
isPngInterlaced()
static L_COMP_DATA * l_generateJp2kData(const char *fname)
l_generateJp2kData()
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_int32 extractG4DataFromFile(const char *filein, l_uint8 **pdata, size_t *pnbytes, l_int32 *pw, l_int32 *ph, l_int32 *pminisblack)
extractG4DataFromFile()
PIX * pixRead(const char *filename)
pixRead()
void l_pdfSetG4ImageMask(l_int32 flag)
l_pdfSetG4ImageMask()
l_int32 freadHeaderJpeg(FILE *fp, l_int32 *pw, l_int32 *ph, l_int32 *pspp, l_int32 *pycck, l_int32 *pcmyk)
freadHeaderJpeg()
l_int32 numaReplaceNumber(NUMA *na, l_int32 index, l_float32 val)
numaReplaceNumber()
L_DNA * l_dnaCreate(l_int32 n)
l_dnaCreate()
void * ptraRemove(L_PTRA *pa, l_int32 index, l_int32 flag)
ptraRemove()
char * l_getFormattedDate()
l_getFormattedDate()
l_int32 numaSetValue(NUMA *na, l_int32 index, l_float32 val)
numaSetValue()
l_int32 l_generateCIDataForPdf(const char *fname, PIX *pix, l_int32 quality, L_COMP_DATA **pcid)
l_generateCIDataForPdf()
void ptaDestroy(PTA **ppta)
ptaDestroy()
l_int32 pixGenerateCIData(PIX *pixs, l_int32 type, l_int32 quality, l_int32 ascii85, L_COMP_DATA **pcid)
pixGenerateCIData()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_int32 pixcmapSerializeToMemory(PIXCMAP *cmap, l_int32 cpc, l_int32 *pncolors, l_uint8 **pdata)
pixcmapSerializeToMemory()
static l_int32 parseTrailerPdf(L_BYTEA *bas, L_DNA **pda)
parseTrailerPdf()
L_COMP_DATA * l_generateJpegData(const char *fname, l_int32 ascii85flag)
l_generateJpegData()
void l_byteaDestroy(L_BYTEA **pba)
l_byteaDestroy()
l_int32 pixGetDimensions(PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
l_int32 l_dnaaAddDna(L_DNAA *daa, L_DNA *da, l_int32 copyflag)
l_dnaaAddDna()
l_int32 getTiffResolution(FILE *fp, l_int32 *pxres, l_int32 *pyres)
getTiffResolution()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
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_BYTEA * l_byteaInitFromMem(l_uint8 *data, size_t size)
l_byteaInitFromMem()
l_uint8 * l_byteaCopyData(L_BYTEA *ba, size_t *psize)
l_byteaCopyData()
l_int32 arrayFindSequence(const l_uint8 *data, size_t datalen, const l_uint8 *sequence, size_t seqlen, l_int32 *poffset, l_int32 *pfound)
arrayFindSequence()
l_int32 lept_rmfile(const char *filepath)
lept_rmfile()
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
l_int32 numaWriteStream(FILE *fp, NUMA *na)
numaWriteStream()