您的位置:首页 > 移动开发 > Android开发

在Android中利用iText生成PDF

2014-02-18 09:51 387 查看
iText 是java和C#中的一个处理PDF的开源类库,国外的大牛已经把它移植到Android上了,但是直接拿来用还是需要花费一点功夫,下面就用一个简单的demo来测试一下。

iText项目地址:https://code.google.com/p/droidtext/

首先用过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如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: