作者无法解析 itext
writer cannot be resolved itext
大家好,我知道这可能是我面临的一个简单问题,但我现在已经坚持了一段时间。我是使用 itext 的新手。基本上我正在做一个小项目,我试图使用现有的 pdf 来填充数据库中的数据。但在我这样做之前,我只是想确保我是否可以使用 itext 将数据从数据库复制到已经存在的 pdf 中。但是我遇到了这个问题 "cannot convert from void to pdf writer" 我试着查看 itext 邮件列表并尝试获取一些示例代码但没有任何帮助,所以我在这里寻求帮助。请帮助我解决我的问题,并大致了解如何从数据库中获取数据并填写表格。
例如表单有一个留空的姓氏,所以我需要从数据库中提取姓氏并将其放在 pdf 中的姓氏位置。以下是我的代码。
/**
*
*/
package itext.sample;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//import com.itextpdf.text.BaseColor;
//import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
//import com.itextpdf.text.Font;
//import com.itextpdf.text.Font.FontFamily;
//import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
//import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.DocWriter;
/**
* @author prithvi
*
*/
public class FirstPdf {
private static final String Result = "D:/Eclipse Java/image.pdf";
public static String main(String[] args) throws SQLException,IOException,DocumentException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("Where is your MySQL JDBC Driver?");
e.printStackTrace();
return null;
}
System.out.println("MySQL JDBC Driver Registered!");
Connection connection = null;
try {
connection = DriverManager
.getConnection("jdbc:mysql://69.167.139.172/bluedb",
"color", "prithvi");
} catch (SQLException e) {
System.out.println("Connection Failed! Check output console");
e.printStackTrace();
return null;
}
if (connection != null) {
System.out.println("You made it, take control your database now!");
} else {
System.out.println("Failed to make connection!");
}
// creating pdf document
Document document = new Document();
try {
//writing to the outputfile
PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result)) .setInitialLeading(16);
document.open(); //opening the document to do the action
Statement stm = null;
stm = connection.createStatement();//creating database query
ResultSet rs = null;
rs = stm.executeQuery("SELECT * FROM Sec1");
PdfPTable table = new PdfPTable(2);
PdfReader reader =new PdfReader ("D:/Eclipse Java/HiltonForms2014_r.pdf");
AcroFields form = reader.getAcroFields();
form.setField("LASTNAME", rs.getCursorName());
int n = reader.getNumberOfPages();
PdfImportedPage page;
for( int i= 1; i <=n;i++)
{
page = writer.getImportedPage(reader,i);
table.addCell(Image.getInstance(page));
}
document.add(table);
document.close();
connection.close();
reader.close();
/*while (rs.next()){
document.add(new Chunk(rs.getString(Result)));
document.add(new Chunk(""));
Font font = new Font(FontFamily.TIMES_ROMAN, 10,Font.BOLD, BaseColor.WHITE);
Chunk id = null;
id = new Chunk(rs.getString("Sec1ID"), font);
id.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f , 1.5f);
id.setTextRise(6);
document.add(id);
document.add(Chunk.NEWLINE);
document.add(new Paragraph("hey there! you created a new pdf"));
stm.close();
connection.close();
document.close();
}*/
}
catch (DocumentException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
对不起,你的代码全错了。
填写表格时,需要使用PdfStamper
。例如参见:How to fill out a pdf file programatically?
在您的情况下,代码为:
PdfReader reader = new PdfReader("D:/Eclipse Java/HiltonForms2014_r.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(Result));
AcroFields form = stamper.getAcroFields();
form.setField("LASTNAME", rs.getCursorName());
stamper.setFormFlattening(true);
stamper.close();
reader.close();
这些是我在您的代码中检测到的一些问题:
问题 #1:
PdfReader reader =new PdfReader ("D:/Eclipse Java/HiltonForms2014_r.pdf");
AcroFields form = reader.getAcroFields();
form.setField("LASTNAME", rs.getCursorName());
您确实可以从 PdfReader
创建一个 AcroFields
实例,但在这种情况下,字段将是只读的,这意味着 setField()
方法不会执行任何操作.只有从 PdfStamper
获得的 AcroFields
实例才能用于设置字段。
问题 #2:
您想填写字段,这是交互式功能,但您使用的是 writer.getImportedPage(reader,i)
,其中 writer
是 PdfWriter
的一个实例。这意味着您将放弃所有交互功能...
问题 #3:
我假设您想将已填写的文档合并 2 份。您正在创建一个包含 2 列的 table,并将现有文档的页面作为单元格添加到此 table,但是:
- 您正在创建 A4 尺寸的纵向文档。这看起来会很尴尬。
- iText 不会呈现不完整的行,因此如果您现有的 PDF 只有一页,则不会呈现 table。如果现有 PDF 的页数为奇数,最后一页将丢失。
PdfPTable
的默认宽度百分比为 80%。每个添加半英寸的边距,最终您将在导入页面的左侧和右侧得到大量白色 space。
我认为你应该先使用上面的代码填写表格,然后再 N-up 文档。
PdfWriter.getInstance(document, new FileOutputStream(Result).setInitialLeading(16);
是空的。
所以你必须改为:
PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result))
writer.setInitialLeading(16);
大家好,我知道这可能是我面临的一个简单问题,但我现在已经坚持了一段时间。我是使用 itext 的新手。基本上我正在做一个小项目,我试图使用现有的 pdf 来填充数据库中的数据。但在我这样做之前,我只是想确保我是否可以使用 itext 将数据从数据库复制到已经存在的 pdf 中。但是我遇到了这个问题 "cannot convert from void to pdf writer" 我试着查看 itext 邮件列表并尝试获取一些示例代码但没有任何帮助,所以我在这里寻求帮助。请帮助我解决我的问题,并大致了解如何从数据库中获取数据并填写表格。
例如表单有一个留空的姓氏,所以我需要从数据库中提取姓氏并将其放在 pdf 中的姓氏位置。以下是我的代码。
/**
*
*/
package itext.sample;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//import com.itextpdf.text.BaseColor;
//import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
//import com.itextpdf.text.Font;
//import com.itextpdf.text.Font.FontFamily;
//import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
//import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.DocWriter;
/**
* @author prithvi
*
*/
public class FirstPdf {
private static final String Result = "D:/Eclipse Java/image.pdf";
public static String main(String[] args) throws SQLException,IOException,DocumentException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("Where is your MySQL JDBC Driver?");
e.printStackTrace();
return null;
}
System.out.println("MySQL JDBC Driver Registered!");
Connection connection = null;
try {
connection = DriverManager
.getConnection("jdbc:mysql://69.167.139.172/bluedb",
"color", "prithvi");
} catch (SQLException e) {
System.out.println("Connection Failed! Check output console");
e.printStackTrace();
return null;
}
if (connection != null) {
System.out.println("You made it, take control your database now!");
} else {
System.out.println("Failed to make connection!");
}
// creating pdf document
Document document = new Document();
try {
//writing to the outputfile
PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result)) .setInitialLeading(16);
document.open(); //opening the document to do the action
Statement stm = null;
stm = connection.createStatement();//creating database query
ResultSet rs = null;
rs = stm.executeQuery("SELECT * FROM Sec1");
PdfPTable table = new PdfPTable(2);
PdfReader reader =new PdfReader ("D:/Eclipse Java/HiltonForms2014_r.pdf");
AcroFields form = reader.getAcroFields();
form.setField("LASTNAME", rs.getCursorName());
int n = reader.getNumberOfPages();
PdfImportedPage page;
for( int i= 1; i <=n;i++)
{
page = writer.getImportedPage(reader,i);
table.addCell(Image.getInstance(page));
}
document.add(table);
document.close();
connection.close();
reader.close();
/*while (rs.next()){
document.add(new Chunk(rs.getString(Result)));
document.add(new Chunk(""));
Font font = new Font(FontFamily.TIMES_ROMAN, 10,Font.BOLD, BaseColor.WHITE);
Chunk id = null;
id = new Chunk(rs.getString("Sec1ID"), font);
id.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f , 1.5f);
id.setTextRise(6);
document.add(id);
document.add(Chunk.NEWLINE);
document.add(new Paragraph("hey there! you created a new pdf"));
stm.close();
connection.close();
document.close();
}*/
}
catch (DocumentException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
对不起,你的代码全错了。
填写表格时,需要使用PdfStamper
。例如参见:How to fill out a pdf file programatically?
在您的情况下,代码为:
PdfReader reader = new PdfReader("D:/Eclipse Java/HiltonForms2014_r.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(Result));
AcroFields form = stamper.getAcroFields();
form.setField("LASTNAME", rs.getCursorName());
stamper.setFormFlattening(true);
stamper.close();
reader.close();
这些是我在您的代码中检测到的一些问题:
问题 #1:
PdfReader reader =new PdfReader ("D:/Eclipse Java/HiltonForms2014_r.pdf");
AcroFields form = reader.getAcroFields();
form.setField("LASTNAME", rs.getCursorName());
您确实可以从 PdfReader
创建一个 AcroFields
实例,但在这种情况下,字段将是只读的,这意味着 setField()
方法不会执行任何操作.只有从 PdfStamper
获得的 AcroFields
实例才能用于设置字段。
问题 #2:
您想填写字段,这是交互式功能,但您使用的是 writer.getImportedPage(reader,i)
,其中 writer
是 PdfWriter
的一个实例。这意味着您将放弃所有交互功能...
问题 #3:
我假设您想将已填写的文档合并 2 份。您正在创建一个包含 2 列的 table,并将现有文档的页面作为单元格添加到此 table,但是:
- 您正在创建 A4 尺寸的纵向文档。这看起来会很尴尬。
- iText 不会呈现不完整的行,因此如果您现有的 PDF 只有一页,则不会呈现 table。如果现有 PDF 的页数为奇数,最后一页将丢失。
PdfPTable
的默认宽度百分比为 80%。每个添加半英寸的边距,最终您将在导入页面的左侧和右侧得到大量白色 space。
我认为你应该先使用上面的代码填写表格,然后再 N-up 文档。
PdfWriter.getInstance(document, new FileOutputStream(Result).setInitialLeading(16);
是空的。
所以你必须改为:
PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result))
writer.setInitialLeading(16);