Android图形库Skia()-生成PDF


本文主要记录使用skia库生成pdf文件的过程,其实skia并不仅仅能在Android系统中使用,在一般的嵌入式Linux系统上也可以使用的。标题就以以前的写法写了。本文基于Android图形库Skia()-基本测试生成PNG图片Android图形库Skia()-结合Freetype显示文字。直接给出例子:

/*SimplePDFdemoutilizingSkiatoolkit.

*Authoredbykangear<kangear@163.com>

*/

#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<stdio.h>

#include<unistd.h>

#include"SkTypeface.h"

//draw_content()

intmain()

{

//Declarearasterbitmap,whichhasanintegerwidthandheight,

//andaformat(config),andapointertotheactualpixels.

//BitmapscanbedrawnintoaSkCanvas,buttheyarealsousedto

//specifythetargetofaSkCanvas'drawingoperations.

SkBitmapbitmap;

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

bitmap.allocPixels();

//PDF

SkPDFDevice*dev=newSkPDFDevice(827,1169);

SkAutoUnrefaur(dev);

//ACanvasencapsulatesallofthestateaboutdrawingintoa

//device(bitmap).Thisincludesareferencetothedeviceitself,

//andastackofmatrix/clipvalues.Foranygivendrawcall(e.g.

//drawRect),thegeometryoftheobjectbeingdrawnistransformed

//bytheconcatenationofallthematricesinthestack.The

//transformedgeometryisclippedbytheintersectionofallofthe

//clipsinthestack.

SkCanvascanvas(dev);

//SkPaintclassholdsthestyleandcolorinformationabouthowto

//drawgeometries,textandbitmaps.

SkPaintpaint;

//SkIRectholdsfour32bitintegercoordinatesforarectangle.

SkRectr;

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

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

canvas.drawRect(r,paint);/**Drawthespecifiedrectangleusing

thespecifiedpaint.Therectangle

willbefilledorstrokedbasedon

theStyleinthepaint.*/

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);

constchargText[]="123平34凡之路12!";

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

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

SkTypeface*font=SkTypeface::CreateFromName("DroidSansFallback",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");

}

//SkImageEncoderisthebaseclassforencodingcompressedimages

//fromaspecificSkBitmap.

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

SkImageEncoder::kPNG_Type,

/*Qualityrangesfrom0..100*/100);

//saveasapdffile

SkPDFDocumentdoc;

doc.appendPage(dev);

SkDynamicMemoryWStreampdf_stream;

doc.emitPDF(&pdf_stream);

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

return0;

}

/*

build:

g++\

-I./include\

-I./include/core\

-I./include/images\

-I./include/config\

-I./include/pdf/\

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

out/src/images/SkImageDecoder_libpng.o\

out/libskia.a\

`pkg-configfreetype2--libs--cflags`\

`pkg-configlibpng--libs--cflags`\

-lpthread-g

run:

./test-skia>test.pdf

*/

效果:

Android图形库Skia(四)-生成PDF_第1张图片

注意事项:生成PDF时,如果使用SkTypeface::CreateFromFile方法创建字体face,属于内置字体,会造成在其它环境下PDF中字体无法正常显示。使用Adobereader会提示:

Android图形库Skia(四)-生成PDF_第2张图片

打印效果:

Android图形库Skia(四)-生成PDF_第3张图片

文字版本:

Cannotextracttheembeddedfont‘DroidSansFallback’.Somecharactersmaynotdisplayorprintcorrectly.

参考文档:

1.https://code.google.com/p/skia/wiki/PDFTheoryOfOperation

2.List_of_typefaces

3.PDFReference



更多相关文章

  1. 【Android Demo】让Android支持自定义的ttf字体
  2. 图片切换
  3. Android字体
  4. Android下载网络图片到本地
  5. android 图片叠加效果

随机推荐

  1. javascript 设计模式之观察者模式
  2. hbase编程:通过Java api操作hbase
  3. 初学Java:我为什么来学Java?
  4. 使用Java中的Scala:将函数作为参数传递
  5. 【JAVA】用java编写程序时总提示缺少方法
  6. 来谈谈JAVA面向对象 - 鲁班即将五杀,大乔
  7. MongoDB中的按组计算的字段
  8. Java XML - 具有相同名称的嵌套元素
  9. 算法竞赛入门经典(分数化小数)
  10. 如何在Hibernate中使用外键?