1

私はEclipseを介してitextとJavaを使用して次のことをしようとしています.データベースから取得した多肢選択式の質問で構成されるPDFを作成する必要があります.取得したデータはhtmlタグの形式であるため、使用していますxml ワーカーを使用して解析します。データベースから質問を 1 つずつ取得し、pdf に追加することができます。ページ。

最初の PDF ページの終わりに達したら、最初の PDF ページの右隅を使用して質問を追加する必要があります。ページの左右両方が完全に使用された場合にのみ、次の PDF ページに移動する必要があります。

これで、ColumnText を使用して 2 列の html データを取得できました。しかし、現在直面している問題は、データベースから取得した質問が意図したとおりの形式で表示されないことです。各質問は 1 行に表示されます。

入力した質問は次の形式です。

1)2+2=とは?

a)2

b)4

c)8

d)15

私はpdfの出力が上記のようになることを望んでいます。

ただし、次の出力が得られます。

1)2+2=とは?a)2b)4c)8d)15

HTMLフォーマットを保持するにはどうすればよいですか?????????

これまでの私のコードは次のとおりです。

 import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.List;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import com.itextpdf.tool.xml.ElementHandler;
import com.itextpdf.tool.xml.ElementList;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.Writable;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.WritableElement;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;

public class ColumnTextExample {
    public static final float[][] COLUMNS = {
         { 36, 36, 224, 579 } , { 230, 36, 418, 579 }

        };
public static void main(String[] args)throws IOException, DocumentException, ClassNotFoundException, SQLException {
        // TODO Auto-generated method stub
        Document document = new Document(PageSize.A4.rotate());

        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\columns.pdf"));

        document.open();


        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3", "root", "root");
        Statement st=con.createStatement();
        ResultSet rs=st.executeQuery("select * from exam2");
        int size=0;
        while (rs.next()){
        size++;
        };

        ResultSet rs1=st.executeQuery("select * from exam2");
        String[] myStringArray = new String[size];
        int i=0;
        while (rs1.next()){
           myStringArray[i]=rs1.getString("paper");
           i++;
     }

        ColumnText ct = new ColumnText(writer.getDirectContent());
        for (String article : myStringArray) {

           ct.addElement(createPhrase(article,writer,document));

            ct.addElement(Chunk.NEWLINE);
            document.add(Chunk.NEWLINE);
     }
        ct.setAlignment(Element.ALIGN_CENTER);
        ct.setExtraParagraphSpace(55);
        ct.setLeading(0, 1.2f);
        ct.setFollowingIndent(27);
        int linesWritten = 0;
        int column = 0;
        int status = ColumnText.START_COLUMN;
        while (ColumnText.hasMoreText(status)) {
            ct.setSimpleColumn(
                    COLUMNS[column][0], COLUMNS[column][1],
                    COLUMNS[column][2], COLUMNS[column][3]);
            ct.setYLine(COLUMNS[column][3]);
            status = ct.go();
            linesWritten += ct.getLinesWritten();
            column = Math.abs(column - 1);
            if (column == 0)
                document.newPage();
        }

        ct.addElement(new Phrase("Lines written: " + linesWritten));
        ct.go();
        document.close();
    }
 public static  Phrase createPhrase(String myString, PdfWriter writer, Document document) throws IOException, DocumentException {
        Phrase p = new Phrase();
        String myString2=myString+"<html><body><br></br></body></html>";
        String k="<br></br>";
        XMLWorkerHelper xwh = XMLWorkerHelper.getInstance();
        InputStream is = new ByteArrayInputStream(myString.getBytes());
        ElementList myList = new ElementList();
        ElementList myList1 = new ElementList();
      xwh.parseXHtml(myList,new StringReader(myString2));

      p.addAll(myList);

  return p;
}
    }

私が使用するXMLWorkerHelper.getInstance().parseXHtml(writer, document, new StringReader(name1));と、改行などのhtmlフォーマットを保持できます。

以下のコードは、DB から html データを取得し、フォーマットを維持しながら解析するのに役立ちます。ただし、単一の列で pdf に出力されます。

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.StringReader;

import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import  com.itextpdf.tool.xml.XMLWorkerHelper;
import java.io.ByteArrayInputStream;
import java.sql.*;


public class GeneratePDF {
    public static void main(String[] args) {
        try {
             OutputStream file = new FileOutputStream(new File("C:\\Test.pdf"));
            Document document = new Document();
            PdfWriter writer = PdfWriter.getInstance(document, file);
            document.open();

                 Class.forName("com.mysql.jdbc.Driver");
                   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3", "root", "root");
                   Statement st=con.createStatement();

                   ResultSet rs=st.executeQuery("select paper from exam2 ");
                   String name1="";
                   while (rs.next()){
                       String name = rs.getString("paper");
                       //out.println(name);
                       name1=name;


            /*String k="<h1 style='text-align: center;'><strong>Maths&nbsp;Question2 Paper</strong></h1>"+
"<pre><strong>1)What is the sum of 2+2??<br /></strong><strong>a)3<br /></strong><strong>b)5<br /></strong><strong>c)4<br /></strong><strong>d)1</strong></pre>"+
"<pre><strong>2)What is the sum of 5+2??<br /></strong><strong>a)3<br />b)5<br />c)7<br />d)1</strong></pre>"+
"<pre>&nbsp;</pre>";*/
                   System.out.println(name1);

            //InputStream is = new ByteArrayInputStream(name1.getBytes());
            XMLWorkerHelper.getInstance().parseXHtml(writer, document, new StringReader(name1));
                   }


            document.close();
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
}}} 
4

1 に答える 1

0

HTML をDocument. これは、ページ サイズ (この場合は A4) とページ マージン (この場合は各辺 36pt) で定義された 1 つの列を使用して、iText ですべてのコンテンツを 1 ページに整理することを意味します。

コンテンツを別の方法で編成する場合は、 as パラメータparseXHTML()を受け取り、オブジェクトを渡すメソッドを使用する必要があります。このリストには、オブジェクトにフィードできるオブジェクトが含まれます。クラスを使用すると、ページ上に複数の四角形を定義し、 メソッドを使用してこれらの四角形を のコンテンツで埋めることができます。ElementHandlerElementListListElementColumnTextColumnTextgo()ElementList

于 2013-09-22T09:33:42.217 に答える