編輯:關於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();
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.
廢話不多說了,直接給大家貼代碼了。package com.example.testactivityresquest; import android.app.Activit
今天是Android學習第四天,上午簡單的學習了數據的存儲與使用,在這裡把上午的總結一下 數據存儲分為四大類: * 文件 * Sharedpreference(參數) *
最近幾天真的是各種意義上的忙,忙著考試,還要忙著課程設計,手上又有外包的項目,另一邊學校的項目還要搞,自己的東西還在文檔階段,真的是讓人想死啊!!近半個月來,C#這方面的
魅族MX6已發布了,除了漂亮的外觀,MX6還帶來了一項重磅功能:微信指紋支付(此前已經支持支付寶)。那魅族微信指紋支付是怎麼支付的呢?下文就讓小編跟大家魅族