java代码实现:
1、把文字和图片插入到已经存在的pdf文件中指定的坐标,支持中文
2、把存在的pdf文件java控制批量打印
考虑
1、纯java实现
2、允许调用非java的外部.dll,.exe

解决方案 »

  1.   

    定位可以用空格凑齐
    中文问题:
    我们把document.add(new Paragraph("HelloWorld"));改成document.add(new Paragraph("我们是害虫"));然后编译运行,得到一个PDF文件,但是打开却发现,没有任何字符。添加中文字符失败!PDF文件完全不认这里的中文字符。
        iText添加中文字符,需要设置相应的编码和字体。
        在程序开端添加import com.lowagie.text.pdf.BaseFont;引入所需要的类。
        然后将中文字符做成字符串:String chinese =”我们是害虫”;
        设置字体和编码:BaseFont bfChinese = BaseFont.createFont("STSong-Light", 
                                  "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                        Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
    加入document:
                         Paragraph chunk = new Paragraph(chinese, FontChinese);
                         document.add(chunk);
         此时要正确编译,还需要下载一个包,该包包含了中、日、韩文字的一些字体和编码。该包名为iTextAsian.jar,访问http://itext.sourceforge.net/downloads/iTextAsian.jar可以下载。
        下载后加入classpath,则程序可以正确编译运行了。
      

  2.   

    下面是从网上找到的一段代码:
    看下面的程序:import java.io.FileOutputStream;
    import java.io.IOException;
    import com.lowagie.text.*;
    import com.lowagie.text.pdf.PdfWriter;
    import com.lowagie.text.pdf.*;
    import com.lowagie.text.html.HtmlWriter;
    import java.awt.color.*;
    import java.awt.font.*;
    import java.sql.*;public class genpdf_multirow{
    public static void main(String[] args) {
    Document document = null;
    try {
    java.sql.Connection F_Connection=null;
    java.sql.Statement F_Statement=null;
    java.sql.ResultSet F_ResultSet=null;String DriveString="com.microsoft.jdbc.sqlserver.SQLServerDriver";
    java.lang.Class.forName(DriveString);
    String ConURL="jdbc:microsoft:sqlserver://192.168.0.1:1433;user=sa;password=root;DatabaseName=Northwind";
    F_Connection=DriverManager.getConnection(ConURL.trim(),"sa","root");
    F_Statement=F_Connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    F_ResultSet = F_Statement.executeQuery("select * from orders");
    /*打开已经定义好字段以后的pdf模板*/
    PdfReader reader = new PdfReader("iText多行报表.pdf");document = new Document(reader.getPageSizeWithRotation(1));
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("iText多行报表结果.pdf"));
    document.open();
    PdfContentByte cb = writer.getDirectContent();
    PdfImportedPage page1 = writer.getImportedPage(reader, 1);
    /*使用中文字体*/
    BaseFont bf = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
    Font FontChinese = new Font(bf, 12, Font.NORMAL);
    F_ResultSet.first();
    int PageTotalRows=5;
    int currentRow=1;
    int RowHeight=100;
    int Field1X,Field1Y,Field2X,Field3X,Field4X,Field5X;
    Field1X=80;
    Field2X=160;
    Field3X=230;
    Field4X=380;
    Field5X=480;
    Field1Y=580;
    cb.addTemplate(page1, 1f, 0, 0, 1f, 0, 0);
    while (currentRow<=PageTotalRows && F_ResultSet.next())
    {
    currentRow++;
    java.io.File fImg = new java.io.File("cover.png");
    Image img = Image.getInstance(fImg.toURL());
    /*295是从左下角开始的横向坐标,Field1Y-70是从左下角开始的纵向坐标*/
    img.setAbsolutePosition(295, Field1Y-70);
    /*把图片缩小50% 以适宜cell大小*/
    img.scalePercent(50);
    cb.addImage(img);cb.beginText();
    cb.setFontAndSize(bf, 12);
    //field1
    cb.setTextMatrix(Field1X, Field1Y); //这里就是用来定位的值
    cb.showText(F_ResultSet.getString("CustomerID"));
    //field2
    cb.setTextMatrix(Field2X, Field1Y); //这里就是用来定位的值
    cb.showText(F_ResultSet.getString("OrderDate").substring(0,10));//field3
    cb.setTextMatrix(Field3X, Field1Y); //这里就是用来定位的值
    cb.showText(F_ResultSet.getString("shipvia"));//field4
    cb.setTextMatrix(Field4X, Field1Y); //这里就是用来定位的值
    cb.showText(F_ResultSet.getString("ShipCountry"));Field1Y-=RowHeight;
    cb.endText();
    if (currentRow==6)
    {
    currentRow=1;
    Field1X=80;
    Field2X=160;
    Field3X=230;
    Field4X=380;
    Field5X=480;
    Field1Y=580;
    reader = new PdfReader("iText多行报表.pdf");
    page1 = writer.getImportedPage(reader, 1);
    document.newPage();
    cb.addTemplate(page1, 1f, 0, 0, 1f, 0, 0);
    }
    } //end of while
    document.close();
    F_ResultSet.close();
    F_Statement.close();
    F_Connection.close();
    }
    catch(DocumentException de) {
    System.err.println(de.getMessage());
    }
    catch(IOException ioe) {
    System.err.println(ioe.getMessage());
    }
    catch(Exception e)
    {
    System.err.println(e.getMessage());
    System.err.println(e.getStackTrace());
    }
    }
    }上面的程序是从Microsoft Sql Server中的Northwind数据库取出数据,打印在一个已经定义好表格的报表模板上,因为这个报表中的每一页都有很多行,如果定义字段将会是个很麻烦的过程 ,我又带大家回到了“原始社会”,直接通过坐标值在PDF上面打印信息,当然这样对齐坐标可能是个比较麻烦的过程,大家在实际应用中可以在定义大量字段或对齐坐标两种办法中进行选择。
      

  3.   

    谢谢 congliu , 合成问题解决,
    打印问题正在解决中
      

  4.   

    iText多行报表.pdf要怎么制作呢?