95 #include "allheaders.h" 102 static const l_int32 DEFAULT_INPUT_RES = 300;
111 static l_int32
l_generatePdf(l_uint8 **pdata,
size_t *pnbytes,
113 static void generateFixedStringsPdf(
L_PDF_DATA *lpd);
115 static void generateMediaboxPdf(
L_PDF_DATA *lpd);
116 static l_int32 generatePageStringPdf(
L_PDF_DATA *lpd);
117 static l_int32 generateContentStringPdf(
L_PDF_DATA *lpd);
118 static l_int32 generatePreXStringsPdf(
L_PDF_DATA *lpd);
119 static l_int32 generateColormapStringsPdf(
L_PDF_DATA *lpd);
120 static void generateTrailerPdf(
L_PDF_DATA *lpd);
121 static char *makeTrailerStringPdf(
L_DNA *daloc);
126 static char *generatePagesObjStringPdf(
NUMA *napage);
129 static L_PDF_DATA *pdfdataCreate(
const char *title);
130 static void pdfdataDestroy(
L_PDF_DATA **plpd);
136 static l_int32 var_WRITE_G4_IMAGE_MASK = 1;
138 static l_int32 var_WRITE_DATE_AND_VERSION = 1;
140 #define L_SMALLBUF 256 141 #define L_BIGBUF 2048 144 #ifndef NO_CONSOLE_IO 145 #define DEBUG_MULTIPAGE 0 194 l_int32 pixres, w, h, ret;
195 l_float32 xpt, ypt, wpt, hpt;
199 PROCNAME(
"pixConvertToPdfData");
202 return ERROR_INT(
"&data not defined", procName, 1);
205 return ERROR_INT(
"&nbytes not defined", procName, 1);
208 return ERROR_INT(
"pix not defined", procName, 1);
218 return ERROR_INT(
"cid not made", procName, 1);
230 res = DEFAULT_INPUT_RES;
239 if ((lpd = pdfdataCreate(title)) == NULL)
240 return ERROR_INT(
"lpd not made", procName, 1);
242 if ((lpd = pdfdataCreate(title)) == NULL)
243 return ERROR_INT(
"lpd not made", procName, 1);
259 pdfdataDestroy(&lpd);
260 if (plpd) *plpd = NULL;
262 return ERROR_INT(
"pdf output not made", procName, 1);
312 char *fname, *str_pages, *str_trailer;
313 l_uint8 *pdfdata, *data;
314 l_int32 i, j, index, nobj, npages;
315 l_int32 *sizes, *locs;
317 L_BYTEA *bas, *bad, *bat1, *bat2;
318 L_DNA *da_locs, *da_sizes, *da_outlocs, *da;
320 NUMA *na_objs, *napage;
323 PROCNAME(
"ptraConcatenatePdfToData");
326 return ERROR_INT(
"&data not defined", procName, 1);
329 return ERROR_INT(
"&nbytes not defined", procName, 1);
332 return ERROR_INT(
"pa_data not defined", procName, 1);
338 for (i = 0; i < npages; i++) {
345 L_ERROR(
"can't parse file %s; skipping\n", procName, fname);
347 L_ERROR(
"can't parse file %d; skipping\n", procName, i);
359 return ERROR_INT(
"no parsable pdf files found", procName, 1);
366 for (i = 0; i < npages; i++) {
377 for (j = 4; j < nobj - 1; j++)
385 str_pages = generatePagesObjStringPdf(napage);
390 for (i = 0; i < npages; i++) {
404 for (j = 0; j < 4; j++)
407 for (j = 4; j < nobj; j++) {
426 str_trailer = makeTrailerStringPdf(da_outlocs);
434 fprintf(stderr,
"******** object mapper **********");
437 fprintf(stderr,
"******** Page object numbers ***********");
440 fprintf(stderr,
"******** Pages object ***********\n");
441 fprintf(stderr,
"%s\n", str_pages);
448 LEPT_FREE(str_pages);
449 LEPT_FREE(str_trailer);
478 PROCNAME(
"convertTiffMultipageToPdf");
481 return ERROR_INT(
"file not found", procName, 1);
485 return ERROR_INT(
"file not tiff format", procName, 1);
525 l_int32 format, type;
529 PROCNAME(
"l_generateCIDataForPdf");
532 return ERROR_INT(
"&cid not defined", procName, 1);
535 return ERROR_INT(
"neither fname nor pix are defined", procName, 1);
539 if (fname && strcmp(fname,
"-") != 0 && strcmp(fname,
"stdin") != 0) {
541 if (format == IFF_UNKNOWN)
542 L_WARNING(
"file %s format is unknown\n", procName, fname);
543 if (format == IFF_PS || format == IFF_LPDF) {
544 L_ERROR(
"file %s is unsupported format %d\n",
545 procName, fname, format);
548 if (format == IFF_JFIF_JPEG) {
550 }
else if (format == IFF_JP2) {
552 }
else if (format == IFF_PNG) {
565 return ERROR_INT(
"pixt not made", procName, 1);
571 L_ERROR(
"totally kerflummoxed\n", procName);
601 l_uint8 *pngcomp = NULL;
602 l_uint8 *datacomp = NULL;
603 l_uint8 *cmapdata = NULL;
604 char *cmapdatahex = NULL;
606 l_int32 format, interlaced;
610 l_int32 w, h, cmapflag;
612 size_t nbytescomp = 0, nbytespng = 0;
618 PROCNAME(
"l_generateFlateDataPdf");
621 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
627 if (format == IFF_PNG) {
641 if (format != IFF_PNG || interlaced || bps == 1 || spp == 4 || spp == 2) {
647 return (
L_COMP_DATA *)ERROR_PTR(
"pix not made", procName, NULL);
657 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
659 fgetPngResolution(fp, &xres, &yres);
667 if ((pngcomp =
l_binaryRead(fname, &nbytespng)) == NULL)
668 return (
L_COMP_DATA *)ERROR_PTR(
"unable to read file",
677 if ((datacomp = (l_uint8 *)LEPT_CALLOC(1, nbytespng)) == NULL) {
679 return (
L_COMP_DATA *)ERROR_PTR(
"unable to allocate memory",
693 for (i = 16; i < nbytespng; i += 12) {
695 n = pngcomp[i - 8] << 24;
696 n += pngcomp[i - 7] << 16;
697 n += pngcomp[i - 6] << 8;
698 n += pngcomp[i - 5] << 0;
699 if (i + n >= nbytespng) {
703 L_ERROR(
"invalid png: i = %d, n = %d, nbytes = %lu\n", procName,
704 i, n, (
unsigned long)nbytespng);
709 if (memcmp(pngcomp + i - 4,
"IDAT", 4) == 0) {
710 memcpy(datacomp + nbytescomp, pngcomp + i, n);
715 if (cmapflag && !cmap &&
716 memcmp(pngcomp + i - 4,
"PLTE", 4) == 0) {
717 if ((n / 3) > (1 << bps)) {
721 L_ERROR(
"invalid png: i = %d, n = %d, cmapsize = %d\n",
722 procName, i, n, (1 << bps));
726 for (j = i; j < i + n; j += 3) {
735 if (nbytescomp == 0) {
738 return (
L_COMP_DATA *)ERROR_PTR(
"invalid PNG file", procName, NULL);
748 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
799 l_uint8 *data = NULL;
802 PROCNAME(
"l_generateJpegData");
805 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
810 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", procName, NULL);
835 l_int32 w, h, xres, yres, bps, spp;
839 PROCNAME(
"l_generateJpegDataMem");
842 return (
L_COMP_DATA *)ERROR_PTR(
"data not defined", procName, NULL);
850 if (ascii85flag == 1) {
851 data85 = encodeAscii85(data, nbytes, &nbytes85);
854 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
856 data85[nbytes85 - 1] =
'\0';
860 if (ascii85flag == 0) {
891 l_int32 w, h, bps, spp;
895 PROCNAME(
"l_generateJp2kData");
898 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
901 return (
L_COMP_DATA *)ERROR_PTR(
"cid not made", procName, NULL);
906 return (
L_COMP_DATA *)ERROR_PTR(
"data not extracted", procName, NULL);
950 l_int32 format, d, bps, spp, iscmap;
954 PROCNAME(
"l_generateCIData");
957 return ERROR_INT(
"&cid not defined", procName, 1);
960 return ERROR_INT(
"fname not defined", procName, 1);
963 return ERROR_INT(
"invalid conversion type", procName, 1);
964 if (ascii85 != 0 && ascii85 != 1)
965 return ERROR_INT(
"invalid ascii85", procName, 1);
968 pixReadHeader(fname, &format, NULL, NULL, &bps, &spp, &iscmap);
972 L_WARNING(
"pixs has cmap; using flate encoding\n", procName);
975 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
978 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
981 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", procName);
986 if (format == IFF_JFIF_JPEG) {
989 if ((pix =
pixRead(fname)) == NULL)
990 return ERROR_INT(
"pix not returned", procName, 1);
995 return ERROR_INT(
"jpeg data not made", procName, 1);
997 if (format == IFF_JP2) {
1000 if ((pix =
pixRead(fname)) == NULL)
1001 return ERROR_INT(
"pix not returned", procName, 1);
1006 return ERROR_INT(
"jpeg data not made", procName, 1);
1009 return ERROR_INT(
"g4 data not made", procName, 1);
1012 return ERROR_INT(
"flate data not made", procName, 1);
1014 return ERROR_INT(
"invalid conversion type", procName, 1);
1049 PROCNAME(
"pixGenerateCIData");
1052 return ERROR_INT(
"&cid not defined", procName, 1);
1055 return ERROR_INT(
"pixs not defined", procName, 1);
1058 return ERROR_INT(
"invalid conversion type", procName, 1);
1059 if (ascii85 != 0 && ascii85 != 1)
1060 return ERROR_INT(
"invalid ascii85", procName, 1);
1063 d = pixGetDepth(pixs);
1064 cmap = pixGetColormap(pixs);
1066 L_WARNING(
"pixs has cmap; using flate encoding\n", procName);
1069 L_WARNING(
"pixs has < 8 bpp; using flate encoding\n", procName);
1072 L_WARNING(
"pixs has > 1 bpp; using flate encoding\n", procName);
1078 return ERROR_INT(
"jpeg data not made", procName, 1);
1081 return ERROR_INT(
"g4 data not made", procName, 1);
1084 return ERROR_INT(
"flate data not made", procName, 1);
1086 return ERROR_INT(
"invalid conversion type", procName, 1);
1114 l_int32 ascii85flag)
1119 PROCNAME(
"l_generateFlateData");
1122 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1124 if ((pixs =
pixRead(fname)) == NULL)
1125 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not made", procName, NULL);
1148 l_int32 ascii85flag)
1150 l_uint8 *data = NULL;
1151 l_uint8 *datacomp = NULL;
1152 char *data85 = NULL;
1153 l_uint8 *cmapdata = NULL;
1154 char *cmapdata85 = NULL;
1155 char *cmapdatahex = NULL;
1159 l_int32 w, h, d, cmapflag;
1160 l_int32 ncmapbytes85 = 0;
1161 l_int32 nbytes85 = 0;
1162 size_t nbytes, nbytescomp;
1167 PROCNAME(
"pixGenerateFlateData");
1170 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1178 cmap = pixGetColormap(pixs);
1179 cmapflag = (cmap) ? 1 : 0;
1180 if (d == 2 || d == 4 || d == 16) {
1182 cmap = pixGetColormap(pixt);
1183 d = pixGetDepth(pixt);
1187 spp = (d == 32) ? 3 : 1;
1188 bps = (d == 32) ? 8 : d;
1196 return (
L_COMP_DATA *)ERROR_PTR(
"cmapdata not made",
1200 cmapdata85 = encodeAscii85(cmapdata, 3 * ncolors, &ncmapbytes85);
1202 LEPT_FREE(cmapdata);
1211 LEPT_FREE(cmapdata85);
1212 LEPT_FREE(cmapdatahex);
1213 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not made", procName, NULL);
1217 if (ascii85flag == 1) {
1218 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1219 LEPT_FREE(datacomp);
1221 LEPT_FREE(cmapdata85);
1222 LEPT_FREE(cmapdatahex);
1223 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1225 data85[nbytes85 - 1] =
'\0';
1230 if (ascii85flag == 0) {
1245 cid->
res = pixGetXRes(pixs);
1268 l_int32 ascii85flag,
1275 PROCNAME(
"pixGenerateJpegData");
1278 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1279 if (pixGetColormap(pixs))
1280 return (
L_COMP_DATA *)ERROR_PTR(
"pixs has colormap", procName, NULL);
1281 d = pixGetDepth(pixs);
1282 if (d != 8 && d != 32)
1283 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 8 or 32 bpp", procName, NULL);
1312 l_int32 ascii85flag)
1317 PROCNAME(
"pixGenerateG4Data");
1320 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not defined", procName, NULL);
1321 if (pixGetDepth(pixs) != 1)
1322 return (
L_COMP_DATA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
1326 pixWrite(tname, pixs, IFF_TIFF_G4);
1352 l_int32 ascii85flag)
1354 l_uint8 *datacomp = NULL;
1355 char *data85 = NULL;
1356 l_int32 w, h, xres, yres;
1363 PROCNAME(
"l_generateG4Data");
1366 return (
L_COMP_DATA *)ERROR_PTR(
"fname not defined", procName, NULL);
1370 return (
L_COMP_DATA *)ERROR_PTR(
"stream not opened", procName, NULL);
1378 &w, &h, &minisblack)) {
1379 return (
L_COMP_DATA *)ERROR_PTR(
"datacomp not extracted",
1384 if (ascii85flag == 1) {
1385 data85 = encodeAscii85(datacomp, nbytescomp, &nbytes85);
1386 LEPT_FREE(datacomp);
1388 return (
L_COMP_DATA *)ERROR_PTR(
"data85 not made", procName, NULL);
1390 data85[nbytes85 - 1] =
'\0';
1394 if (ascii85flag == 0) {
1437 PROCNAME(
"cidConvertToPdfData");
1439 if (!pdata || !pnbytes)
1440 return ERROR_INT(
"&data and &nbytes not both defined", procName, 1);
1444 return ERROR_INT(
"cid not defined", procName, 1);
1449 res = DEFAULT_INPUT_RES;
1450 wpt = cid->
w * 72. / res;
1451 hpt = cid->
h * 72. / res;
1454 if ((lpd = pdfdataCreate(title)) == NULL)
1455 return ERROR_INT(
"lpd not made", procName, 1);
1463 pdfdataDestroy(&lpd);
1465 return ERROR_INT(
"pdf output not made", procName, 1);
1481 PROCNAME(
"l_CIDataDestroy");
1484 L_WARNING(
"ptr address is null!\n", procName);
1487 if ((cid = *pcid) == NULL)
1529 PROCNAME(
"l_generatePdf");
1532 return ERROR_INT(
"&data not defined", procName, 1);
1535 return ERROR_INT(
"&nbytes not defined", procName, 1);
1538 return ERROR_INT(
"lpd not defined", procName, 1);
1540 generateFixedStringsPdf(lpd);
1541 generateMediaboxPdf(lpd);
1542 generatePageStringPdf(lpd);
1543 generateContentStringPdf(lpd);
1544 generatePreXStringsPdf(lpd);
1545 generateColormapStringsPdf(lpd);
1546 generateTrailerPdf(lpd);
1554 char buf[L_SMALLBUF];
1555 char *version, *datestr;
1558 PROCNAME(
"generateFixedStringsPdf");
1575 if (var_WRITE_DATE_AND_VERSION) {
1577 snprintf(buf,
sizeof(buf),
"/CreationDate (D:%s)\n", datestr);
1581 snprintf(buf,
sizeof(buf),
1582 "/Producer (leptonica: %s)\n", version);
1585 snprintf(buf,
sizeof(buf),
"/Producer (leptonica)\n");
1591 snprintf(buf,
sizeof(buf),
"/Title %s\n", hexstr);
1594 L_ERROR(
"title string is not ascii\n", procName);
1642 l_int32 i, nchar, buflen;
1644 PROCNAME(
"generateEscapeString");
1647 return (
char *)ERROR_PTR(
"str not defined", procName, NULL);
1648 nchar = strlen(str);
1649 for (i = 0; i < nchar; i++) {
1651 return (
char *)ERROR_PTR(
"str not all ascii", procName, NULL);
1654 buflen = 4 * nchar + 10;
1655 buffer = (
char *)LEPT_CALLOC(buflen,
sizeof(
char));
1657 for (i = 0; i < nchar; i++) {
1658 snprintf(smallbuf,
sizeof(smallbuf),
"%04x", str[i]);
1670 l_float32 xpt, ypt, wpt, hpt, maxx, maxy;
1675 for (i = 0; i < lpd->
n; i++) {
1678 maxx = L_MAX(maxx, xpt + wpt);
1679 maxy = L_MAX(maxy, ypt + hpt);
1683 (l_int32)(maxy + 0.5));
1689 for (i = 0; i < lpd->
n; i++) {
1704 l_int32 bufsize, i, wpt, hpt;
1707 PROCNAME(
"generatePageStringPdf");
1712 bufsize = 1000 + 50 * lpd->
n;
1713 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1714 return ERROR_INT(
"calloc fail for buf", procName, 1);
1718 for (i = 0; i < lpd->
n; i++) {
1719 snprintf(buf, bufsize,
"/Im%d %d 0 R ", i + 1, 6 + i);
1726 return ERROR_INT(
"xstr not made", procName, 1);
1729 snprintf(buf, bufsize,
"4 0 obj\n" 1733 "/MediaBox [%d %d %d %d]\n" 1737 "/XObject << %s >>\n" 1738 "/ProcSet [ /ImageB /ImageI /ImageC ]\n" 1742 0, 0, wpt, hpt, xstr);
1759 l_float32 xpt, ypt, wpt, hpt;
1762 PROCNAME(
"generateContentStringPdf");
1764 bufsize = 1000 + 200 * lpd->
n;
1765 if ((buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char))) == NULL)
1766 return ERROR_INT(
"calloc fail for buf", procName, 1);
1769 for (i = 0; i < lpd->
n; i++) {
1772 snprintf(buf, bufsize,
1773 "q %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
1774 wpt, 0.0, 0.0, hpt, xpt, ypt, i + 1);
1781 return ERROR_INT(
"cstr not made", procName, 1);
1784 snprintf(buf, bufsize,
"5 0 obj\n" 1785 "<< /Length %d >>\n" 1790 (l_int32)strlen(cstr), cstr);
1806 char *cstr, *bstr, *fstr, *pstr, *xstr;
1811 PROCNAME(
"generatePreXStringsPdf");
1814 cmindex = 6 + lpd->
n;
1815 for (i = 0; i < lpd->
n; i++) {
1817 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
1818 return ERROR_INT(
"cid not found", procName, 1);
1821 if (var_WRITE_G4_IMAGE_MASK) {
1823 "/ColorSpace /DeviceGray");
1825 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1827 bstr =
stringNew(
"/BitsPerComponent 1\n" 1828 "/Interpolate true");
1829 snprintf(buff,
sizeof(buff),
1830 "/Filter /CCITTFaxDecode\n" 1839 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1840 else if (cid->
spp == 3)
1841 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1842 else if (cid->
spp == 4)
1843 cstr =
stringNew(
"/ColorSpace /DeviceCMYK");
1845 L_ERROR(
"in jpeg: spp != 1, 3 or 4\n", procName);
1846 bstr =
stringNew(
"/BitsPerComponent 8");
1850 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1851 else if (cid->
spp == 3)
1852 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1854 L_ERROR(
"in jp2k: spp != 1 && spp != 3\n", procName);
1855 bstr =
stringNew(
"/BitsPerComponent 8");
1859 snprintf(buff,
sizeof(buff),
"/ColorSpace %d 0 R", cmindex++);
1862 if (cid->
spp == 1 && cid->
bps == 1)
1863 cstr =
stringNew(
"/ColorSpace /DeviceGray\n" 1865 else if (cid->
spp == 1)
1866 cstr =
stringNew(
"/ColorSpace /DeviceGray");
1867 else if (cid->
spp == 3)
1868 cstr =
stringNew(
"/ColorSpace /DeviceRGB");
1870 L_ERROR(
"unknown colorspace: spp = %d\n",
1871 procName, cid->
spp);
1873 snprintf(buff,
sizeof(buff),
"/BitsPerComponent %d", cid->
bps);
1875 fstr =
stringNew(
"/Filter /FlateDecode");
1877 snprintf(buff,
sizeof(buff),
1883 " /BitsPerComponent %d\n" 1884 ">>\n", cid->
w, cid->
spp, cid->
bps);
1891 snprintf(buf,
sizeof(buf),
1905 cid->
w, cid->
h, bstr, fstr, pstr);
1925 l_int32 i, cmindex, ncmap;
1929 PROCNAME(
"generateColormapStringsPdf");
1935 cmindex = 6 + lpd->
n;
1937 for (i = 0; i < lpd->
n; i++) {
1938 if ((cid = pdfdataGetCid(lpd, i)) == NULL)
1939 return ERROR_INT(
"cid not found", procName, 1);
1940 if (cid->
ncolors == 0)
continue;
1943 snprintf(buf,
sizeof(buf),
"%d 0 obj\n" 1944 "[ /Indexed /DeviceRGB\n" 1964 l_int32 i, n, size, linestart;
1965 L_DNA *daloc, *dasize;
1990 for (i = 0; i < n; i++) {
1998 lpd->
trailer = makeTrailerStringPdf(daloc);
2003 makeTrailerStringPdf(
L_DNA *daloc)
2007 l_int32 i, n, linestart, xrefloc;
2010 PROCNAME(
"makeTrailerStringPdf");
2013 return (
char *)ERROR_PTR(
"daloc not defined", procName, NULL);
2017 snprintf(buf,
sizeof(buf),
"xref\n" 2019 "0000000000 65535 f \n", n);
2021 for (i = 1; i < n; i++) {
2023 snprintf(buf,
sizeof(buf),
"%010d 00000 n \n", linestart);
2028 snprintf(buf,
sizeof(buf),
"trailer\n" 2036 "%%%%EOF\n", n, xrefloc);
2064 l_int32 nimages, i, len;
2065 l_int32 *sizes, *locs;
2069 PROCNAME(
"generateOutputDataPdf");
2072 return ERROR_INT(
"&data not defined", procName, 1);
2075 return ERROR_INT(
"&nbytes not defined", procName, 1);
2078 if ((data = (l_uint8 *)LEPT_CALLOC(nbytes,
sizeof(l_uint8))) == NULL)
2079 return ERROR_INT(
"calloc fail for data", procName, 1);
2084 memcpy(data, lpd->
id, sizes[0]);
2085 memcpy(data + locs[1], lpd->
obj1, sizes[1]);
2086 memcpy(data + locs[2], lpd->
obj2, sizes[2]);
2087 memcpy(data + locs[3], lpd->
obj3, sizes[3]);
2088 memcpy(data + locs[4], lpd->
obj4, sizes[4]);
2089 memcpy(data + locs[5], lpd->
obj5, sizes[5]);
2094 for (i = 0; i < nimages; i++) {
2095 if ((cid = pdfdataGetCid(lpd, i)) == NULL) {
2098 return ERROR_INT(
"cid not found", procName, 1);
2102 memcpy(data + locs[6 + i], str, len);
2103 memcpy(data + locs[6 + i] + len,
2105 memcpy(data + locs[6 + i] + len + cid->
nbytescomp,
2110 for (i = 0; i < lpd->
ncmap; i++) {
2112 memcpy(data + locs[6 + nimages + i], str, strlen(str));
2140 l_int32 i, j, start, startloc, xrefloc, found, loc, nobj, objno, trailer_ok;
2142 L_DNA *da, *daobj, *daxref;
2145 PROCNAME(
"parseTrailerPdf");
2148 return ERROR_INT(
"&da not defined", procName, 1);
2151 return ERROR_INT(
"bas not defined", procName, 1);
2153 if (memcmp(data,
"%PDF-1.", 7) != 0)
2154 return ERROR_INT(
"PDF header signature not found", procName, 1);
2161 (l_uint8 *)
"startxref\n", 10, &loc, &found);
2163 return ERROR_INT(
"startxref not found!", procName, 1);
2164 if (sscanf((
char *)(data + start + loc + 10),
"%d\n", &xrefloc) != 1)
2165 return ERROR_INT(
"xrefloc not found!", procName, 1);
2166 if (xrefloc < 0 || xrefloc >= size)
2167 return ERROR_INT(
"invalid xrefloc!", procName, 1);
2170 if ((sscanf(str,
"0 %d", &nobj)) != 1) {
2172 return ERROR_INT(
"nobj not found", procName, 1);
2179 for (i = 0; i < nobj; i++) {
2181 sscanf(str,
"%d", &startloc);
2187 fprintf(stderr,
"************** Trailer string ************\n");
2188 fprintf(stderr,
"xrefloc = %d", xrefloc);
2191 fprintf(stderr,
"************** Object locations ************");
2198 for (i = 1; i < nobj; i++) {
2200 if ((sscanf((
char *)(data + startloc),
"%d 0 obj", &objno)) != 1) {
2201 L_ERROR(
"bad trailer for object %d\n", procName, i);
2209 L_INFO(
"rebuilding pdf trailer\n", procName);
2214 for (i = 0; i < nobj; i++) {
2216 for (j = loc - 1; j > 0; j--) {
2234 generatePagesObjStringPdf(
NUMA *napage)
2238 l_int32 i, n, index, bufsize;
2241 PROCNAME(
"generatePagesObjStringPdf");
2244 return (
char *)ERROR_PTR(
"napage not defined", procName, NULL);
2247 bufsize = 100 + 16 * n;
2248 buf = (
char *)LEPT_CALLOC(bufsize,
sizeof(
char));
2250 for (i = 0; i < n; i++) {
2252 snprintf(buf, bufsize,
" %d 0 R ", index);
2257 snprintf(buf, bufsize - 1,
"3 0 obj\n" 2288 l_uint8 space =
' ';
2291 l_int32 start, nrepl, i, j, objin, objout, found;
2292 l_int32 *objs, *matches;
2302 sscanf((
char *)datas,
"%d", &objin);
2303 objout = objs[objin];
2304 snprintf((
char *)buf, 32,
"%d", objout);
2319 for (i = 0; i < nrepl; i++) {
2321 for (j = matches[i] - 1; j > 0; j--) {
2322 if (datas[j] == space)
2327 sscanf((
char *)(datas + j + 1),
"%d", &objin);
2328 objout = objs[objin];
2329 snprintf((
char *)buf, 32,
"%d", objout);
2346 pdfdataCreate(
const char *title)
2369 PROCNAME(
"pdfdataDestroy");
2372 L_WARNING(
"ptr address is null!\n", procName);
2375 if ((lpd = *plpd) == NULL)
2379 for (i = 0; i < lpd->
n; i++) {
2385 if (lpd->
id) LEPT_FREE(lpd->
id);
2386 if (lpd->
obj1) LEPT_FREE(lpd->
obj1);
2387 if (lpd->
obj2) LEPT_FREE(lpd->
obj2);
2388 if (lpd->
obj3) LEPT_FREE(lpd->
obj3);
2389 if (lpd->
obj4) LEPT_FREE(lpd->
obj4);
2390 if (lpd->
obj5) LEPT_FREE(lpd->
obj5);
2410 PROCNAME(
"pdfdataGetCid");
2413 return (
L_COMP_DATA *)ERROR_PTR(
"lpd not defined", procName, NULL);
2414 if (index < 0 || index >= lpd->
n)
2415 return (
L_COMP_DATA *)ERROR_PTR(
"invalid image index", procName, NULL);
2441 var_WRITE_G4_IMAGE_MASK = flag;
2461 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_uint8 * zlibCompress(l_uint8 *datain, size_t nin, size_t *pnout)
zlibCompress()
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()
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()
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()
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_ok sarrayWriteStream(FILE *fp, SARRAY *sa)
sarrayWriteStream()
L_DNA * l_dnaaGetDna(L_DNAA *daa, l_int32 index, l_int32 accessflag)
l_dnaaGetDna()
l_ok numaWriteStream(FILE *fp, NUMA *na)
numaWriteStream()
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()
l_ok l_dnaWriteStream(FILE *fp, L_DNA *da)
l_dnaWriteStream()
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()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
char * getLeptonicaVersion()
getLeptonicaVersion()
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()
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()
void l_pdfSetG4ImageMask(l_int32 flag)
l_pdfSetG4ImageMask()
l_ok isPngInterlaced(const char *filename, l_int32 *pinterlaced)
isPngInterlaced()
char * l_makeTempFilename()
l_makeTempFilename()
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()
char * l_getFormattedDate()
l_getFormattedDate()
void ptaDestroy(PTA **ppta)
ptaDestroy()
l_ok numaReplaceNumber(NUMA *na, l_int32 index, l_float32 val)
numaReplaceNumber()
void boxDestroy(BOX **pbox)
boxDestroy()
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()
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_uint8 * l_byteaCopyData(L_BYTEA *ba, size_t *psize)
l_byteaCopyData()
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()