在Android中利用iText生成PDF
jopen
12年前
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如下: