100分高手来拿,quik java代码实现:1、把文字和图片插入到已经存在的pdf文件中指定的坐标,支持中文2、把存在的pdf文件java控制批量打印考虑1、纯java实现2、允许调用非java的外部.dll,.exe 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定位可以用空格凑齐中文问题:我们把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,则程序可以正确编译运行了。 下面是从网上找到的一段代码:看下面的程序: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);//field1cb.setTextMatrix(Field1X, Field1Y); //这里就是用来定位的值cb.showText(F_ResultSet.getString("CustomerID"));//field2cb.setTextMatrix(Field2X, Field1Y); //这里就是用来定位的值cb.showText(F_ResultSet.getString("OrderDate").substring(0,10));//field3cb.setTextMatrix(Field3X, Field1Y); //这里就是用来定位的值cb.showText(F_ResultSet.getString("shipvia"));//field4cb.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 whiledocument.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上面打印信息,当然这样对齐坐标可能是个比较麻烦的过程,大家在实际应用中可以在定义大量字段或对齐坐标两种办法中进行选择。 谢谢 congliu , 合成问题解决,打印问题正在解决中 iText多行报表.pdf要怎么制作呢? 怎样使用ResultSet来读出所有行的数据 用java编写一个万年历 Graphics用法? java中如何检测到鼠标两个按钮都被按下的事件 读文件? applet在ie里表现不出来,怎么回事? 【急急急】TCP/IP中单播、广播、多播的疑问??? 各位,java怎么检测一个ip(网址)可以打开?有什么函数?谢谢! PASS SCJD,我要散分!!谁知道怎么把分数超过半100? 我用exe4j将java变exe,再用inno安装生成安装包,安装之后,打开程序却弹出这东西,是什么原因,求解决? 请问结果为什么有三次输出"car的构造函数被调用" 新手问题 验证用户输入
中文问题:
我们把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,则程序可以正确编译运行了。
看下面的程序: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上面打印信息,当然这样对齐坐标可能是个比较麻烦的过程,大家在实际应用中可以在定义大量字段或对齐坐标两种办法中进行选择。
打印问题正在解决中