/* * Class: org_libharu_PdfPage * Method: setRGBFill * Signature: (FFF)V */ JNIEXPORT void JNICALL Java_org_libharu_PdfPage_setRGBFill(JNIEnv *env, jobject obj, jfloat red, jfloat green, jfloat blue) { jint page; /* Get mHPDFPagePointer */ page = (*env)->GetIntField(env, obj, mHPDFPagePointer); HPDF_Page_SetRGBFill((HPDF_Page) page, (HPDF_REAL) red, (HPDF_REAL) green, (HPDF_REAL) blue); }
JNIEXPORT void JNICALL Java_com_draekko_libharu_PdfPage_setRGBFill (JNIEnv *env, jobject obj, jfloat red, jfloat green, jfloat blue) { haru_setup_error_handler(env, __func__); HPDF_Page page = get_HPDF_Page(env, obj); HPDF_Page_SetRGBFill(page, red, green, blue); haru_clear_error_handler(); }
/** * Checks if given fill colour is already set in PDF gstate and if not, * update the gstate accordingly. * \param page PDF page where the update needs to happen. * \param col Wanted fill colour. */ void pdfw_gs_fillcolour(HPDF_Page page, colour col) { if (col == pdfw_gs[pdfw_gs_level].fillColour) return; pdfw_gs[pdfw_gs_level].fillColour = col; if (RBYTE(col) == GBYTE(col) && GBYTE(col) == BBYTE(col)) HPDF_Page_SetGrayFill(pdf_page, R(col)); else HPDF_Page_SetRGBFill(pdf_page, R(col), G(col), B(col)); }
void draw_circles (HPDF_Page page, const char *description, HPDF_REAL x, HPDF_REAL y) { HPDF_Page_SetLineWidth (page, 1.0f); HPDF_Page_SetRGBStroke (page, 0.0f, 0.0f, 0.0f); HPDF_Page_SetRGBFill (page, 1.0f, 0.0f, 0.0f); HPDF_Page_Circle (page, x + 40, y + 40, 40); HPDF_Page_ClosePathFillStroke (page); HPDF_Page_SetRGBFill (page, 0.0f, 1.0f, 0.0f); HPDF_Page_Circle (page, x + 100, y + 40, 40); HPDF_Page_ClosePathFillStroke (page); HPDF_Page_SetRGBFill (page, 0.0f, 0.0f, 1.0f); HPDF_Page_Circle (page, x + 70, y + 74.64, 40); HPDF_Page_ClosePathFillStroke (page); HPDF_Page_SetRGBFill (page, 0.0f, 0.0f, 0.0f); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, x + 0.0f, y + 130.0f, description); HPDF_Page_EndText (page); }
void show_description (HPDF_Page page, HPDF_REAL x, HPDF_REAL y, const char *text) { float fsize = HPDF_Page_GetCurrentFontSize (page); HPDF_Font font = HPDF_Page_GetCurrentFont (page); HPDF_RGBColor c = HPDF_Page_GetRGBFill (page); HPDF_Page_BeginText (page); HPDF_Page_SetRGBFill (page, 0, 0, 0); HPDF_Page_SetTextRenderingMode (page, HPDF_FILL); HPDF_Page_SetFontAndSize (page, font, 10); HPDF_Page_TextOut (page, x, y - 12, text); HPDF_Page_EndText (page); HPDF_Page_SetFontAndSize (page, font, fsize); HPDF_Page_SetRGBFill (page, c.r, c.g, c.b); }
int main (int argc, char **argv) { HPDF_Doc pdf; HPDF_Page page; HPDF_Font def_font; HPDF_REAL height; HPDF_REAL width; HPDF_UINT i; int page_num = 1; int done = 0; char page_number[MAXSTRING]; int line_num = 1; FILE *input_file = NULL; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-t") == 0) { strcpy(page_title, argv[++i]); } else if (strcmp(argv[i], "-o") == 0) { strcpy(fname, argv[++i]); } else if (strcmp(argv[i], "-k") == 0) { page_margin_odd = page_margin_kindle; page_margin_even = page_margin_kindle; } else if (strcmp(argv[i], "-n") == 0) { no_line_number = 1; } else if (strcmp(argv[i], "-h")==0) { usage(); } else if (strcmp(argv[i], "-l") == 0) { use_landscape = 1; page_margin_odd = page_margin_odd_landscape; page_margin_even = page_margin_even_landscape; LINES_PER_PAGE=50; } else if (strcmp(argv[i], "-")==0) { input_file = stdin; } else { input_file = fopen(argv[i], "r"); } } if (input_file == NULL) { printf("error: no input specified\n"); usage(); } pdf = HPDF_New (error_handler, NULL); if (!pdf) { printf ("error: cannot create PdfDoc object\n"); return 1; } if (setjmp(env)) { HPDF_Free (pdf); return 1; } while (!done) { int n = 0; char buf[1000]; char *p; while ((p = fgets(buf, 999, input_file)) && n < LINES_PER_PAGE) { if (buf[0] == '@') { if (strncmp(buf, "@title ", 7)==0) { strcpy(page_title, buf+7); } else if (strncmp(buf, "@newpage", 8)==0) { if (n != 0 && n != LINES_PER_PAGE-1) { line_num += LINES_PER_PAGE; line_num -= line_num % LINES_PER_PAGE; line_num ++; break; } } continue; } lines[n].line_num = line_num++; strcpy(lines[n].line, buf); n++; } /* If no more input in future, this is the last page, * flag as done. */ if (p == NULL) done = 1; /* If no lines are read, we are done. */ if (n == 0) break; /* Add a new page object. */ page = HPDF_AddPage (pdf); HPDF_Page_SetSize (page, HPDF_PAGE_SIZE_A4, use_landscape?HPDF_PAGE_LANDSCAPE:HPDF_PAGE_PORTRAIT); HPDF_Page_SetRGBFill(page, 0, 0, 0); height = HPDF_Page_GetHeight (page); width = HPDF_Page_GetWidth (page); page_margin = EVENPAGE(page_num) ? page_margin_even : page_margin_odd; page_size.cx = (int)width; page_size.cy = (int)height; def_font = HPDF_GetFont (pdf, default_font_name, NULL); HPDF_Page_SetFontAndSize (page, def_font, 16); print_page_header(pdf, page, page_title); print_page_content(pdf, page, lines, n); sprintf(page_number, "%d", page_num); print_page_footer(pdf, page, page_number); page_num++; } if (page_num > 1) { HPDF_SaveToFile (pdf, fname); printf("Output written to %s\n", fname); } else { printf("No output\n"); } if (input_file != stdin && input_file != NULL) fclose(input_file); /* clean up */ HPDF_Free (pdf); return 0; }
int fileWriter(HPDF_Doc pdf, HPDF_Outline root, HPDF_Font font, const std::string curFile, const std::vector< std::string> vec) { auto func_footbar = [](std::string fileName)->std::string { std::ostringstream buffer; buffer << " File:" << fileName.c_str() << " Autor:XCL "; return buffer.str(); }; auto func_pageOutline = [&](HPDF_Page page, std::string curFile) { HPDF_Outline outline; HPDF_Destination dst; outline = HPDF_CreateOutline(pdf, root, curFile.c_str(), NULL); dst = HPDF_Page_CreateDestination(page); HPDF_Destination_SetXYZ(dst, 0, HPDF_Page_GetHeight(page), 1);// 1 = 默认百分比100 HPDF_Outline_SetDestination(outline, dst); }; auto func_drawRow = [](HPDF_Page page,std::string rid,std::string row,int y ) { HPDF_Page_BeginText(page); HPDF_Page_MoveTextPos(page, config::ROWID_WIDTH, y - 2); HPDF_Page_ShowText(page, rid.c_str()); HPDF_Page_ShowText(page, row.c_str()); HPDF_Page_EndText(page); }; HPDF_Page page = nullptr; HPDF_REAL width,height; HPDF_UINT y = 0; // x =0, int currID = 0, pageID = 0, currRowCount; std::string ss, rid; for (int i = 0; i < vec.size(); i++) { if (i == 0 || currRowCount > config::PAGE_ROWNUM) { ////////////////////////////////////////////// page = HPDF_AddPage(pdf); width = HPDF_Page_GetWidth(page); height = HPDF_Page_GetHeight(page); // x = 0; y = height - config::ROW_HEIGHT; func_pageOutline(page, curFile); HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT); { HPDF_RGBColor c = HPDF_Page_GetRGBFill(page); HPDF_Page_SetRGBStroke(page, 0.0, 0.5, 0); HPDF_Page_SetFontAndSize(page, font, config::FOOTBAR_FONT_SIZE); HPDF_Page_SetLineWidth(page, 0.5); HPDF_Page_MoveTo(page, 0, 13); HPDF_Page_LineTo(page, width, 16); HPDF_Page_Stroke(page); HPDF_Page_SetRGBFill(page, 0.0, 0, 0.5); HPDF_Page_BeginText(page); HPDF_Page_MoveTextPos(page, 40, config::FOOTBAR_FONT_SIZE - 5); HPDF_Page_ShowText(page, func_footbar(curFile).c_str()); HPDF_Page_EndText(page); HPDF_Page_SetRGBFill(page, c.r, c.g, c.b); }; y = height - config::ROW_HEIGHT * 2; HPDF_Page_SetFontAndSize(page, font, config::PAGE_FONT_SIZE); pageID++; currRowCount = 1; ////////////////////////////////////////////// } /////////////////////////////////////////// ss = vec[i]; HPDF_REAL wrid = HPDF_Page_TextWidth(page, rid.c_str()); NEWROW: HPDF_REAL wss = HPDF_Page_TextWidth(page, ss.c_str()); rid = util::rowidWidth(currRowCount ); if (wrid + wss > width) { //简单处理:超过页宽,直接分成两行.足以应付大部份情况. int center = ss.length() / 2; func_drawRow(page, rid,ss.substr(0, center),y); y -= config::ROW_HEIGHT; currRowCount++; ss = ss.substr(center); goto NEWROW; } else { func_drawRow(page, rid, ss,y); y -= config::ROW_HEIGHT; currRowCount++; } ////////////////////////////////////////// } return 0; } //end func
void init(ReportGlobals &glob) { HPDF_Page_SetRGBFill(glob.pages.back(), r_, g_, b_); }
void WPdfImage::drawText(const WRectF& rect, WFlags<AlignmentFlag> flags, TextFlag textFlag, const WString& text, const WPointF *clipPoint) { // FIXME: textFlag if (clipPoint && painter() && !painter()->clipPath().isEmpty()) { if (!painter()->clipPathTransform().map(painter()->clipPath()) .isPointInPath(painter()->worldTransform().map(*clipPoint))) return; } if (trueTypeFont_ && !trueTypeFonts_->busy()) trueTypeFonts_->drawText(painter()->font(), rect, flags, text); else { HPDF_REAL left, top, right, bottom; HPDF_TextAlignment alignment = HPDF_TALIGN_LEFT; AlignmentFlag horizontalAlign = flags & AlignHorizontalMask; AlignmentFlag verticalAlign = flags & AlignVerticalMask; switch (horizontalAlign) { default: // should never happen case AlignmentFlag::Left: left = rect.left(); right = left + 10000; alignment = HPDF_TALIGN_LEFT; break; case AlignmentFlag::Right: right = rect.right(); left = right - 10000; alignment = HPDF_TALIGN_RIGHT; break; case AlignmentFlag::Center: { float center = rect.center().x(); left = center - 5000; right = center + 5000; alignment = HPDF_TALIGN_CENTER; break; } } switch (verticalAlign) { default: // fall-through ; should never happen case AlignmentFlag::Top: top = rect.top(); break; case AlignmentFlag::Middle: // FIXME: use font metrics to center middle of ascent ! top = rect.center().y() - 0.60 * fontSize_; break; case AlignmentFlag::Bottom: top = rect.bottom() - fontSize_; break; } bottom = top + fontSize_; if (trueTypeFonts_->busy()) setChanged(PainterChangeFlag::Font); HPDF_Page_GSave(page_); // Undo the global inversion HPDF_Page_Concat(page_, 1, 0, 0, -1, 0, bottom); HPDF_Page_BeginText(page_); // Need to fill text using pen color const WColor& penColor = painter()->pen().color(); HPDF_Page_SetRGBFill(page_, penColor.red() / 255., penColor.green() / 255., penColor.blue() / 255.); std::string s = trueTypeFont_ ? text.toUTF8() : text.narrow(); HPDF_Page_TextRect(page_, left, fontSize_, right, 0, s.c_str(), alignment, nullptr); HPDF_Page_EndText(page_); HPDF_Page_GRestore(page_); } }
void WPdfImage::setChanged(WFlags<PainterChangeFlag> flags) { if (!flags.empty()) { HPDF_Page_GRestore(page_); HPDF_Page_GSave(page_); HPDF_ExtGState gstate; gstate = HPDF_CreateExtGState (pdf_); currentFont_ = WFont(); if (painter()->hasClipping()) { const WTransform& t = painter()->clipPathTransform(); if (!painter()->clipPath().isEmpty()) { applyTransform(t); drawPlainPath(painter()->clipPath()); HPDF_Page_Clip(page_); HPDF_Page_EndPath(page_); applyTransform(t.inverted()); } } applyTransform(painter()->combinedTransform()); const WPen& pen = painter()->pen(); if (pen.style() != PenStyle::None) { const WColor& color = pen.color(); HPDF_Page_SetRGBStroke(page_, color.red() / 255., color.green() / 255., color.blue() / 255.); HPDF_ExtGState_SetAlphaStroke (gstate, color.alpha()/255.); WLength w = painter()->normalizedPenWidth(pen.width(), false); HPDF_Page_SetLineWidth(page_, w.toPixels()); switch (pen.capStyle()) { case PenCapStyle::Flat: HPDF_Page_SetLineCap(page_, HPDF_BUTT_END); break; case PenCapStyle::Square: HPDF_Page_SetLineCap(page_, HPDF_PROJECTING_SCUARE_END); // scuary ! break; case PenCapStyle::Round: HPDF_Page_SetLineCap(page_, HPDF_ROUND_END); break; } switch (pen.joinStyle()) { case PenJoinStyle::Miter: HPDF_Page_SetLineJoin(page_, HPDF_MITER_JOIN); break; case PenJoinStyle::Bevel: HPDF_Page_SetLineJoin(page_, HPDF_BEVEL_JOIN); break; case PenJoinStyle::Round: HPDF_Page_SetLineJoin(page_, HPDF_ROUND_JOIN); break; } switch (pen.style()) { case PenStyle::None: break; case PenStyle::SolidLine: HPDF_Page_SetDash(page_, nullptr, 0, 0); break; case PenStyle::DashLine: { const HPDF_UINT16 dash_ptn[] = { 4, 2 }; HPDF_Page_SetDash(page_, dash_ptn, 2, 0); break; } case PenStyle::DotLine: { const HPDF_UINT16 dash_ptn[] = { 1, 2 }; HPDF_Page_SetDash(page_, dash_ptn, 2, 0); break; } case PenStyle::DashDotLine: { const HPDF_UINT16 dash_ptn[] = { 4, 2, 1, 2 }; HPDF_Page_SetDash(page_, dash_ptn, 4, 0); break; } case PenStyle::DashDotDotLine: { const HPDF_UINT16 dash_ptn[] = { 4, 2, 1, 2, 1, 2 }; HPDF_Page_SetDash(page_, dash_ptn, 6, 0); break; } } } const WBrush& brush = painter()->brush(); if (brush.style() != BrushStyle::None) { const WColor& color = painter()->brush().color(); HPDF_Page_SetRGBFill(page_, color.red() / 255., color.green() / 255., color.blue() / 255.); HPDF_ExtGState_SetAlphaFill (gstate, color.alpha()/255.); } HPDF_Page_SetExtGState (page_, gstate); const WFont& font = painter()->font(); if (font == currentFont_ && !trueTypeFonts_->busy()) return; /* * First, try a true type font. */ std::string ttfFont; if (trueTypeFonts_->busy()) { /* * We have a resolved true type font. */ ttfFont = trueTypeFonts_->drawingFontPath(); } else { FontSupport::FontMatch match = trueTypeFonts_->matchFont(font); if (match.matched()) ttfFont = match.fileName(); } LOG_DEBUG("font: " << ttfFont); if (font == currentFont_ && !ttfFont.empty() && currentTtfFont_ == ttfFont) return; currentFont_ = font; const char *font_name = nullptr; font_ = nullptr; if (!ttfFont.empty()) { bool fontOk = false; std::map<std::string, const char *>::const_iterator i = ttfFonts_.find(ttfFont); if (i != ttfFonts_.end()) { font_name = i->second; fontOk = true; } else if (ttfFont.length() > 4) { std::string suffix = Utils::lowerCase(ttfFont.substr(ttfFont.length() - 4)); if (suffix == ".ttf") { font_name = HPDF_LoadTTFontFromFile (pdf_, ttfFont.c_str(), HPDF_TRUE); } else if (suffix == ".ttc") { /* Oops, pango didn't tell us which font to load ... */ font_name = HPDF_LoadTTFontFromFile2(pdf_, ttfFont.c_str(), 0, HPDF_TRUE); } if (!font_name) HPDF_ResetError (pdf_); else { ttfFonts_[ttfFont] = font_name; fontOk = true; } } if (!fontOk) LOG_ERROR("cannot read font: '" << ttfFont << "': " "expecting a true type font (.ttf, .ttc)"); } if (!font_ && font_name) { font_ = HPDF_GetFont (pdf_, font_name, "UTF-8"); if (!font_) HPDF_ResetError (pdf_); else { trueTypeFont_ = true; currentTtfFont_ = ttfFont; } } if (!font_) { trueTypeFont_ = false; currentTtfFont_.clear(); std::string name = Pdf::toBase14Font(font); font_ = HPDF_GetFont(pdf_, name.c_str(), nullptr); } fontSize_ = font.sizeLength(12).toPixels(); HPDF_Page_SetFontAndSize (page_, font_, fontSize_); } }
void WPdfImage::drawText(const WRectF& rect, WFlags<AlignmentFlag> flags, TextFlag textFlag, const WString& text) { // FIXME: textFlag if (trueTypeFont_ && !trueTypeFonts_->busy()) trueTypeFonts_->drawText(painter()->font(), rect, flags, text); else { HPDF_REAL left, top, right, bottom; HPDF_TextAlignment alignment; AlignmentFlag horizontalAlign = flags & AlignHorizontalMask; AlignmentFlag verticalAlign = flags & AlignVerticalMask; switch (horizontalAlign) { case AlignLeft: left = rect.left(); right = left + 1000; alignment = HPDF_TALIGN_LEFT; break; case AlignRight: right = rect.right(); left = right - 1000; alignment = HPDF_TALIGN_RIGHT; break; case AlignCenter: { float center = rect.center().x(); left = center - 500; right = center + 500; alignment = HPDF_TALIGN_CENTER; break; } default: break; } switch (verticalAlign) { case AlignTop: top = rect.top(); break; case AlignMiddle: // FIXME: use font metrics to center middle of ascent ! top = rect.center().y() - 0.60 * fontSize_; break; case AlignBottom: top = rect.bottom() - fontSize_; break; default: break; } bottom = top + fontSize_; if (trueTypeFonts_->busy()) setChanged(Font); HPDF_Page_GSave(page_); // Undo the global inversion HPDF_Page_Concat(page_, 1, 0, 0, -1, 0, bottom); HPDF_Page_BeginText(page_); // Need to fill text using pen color const WColor& penColor = painter()->pen().color(); HPDF_Page_SetRGBFill(page_, penColor.red() / 255., penColor.green() / 255., penColor.blue() / 255.); std::string s = trueTypeFont_ ? text.toUTF8() : text.narrow(); HPDF_Page_TextRect(page_, left, fontSize_, right, 0, s.c_str(), alignment, 0); HPDF_Page_EndText(page_); HPDF_Page_GRestore(page_); } }
int main (int argc, char **argv) { const char *page_title = "Text Demo"; HPDF_Doc pdf; HPDF_Font font; HPDF_Page page; char fname[256]; const char* samp_text = "abcdefgABCDEFG123!#$%&+-@?"; const char* samp_text2 = "The quick brown fox jumps over the lazy dog."; float tw; float fsize; int i; int len; float angle1; float angle2; float rad1; float rad2; float ypos; strcpy (fname, argv[0]); strcat (fname, ".pdf"); pdf = HPDF_New (error_handler, NULL); if (!pdf) { printf ("error: cannot create PdfDoc object\n"); return 1; } if (setjmp(env)) { HPDF_Free (pdf); return 1; } /* set compression mode */ HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL); /* create default-font */ font = HPDF_GetFont (pdf, "Helvetica", NULL); /* add a new page object. */ page = HPDF_AddPage (pdf); /* draw grid to the page */ print_grid (pdf, page); /* print the lines of the page. HPDF_Page_SetLineWidth (page, 1); HPDF_Page_Rectangle (page, 50, 50, HPDF_Page_GetWidth(page) - 100, HPDF_Page_GetHeight (page) - 110); HPDF_Page_Stroke (page); */ /* print the title of the page (with positioning center). */ HPDF_Page_SetFontAndSize (page, font, 24); tw = HPDF_Page_TextWidth (page, page_title); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, (HPDF_Page_GetWidth(page) - tw) / 2, HPDF_Page_GetHeight (page) - 50, page_title); HPDF_Page_EndText (page); HPDF_Page_BeginText (page); HPDF_Page_MoveTextPos (page, 60, HPDF_Page_GetHeight(page) - 60); /* * font size */ fsize = 8; while (fsize < 60) { char buf[50]; int len; /* set style and size of font. */ HPDF_Page_SetFontAndSize(page, font, fsize); /* set the position of the text. */ HPDF_Page_MoveTextPos (page, 0, -5 - fsize); /* measure the number of characters which included in the page. */ strcpy(buf, samp_text); len = HPDF_Page_MeasureText (page, samp_text, HPDF_Page_GetWidth(page) - 120, HPDF_FALSE, NULL); /* truncate the text. */ buf[len] = 0x00; HPDF_Page_ShowText (page, buf); /* print the description. */ HPDF_Page_MoveTextPos (page, 0, -10); HPDF_Page_SetFontAndSize(page, font, 8); #ifdef __WIN32__ _snprintf(buf, 50, "Fontsize=%.0f", fsize); #else snprintf(buf, 50, "Fontsize=%.0f", fsize); #endif HPDF_Page_ShowText (page, buf); fsize *= 1.5; } /* * font color */ HPDF_Page_SetFontAndSize(page, font, 8); HPDF_Page_MoveTextPos (page, 0, -30); HPDF_Page_ShowText (page, "Font color"); HPDF_Page_SetFontAndSize (page, font, 18); HPDF_Page_MoveTextPos (page, 0, -20); len = strlen (samp_text); for (i = 0; i < len; i++) { char buf[2]; float r = (float)i / (float)len; float g = 1 - ((float)i / (float)len); buf[0] = samp_text[i]; buf[1] = 0x00; HPDF_Page_SetRGBFill (page, r, g, 0.0); HPDF_Page_ShowText (page, buf); } HPDF_Page_MoveTextPos (page, 0, -25); for (i = 0; i < len; i++) { char buf[2]; float r = (float)i / (float)len; float b = 1 - ((float)i / (float)len); buf[0] = samp_text[i]; buf[1] = 0x00; HPDF_Page_SetRGBFill (page, r, 0.0, b); HPDF_Page_ShowText (page, buf); } HPDF_Page_MoveTextPos (page, 0, -25); for (i = 0; i < len; i++) { char buf[2]; float b = (float)i / (float)len; float g = 1 - ((float)i / (float)len); buf[0] = samp_text[i]; buf[1] = 0x00; HPDF_Page_SetRGBFill (page, 0.0, g, b); HPDF_Page_ShowText (page, buf); } HPDF_Page_EndText (page); ypos = 450; /* * Font rendering mode */ HPDF_Page_SetFontAndSize(page, font, 32); HPDF_Page_SetRGBFill (page, 0.5, 0.5, 0.0); HPDF_Page_SetLineWidth (page, 1.5); /* PDF_FILL */ show_description (page, 60, ypos, "RenderingMode=PDF_FILL"); HPDF_Page_SetTextRenderingMode (page, HPDF_FILL); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, ypos, "ABCabc123"); HPDF_Page_EndText (page); /* PDF_STROKE */ show_description (page, 60, ypos - 50, "RenderingMode=PDF_STROKE"); HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, ypos - 50, "ABCabc123"); HPDF_Page_EndText (page); /* PDF_FILL_THEN_STROKE */ show_description (page, 60, ypos - 100, "RenderingMode=PDF_FILL_THEN_STROKE"); HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_THEN_STROKE); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, ypos - 100, "ABCabc123"); HPDF_Page_EndText (page); /* PDF_FILL_CLIPPING */ show_description (page, 60, ypos - 150, "RenderingMode=PDF_FILL_CLIPPING"); HPDF_Page_GSave (page); HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_CLIPPING); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, ypos - 150, "ABCabc123"); HPDF_Page_EndText (page); show_stripe_pattern (page, 60, ypos - 150); HPDF_Page_GRestore (page); /* PDF_STROKE_CLIPPING */ show_description (page, 60, ypos - 200, "RenderingMode=PDF_STROKE_CLIPPING"); HPDF_Page_GSave (page); HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE_CLIPPING); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, ypos - 200, "ABCabc123"); HPDF_Page_EndText (page); show_stripe_pattern (page, 60, ypos - 200); HPDF_Page_GRestore (page); /* PDF_FILL_STROKE_CLIPPING */ show_description (page, 60, ypos - 250, "RenderingMode=PDF_FILL_STROKE_CLIPPING"); HPDF_Page_GSave (page); HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_STROKE_CLIPPING); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, ypos - 250, "ABCabc123"); HPDF_Page_EndText (page); show_stripe_pattern (page, 60, ypos - 250); HPDF_Page_GRestore (page); /* Reset text attributes */ HPDF_Page_SetTextRenderingMode (page, HPDF_FILL); HPDF_Page_SetRGBFill (page, 0, 0, 0); HPDF_Page_SetFontAndSize(page, font, 30); /* * Rotating text */ angle1 = 30; /* A rotation of 30 degrees. */ rad1 = angle1 / 180 * 3.141592; /* Calcurate the radian value. */ show_description (page, 320, ypos - 60, "Rotating text"); HPDF_Page_BeginText (page); HPDF_Page_SetTextMatrix (page, cos(rad1), sin(rad1), -sin(rad1), cos(rad1), 330, ypos - 60); HPDF_Page_ShowText (page, "ABCabc123"); HPDF_Page_EndText (page); /* * Skewing text. */ show_description (page, 320, ypos - 120, "Skewing text"); HPDF_Page_BeginText (page); angle1 = 10; angle2 = 20; rad1 = angle1 / 180 * 3.141592; rad2 = angle2 / 180 * 3.141592; HPDF_Page_SetTextMatrix (page, 1, tan(rad1), tan(rad2), 1, 320, ypos - 120); HPDF_Page_ShowText (page, "ABCabc123"); HPDF_Page_EndText (page); /* * scaling text (X direction) */ show_description (page, 320, ypos - 175, "Scaling text (X direction)"); HPDF_Page_BeginText (page); HPDF_Page_SetTextMatrix (page, 1.5, 0, 0, 1, 320, ypos - 175); HPDF_Page_ShowText (page, "ABCabc12"); HPDF_Page_EndText (page); /* * scaling text (Y direction) */ show_description (page, 320, ypos - 250, "Scaling text (Y direction)"); HPDF_Page_BeginText (page); HPDF_Page_SetTextMatrix (page, 1, 0, 0, 2, 320, ypos - 250); HPDF_Page_ShowText (page, "ABCabc123"); HPDF_Page_EndText (page); /* * char spacing, word spacing */ show_description (page, 60, 140, "char-spacing 0"); show_description (page, 60, 100, "char-spacing 1.5"); show_description (page, 60, 60, "char-spacing 1.5, word-spacing 2.5"); HPDF_Page_SetFontAndSize (page, font, 20); HPDF_Page_SetRGBFill (page, 0.1, 0.3, 0.1); /* char-spacing 0 */ HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, 140, samp_text2); HPDF_Page_EndText (page); /* char-spacing 1.5 */ HPDF_Page_SetCharSpace (page, 1.5); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, 100, samp_text2); HPDF_Page_EndText (page); /* char-spacing 1.5, word-spacing 3.5 */ HPDF_Page_SetWordSpace (page, 2.5); HPDF_Page_BeginText (page); HPDF_Page_TextOut (page, 60, 60, samp_text2); HPDF_Page_EndText (page); /* save the document to a file */ HPDF_SaveToFile (pdf, fname); /* clean up */ HPDF_Free (pdf); return 0; }