pdf(Portable Document Format的简称,意为“便携式文档格式”),是由Adobe Systems用于与应用程序、操作系统、硬件无关的方式进行文件交换所发展出的文件格式。
iText 是java和C#中的一个处理PDF的开源类库,国外的大牛已经把它移植到Android上了,但是直接拿来用还是需要花费一点功夫,下面就用一个简单的demo来测试一下。
本文主要介绍在Android开发中如何利用iText生成PDF。
iText项目地址:
首先用过svn把代码check下来。
得到三个文件夹,droidText是一个android的库工程,droidTextTest是测试工程。
在eclipse中导入droidText项目。这是个library project,后面创建的项目需要引用到。
然后创建一个Android工程-iTextTest
在工程中引用droidText:
Project->properties->Android->LIbrary:ADD
链接好之后就像上图。
主界面就一个Button,按下之后就开始生产PDF。
package com.example.itexttest;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.Method;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class ITextActivity extends Activity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_itext);
mButton = (Button)findViewById(R.id.button1);
mButton.setOnClickListener(new OnClickListenerImpl());
}
private class OnClickListenerImpl implements View.OnClickListener
{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "Run", Toast.LENGTH_SHORT).show();
// Create droidtext directory for storing results
File file = new File(
android.os.Environment.getExternalStorageDirectory()
+ File.separator + "iTextTest");
if (!file.exists()) {
file.mkdir();
}
System.out.println("Click!");
Thread t = new Thread() {
public void run() {
int success = 0;
int count = 1;
String className = "com.example.itexttest.HelloWprld";
String result = null;
try {
// Set output streams to bytearray streams so we can
// display the output of examples
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream errorStream = new PrintStream(bos, true);
System.setErr(errorStream);
ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
PrintStream outStream = new PrintStream(bos2, true);
System.setOut(outStream);
// Find the main method
Class c = Class.forName(className);
Method main = c.getDeclaredMethod("main",String[].class);
System.out.println("GetMain"+main.getName());
// Emulate CLI parameters if necessary
String[] params = null;
if (className
.equals("com.lowagie.examples.objects.tables.pdfptable.FragmentTable")) {
params = new String[] { "3" };
} else if (className
.equals("com.lowagie.examples.objects.images.tiff.OddEven")) {
params = new String[] { "odd.tif", "even.tif",
"odd_even.tiff" };
} else if (className
.equals("com.lowagie.examples.objects.images.tiff.Tiff2Pdf")) {
params = new String[] { "tif_12.tif" };
} else if (className
.equals("com.lowagie.examples.objects.images.DvdCover")) {
params = new String[] { "dvdcover.pdf", "Title",
"0xff0000", "hitchcock.png" };
} else if (className
.equals("com.lowagie.examples.forms.ListFields")) {
params = new String[] {};
} else if (className
.equals("com.lowagie.examples.general.read.Info")) {
params = new String[] { "RomeoJuliet.pdf" };
} else if (className
.equals("com.lowagie.examples.objects.anchors.OpenApplication")) {
params = new String[] { "" };
}
main.invoke(null, (Object) params);
// Parse results
String string = new String(bos.toByteArray());
String string2 = new String(bos2.toByteArray());
if (string.length() > 0) {
result = "Failed: " + string;
} else if (string2.contains("Exception")) {
result = "Failed: " + string2;
} else if ("Images.pdf" != null) {
File pdf = new File(
Environment.getExternalStorageDirectory()
+ File.separator + "iTextTest"
+ File.separator
+ "Images.pdf");
System.out.println("Create Pdf@");
if (!pdf.exists()) {
result = "Failed: Resulting pdf didn't get created";
} else if (pdf.length() <= 0) {
result = "Failed: Resulting pdf is empty";
} else {
success++;
result = "Successful";
}
} else {
success++;
result = "Successful";
}
} catch (Exception e) {
result = "Failed with exception: "
+ e.getClass().getName() + ": "
+ e.getMessage();
System.out.println(result);
}
if (result.startsWith("Failed")) {
System.out.println("Failed!");
} else {
System.out.println("Success!");
}
System.out.println(result);
}
};
t.start();
}
}
}
OnClick里面的代码有点小复杂,要用的的话直接粘就可以了,注意修改相应的变量名,classname对应对就是操作itext生产pdf的类。
在包里面再创建两个测试类:
HelloWorld.java
package com.example.itexttest;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
/**
* Generates a simple 'Hello World' PDF file.
*
* @author blowagie
*/
public class HelloWorld {
/**
* Generates a PDF file with the text 'Hello World'
*
* @param args
* no arguments needed here
*/
public static void main(String[] args) {
System.out.println("Hello World");
// step 1: creation of a document-object
Document document = new Document();
try {
// step 2:
// we create a writer that listens to the document
// and directs a PDF-stream to a file
PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator + "iTextTest" + java.io.File.separator + "HelloWorld.pdf"));
// step 3: we open the document
document.open();
// step 4: we add a paragraph to the document
document.add(new Paragraph("Hello World"));
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
// step 5: we close the document
document.close();
}
}
生产Pdf如下:
Rotating.java(创建图片,并旋转)
注意再sdcard的根目录里面放一张图片,改名jxk_run.png。
/*
* $Id: Rotating.java 3373 2008-05-12 16:21:24Z xlv $
*
* This code is part of the 'iText Tutorial'.
* You can find the complete tutorial at the following address:
* http://itextdocs.lowagie.com/tutorial/
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* itext-questions@lists.sourceforge.NET
*/
package com.example.itexttest;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.example.itexttest.R;
import com.example.itexttest.ITextActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
/**
* Rotating images.
*/
public class Rotating {
/**
* Rotating images.
*
* @param args
* No arguments needed
*/
public static void main(String[] args) {
System.out.println("Rotating an Image");
// step 1: creation of a document-object
Document document = new Document();
try {
// step 2:
// we create a writer that listens to the document
// and directs a PDF-stream to a file
PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator + "iTextTest" + java.io.File.separator + "rotating.pdf"));
// step 3: we open the document
document.open();
// step 4: we add content
//Can't use filename => use byte[] instead
// Image jpg4 = Image.getInstance("otsoe.jpg");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
//Bitmap bitmap = BitmapFactory.decodeResource(ITextActivity.getActivity().getResources(), R.drawable.otsoe);
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/jxk_run.png");
bitmap.compress(Bitmap.CompressFormat.JPEG /* FileType */,100 /* Ratio */, stream);
Image jpg = Image.getInstance(stream.toByteArray());
jpg.setAlignment(Image.MIDDLE);
jpg.setRotation((float) Math.PI / 6);
document.add(new Paragraph("rotate 30 degrees"));
document.add(jpg);
document.newPage();
jpg.setRotation((float) Math.PI / 4);
document.add(new Paragraph("rotate 45 degrees"));
document.add(jpg);
document.newPage();
jpg.setRotation((float) Math.PI / 2);
document.add(new Paragraph("rotate pi/2 radians"));
document.add(jpg);
document.newPage();
jpg.setRotation((float) (Math.PI * 0.75));
document.add(new Paragraph("rotate 135 degrees"));
document.add(jpg);
document.newPage();
jpg.setRotation((float) Math.PI);
document.add(new Paragraph("rotate pi radians"));
document.add(jpg);
document.newPage();
jpg.setRotation((float) (2.0 * Math.PI));
document.add(new Paragraph("rotate 2 x pi radians"));
document.add(jpg);
} catch (DocumentException de) {
System.err.println(de.getMessage());
} catch (IOException ioe) {
System.err.println(ioe.getMessage());
}
// step 5: we close the document
document.close();
}
}
生产PDF如下:
在Android开发中利用iText生成PDF整个过程步骤简单,但主要是代码解释,因此,有兴趣操作的同学要仔细看清代码,理解代码。
¥90.00
¥179.00
¥10.00