Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android圖形庫Skia(四)-生成PDF

Android圖形庫Skia(四)-生成PDF

編輯:關於Android編程

Android圖形庫Skia(四)-生成PDF


本文主要記錄使用skia庫生成pdf文件的過程,其實skia並不僅僅能在Android系統中使用,在一般的嵌入式Linux系統上也可以使用的。標題就以以前的寫法寫了。本文基於Android圖形庫Skia(一)-基本測試生成PNG圖片和Android圖形庫Skia(三)-結合Freetype顯示文字。直接給出例子:

/* Simple PDF demo utilizing Skia toolkit.

* Authored by kangear

*/

#include "SkBitmap.h"

#include "SkDevice.h"

#include "SkPaint.h"

#include "SkRect.h"

#include "SkImageEncoder.h"

#include "SkPDFCatalog.h"

#include "SkPDFDevice.h"

#include "SkPDFStream.h"

#include "SkPDFTypes.h"

#include "SkPDFDocument.h"

#include

#include

#include "SkTypeface.h"

//draw_content()

int main()

{

// Declare a raster bitmap, which has an integer width and height,

// and a format (config), and a pointer to the actual pixels.

// Bitmaps can be drawn into a SkCanvas, but they are also used to

// specify the target of a SkCanvas' drawing operations.

SkBitmap bitmap;

bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200);

bitmap.allocPixels();

// PDF

SkPDFDevice* dev = new SkPDFDevice(827, 1169);

SkAutoUnref aur(dev);

// A Canvas encapsulates all of the state about drawing into a

// device (bitmap). This includes a reference to the device itself,

// and a stack of matrix/clip values. For any given draw call (e.g.

// drawRect), the geometry of the object being drawn is transformed

// by the concatenation of all the matrices in the stack. The

// transformed geometry is clipped by the intersection of all of the

// clips in the stack.

SkCanvas canvas(dev);

// SkPaint class holds the style and color information about how to

// draw geometries, text and bitmaps.

SkPaint paint;

// SkIRect holds four 32 bit integer coordinates for a rectangle.

SkRect r;

paint.setARGB(255, 255, 0, 0);

r.set(25, 25, 145, 145);

canvas.drawRect(r, paint); /** Draw the specified rectangle using

the specified paint. The rectangle

will be filled or stroked based on

the Style in the paint. */

paint.setARGB(255, 0, 255, 0);

r.offset(20, 20);

canvas.drawRect(r, paint);

paint.setARGB(255, 0, 0, 255);

r.offset(20, 20);

canvas.drawRect(r, paint);

const char gText[] = "123平34凡之路12!";

//SkTypeface *font = SkTypeface::CreateFromFile("DroidSansFallbackFull.ttf");

//usr/share/fonts/truetype/msttcorefonts/DroidSansFallbackFull.ttf

SkTypeface *font = SkTypeface::CreateFromName("Droid Sans Fallback", SkTypeface::kNormal);

if ( font )

{

paint.setARGB(255, 255, 0, 0);

paint.setTypeface( font );

paint.setTextSize(25);

canvas.drawText(gText, sizeof(gText)/sizeof(gText[0]), 0, 25, paint);

}

else

{

printf("font ==null !\n");

}

// SkImageEncoder is the base class for encoding compressed images

// from a specific SkBitmap.

SkImageEncoder::EncodeFile("snapshot.png", bitmap,

SkImageEncoder::kPNG_Type,

/* Quality ranges from 0..100 */ 100);

// save as a pdf file

SkPDFDocument doc;

doc.appendPage(dev);

SkDynamicMemoryWStream pdf_stream;

doc.emitPDF(&pdf_stream);

write(STDOUT_FILENO, pdf_stream.getStream(), pdf_stream.getOffset());

return 0;

}

/*

build:

g++ \

-I./include \

-I./include/core \

-I./include/images \

-I./include/config \

-I./include/pdf/ \

-Wall -o test-skia ./test-skia.cpp \

out/src/images/SkImageDecoder_libpng.o \

out/libskia.a \

`pkg-config freetype2 --libs --cflags` \

`pkg-config libpng --libs --cflags` \

-lpthread -g

run:

./test-skia > test.pdf

*/

效果:

\ <喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICDXotLiysLP7qO6yfqzyVBERsqxo6zI57n7yrnTw1NrVHlwZWZhY2U6OkNyZWF0ZUZyb21GaWxlt723qLS0vajX1szlZmFjZaOsyvTT2sTa1sPX1szlo6y74dTss8nU2sbky/y7t76zz8JQREbW0NfWzOXO3reo1f2zo8/Uyr6ho8q508NBZG9iZSByZWFkZXK74czhyr6jujwvcD4KPHA+IDxpbWcgc3JjPQ=="/uploadfile/Collfiles/20141023/2014102309023683.png" alt="">

文字版本:

Cannot extract the embedded font ‘DroidSansFallback’. Some characters may not display or print correctly.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved