作家无法解决itext

Posted

技术标签:

【中文标题】作家无法解决itext【英文标题】:writer cannot be resolved itext 【发布时间】:2015-08-12 07:23:11 【问题描述】:

大家好,我知道这可能是我面临的一个简单问题,但我现在被困了一段时间。我是使用 itext 的新手。基本上我正在做一个小项目,我试图使用现有的 pdf 来填充数据库中的数据。但在我这样做之前,我只是想确定我是否可以使用 itext 将数据从数据库复制到已经存在的 pdf。但是我遇到了这个问题“无法从 void 转换为 pdf 作家”我尝试查看 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();
                    
                



【问题讨论】:

你在哪一行得到错误? 创建文档后try块的第一行 PdfWriter.getInstance(document, new FileOutputStream(Result).setInitialLeading(16); 【参考方案1】:

对不起,你的代码全错了。

当您要填写表格时,您需要使用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),其中writerPdfWriter 的一个实例。这意味着您将丢弃所有交互功能...

问题 #3:

我假设您想要对填写的文档进行 2-up。您正在创建一个包含 2 列的表格,并将现有文档的页面作为单元格添加到此表格中,但是:

您正在创建一个 A4 尺寸的纵向文档。这看起来很尴尬。 iText 不会呈现不完整的行,因此如果您现有的 PDF 只有一页,则不会呈现表格。如果现有 PDF 的页数为奇数,则最后一页将丢失。 PdfPTable 的默认宽度百分比为 80%。添加每个半英寸的边距,您将在导入页面的左侧和右侧看到大量空白。

我认为您应该先使用上述代码填写表单,然后再将文档 N-up。

【讨论】:

感谢您纠正我哪里出错了。我想我可以从这里弄清楚。 我正在按照您的建议修改编码,但现在我在 PdfStamper 构造函数中遇到错误。 "构造函数 FileOutputStream 未定义" @Dean 我的回答中有一个复制/粘贴错误。谢谢你报告。我已经修好了。【参考方案2】:

PdfWriter.getInstance(document, new FileOutputStream(Result).setInitialLeading(16); 是空的。

所以你必须改为:

PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result)) 
writer.setInitialLeading(16);

【讨论】:

这确实是异常的原因(因此是赞成票),但总的来说,代码是错误的。代码 sn-p 无法工作,因为PdfReader.getAcroFields() 以只读模式返回字段。此外,setInitialLeading(16) 方法在本示例的上下文中没有任何意义。

以上是关于作家无法解决itext的主要内容,如果未能解决你的问题,请参考以下文章

我可以为剧作家浏览器设置日期吗

如何使用剧作家或柏树选择蚂蚁设计选择选项

[专栏作家] 使用xlua读取lua数据表性能分析

“技术·探索”技术作家英雄会带你开启不一样的1024!

Imdb上所有电影名称、演员、导演、作家的列表

流作家的基本理解