/* * Class: org_libharu_PdfPage * Method: drawPngImage * Signature: ([BFFFF)V */ JNIEXPORT void JNICALL Java_org_libharu_PdfPage_drawPngImage(JNIEnv *env, jobject obj, jbyteArray imageData, jfloat x, jfloat y, jfloat width, jfloat height) { jint page, pdf; jbyte* buffer; /* The image data as a jbyte[] (really signed char[]) */ jsize len; /* The number of elements in the image byte array */ /* Get mHPDFPagePointer */ page = (*env)->GetIntField(env, obj, mHPDFPagePointer); /* Get mParentHPDFDocPointer */ pdf = (*env)->GetIntField(env, obj, mParentHPDFDocPointer); /* Get the image data as a native byte array */ buffer = (*env)->GetByteArrayElements(env, imageData, NULL); /* Get the number of elements in the image byte array */ len = (*env)->GetArrayLength(env, imageData); /* Load an HPDF_Image from the image byte array */ HPDF_Image image = HPDF_LoadPngImageFromMem((HPDF_Doc) pdf, (HPDF_BYTE*) buffer, (HPDF_UINT) (len * sizeof(jbyte))); /* Actually draw the image */ HPDF_Page_DrawImage((HPDF_Page) page, image, (HPDF_REAL) x, (HPDF_REAL) y, (HPDF_REAL) width, (HPDF_REAL) height); /* Release (free) the native byte array */ (*env)->ReleaseByteArrayElements(env, imageData, buffer, JNI_ABORT); }
void WPdfImage::drawImage(const WRectF& rect, const std::string& imgUrl, int imgWidth, int imgHeight, const WRectF& srect) { HPDF_Image img = 0; if (Uri::isDataUri(imgUrl)) { Uri::Uri uri = Uri::parseDataUri(imgUrl); if ("image/png" == uri.mimeType) img = HPDF_LoadPngImageFromMem(pdf_, (HPDF_BYTE*)uri.data.c_str(), uri.data.size()); else if ("image/jpeg" == uri.mimeType) img = HPDF_LoadJpegImageFromMem(pdf_, (HPDF_BYTE*)uri.data.c_str(), uri.data.size()); } else { std::string mimeType = Image::identifyImageFileMimeType(imgUrl); if ("image/png" == mimeType) img = HPDF_LoadPngImageFromFile2(pdf_, imgUrl.c_str()); else if ("image/jpeg" == mimeType) img = HPDF_LoadJpegImageFromFile(pdf_, imgUrl.c_str()); } if (!img) throw WException("WPdfImage::drawImage(): cannot load image: " + imgUrl); double x = rect.x(); double y = rect.y(); double width = rect.width(); double height = rect.height(); HPDF_Page_GSave(page_); if (srect.x() != 0 || srect.y() != 0 || srect.width() != imgWidth || srect.height() != imgHeight) { double scaleX = width / imgWidth; double scaleY = height / imgHeight; x -= srect.x() * scaleX; y -= srect.y() * scaleY; width *= scaleX; height *= scaleY; HPDF_Page_Rectangle(page_, rect.x(), rect.y(), rect.width(), rect.height()); HPDF_Page_Clip(page_); } HPDF_Page_Concat(page_, 1, 0, 0, -1, x, y + height); // revert upside-down HPDF_Page_DrawImage(page_, img, 0, 0, width, height); HPDF_Page_GRestore(page_); }
int main (int argc, char **argv) { HPDF_Doc pdf; HPDF_Font font; HPDF_Page page; char fname[256]; HPDF_Image image; char *png_image_data; FILE *fp; HPDF_REAL x, y; strcpy (fname, argv[0]); strcat (fname, ".pdf"); pdf = HPDF_New (error_handler, NULL); if (!pdf) { printf ("error: cannot create PdfDoc object\n"); return 1; } /* error-handler */ if (setjmp(env)) { HPDF_Free (pdf); return 1; } HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL); /* create default-font */ font = HPDF_GetFont (pdf, "Helvetica", NULL); /* add a new page object. */ page = HPDF_AddPage (pdf); HPDF_Page_BeginText (page); HPDF_Page_SetFontAndSize (page, font, 20); HPDF_Page_MoveTextPos (page, 220, HPDF_Page_GetHeight (page) - 70); HPDF_Page_ShowText (page, "RawImageDemo"); HPDF_Page_EndText (page); int n; fp = fopen("2.png", "r"); png_image_data = malloc(1024*1024); n = fread(png_image_data, 1, 1024*1024, fp); fclose(fp); /* load GrayScale raw-image (1bit) file from memory. */ image = HPDF_LoadPngImageFromMem (pdf, png_image_data, n); /* Draw image to the canvas. (normal-mode with actual size.)*/ HPDF_Page_DrawImage (page, image, 20, 20, 1024, 768); free(png_image_data); /* save the document to a file */ HPDF_SaveToFile (pdf, fname); /* clean up */ HPDF_Free (pdf); return 0; }
void WPdfImage::drawImage(const WRectF& rect, const std::string& imgUrl, int imgWidth, int imgHeight, const WRectF& srect) { HPDF_Image img = nullptr; if (DataUri::isDataUri(imgUrl)) { #define HAVE_LOAD_FROM_MEM HPDF_MAJOR_VERSION > 2 || (HPDF_MAJOR_VERSION == 2 && (HPDF_MINOR_VERSION >= 2)) #if HAVE_LOAD_FROM_MEM DataUri uri(imgUrl); if ("image/png" == uri.mimeType) img = HPDF_LoadPngImageFromMem(pdf_, (HPDF_BYTE*)&uri.data[0], uri.data.size()); else if ("image/jpeg" == uri.mimeType) img = HPDF_LoadJpegImageFromMem(pdf_, (HPDF_BYTE*)&uri.data[0], uri.data.size()); #else LOG_ERROR("drawImage: data URI support requires libharu 2.2.0 or later"); #endif } else { std::string mimeType = ImageUtils::identifyMimeType(imgUrl); if ("image/png" == mimeType) img = HPDF_LoadPngImageFromFile2(pdf_, imgUrl.c_str()); else if ("image/jpeg" == mimeType) img = HPDF_LoadJpegImageFromFile(pdf_, imgUrl.c_str()); } if (!img) throw WException("WPdfImage::drawImage(): cannot load image: " + imgUrl); double x = rect.x(); double y = rect.y(); double width = rect.width(); double height = rect.height(); HPDF_Page_GSave(page_); if (srect.x() != 0 || srect.y() != 0 || srect.width() != imgWidth || srect.height() != imgHeight) { double scaleX = width / imgWidth; double scaleY = height / imgHeight; x -= srect.x() * scaleX; y -= srect.y() * scaleY; width *= scaleX; height *= scaleY; HPDF_Page_Rectangle(page_, rect.x(), rect.y(), rect.width(), rect.height()); HPDF_Page_Clip(page_); } HPDF_Page_Concat(page_, 1, 0, 0, -1, x, y + height); // revert upside-down HPDF_Page_DrawImage(page_, img, 0, 0, width, height); HPDF_Page_GRestore(page_); }