I am trying to create a new TagProcessor to process custom input tags and
render a PdfFormField. I tried searching and reading about it but neither
the book nor the site have much information on how to do so.

This is the code to add the new TextBoxTagProcessor to the TagFactory

ByteArrayOutputStream os = new ByteArrayOutputStream();
> Document pdfDocument = new Document(PageSize.A4);
> try{
>     PdfWriter writer = PdfWriter.getInstance(pdfDocument, os);
>     InputStream in = new ByteArrayInputStream(pdfXHTML.getBytes("UTF-8"));
> //pdfXHTML is a HTML page
>     HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
>     pdfDocument.open();
>     TagProcessorFactory tagProcessorFactory = (DefaultTagProcessorFactory)
> Tags.getHtmlTagProcessorFactory();
>     tagProcessorFactory.addProcessor(new TextBoxTagProcessor(), "textbox");
>     htmlContext.setTagFactory(tagProcessorFactory);
>     htmlContext.setImageProvider(new AbstractImageProvider() {
>         public String getImageRootPath() {
>             return "";
>         }
>     });
>     htmlContext.setLinkProvider(new LinkProvider() {
>         public String getLinkRoot() {
>             return "http://tutorial.itextpdf.com/src/main/resources/html/
> ";
>         }
>     });
>
>     CSSResolver cssResolver =
> XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
>     Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, new
> HtmlPipeline(htmlContext, new PdfWriterPipeline(pdfDocument, writer)));
>     XMLWorker worker = new XMLWorker(pipeline, true);
>     XMLParser p = new XMLParser(worker, Charset.defaultCharset());
>     p.parse(in);
>     //XMLWorkerHelper.getInstance().parseXHtml(writer, document, in,
> Charset.defaultCharset() );
>     pdfDocument.close();
> }catch (Exception e){}
>
> return os.toByteArray();



And this is the TextBoxTagProcessor class

import com.itextpdf.text.*;
> import com.itextpdf.text.pdf.*;
> import com.itextpdf.text.pdf.TextField;
> import com.itextpdf.tool.xml.NoCustomContextException;
> import com.itextpdf.tool.xml.Tag;
> import com.itextpdf.tool.xml.WorkerContext;
> import com.itextpdf.tool.xml.exceptions.LocaleMessages;
> import com.itextpdf.tool.xml.html.AbstractTagProcessor;
> import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
>
> import java.util.ArrayList;
> import java.util.List;
>
> public class TextBoxTagProcessor extends AbstractTagProcessor {
>     private String name;
>     private boolean required;
>
>     @Override
>     public List<Element> start(final WorkerContext ctx, final Tag tag){
>         List<Element> l = new ArrayList<Element>(1);
>         return l;
>     }
>
>     @Override
>     public List<Element> end(final WorkerContext ctx, final Tag tag, final
> List<Element> currentContent) {
>     List<Element> l = new ArrayList<Element>(1);
>         final HtmlPipelineContext context;
>         try {
>         context = getHtmlPipelineContext(ctx);
>                 PdfPTable table = new PdfPTable(1);
>                 PdfPCell cell = new PdfPCell();
>                 String name = (tag.getAttributes().get("name") != null) ?
> tag.getAttributes().get("name") : "";
>                 String required = (tag.getAttributes().get("required") !=
> null) ? tag.getAttributes().get("required") : "false";
>                 cell.setCellEvent(new TextboxEvent(name, required));
>                 table.addCell(cell);
>                 l.add(table);
>         } catch (NoCustomContextException e) {}
>         return l;
>     }
>
>     public static class TextboxEvent implements PdfPCellEvent {
>         private String name;
>         private boolean required;
>
>         public TextboxEvent(String name, String required) {
>             this.name = name;
>             this.required = Boolean.parseBoolean(required);
>         }
>
>         public void cellLayout(PdfPCell cell, Rectangle position,
> PdfContentByte[] canvases) {
>             try {
>                     PdfContentByte cb = canvases[PdfPTable.TEXTCANVAS];
>                     PdfWriter writer = canvases[0].getPdfWriter();
>                     cb.saveState();
>                     TextField text = new TextField(writer, new
> Rectangle(position.getLeft(), position.getBottom()-4,
> position.getRight()-30, position.getTop()+4),name);
>                     text.setBorderStyle(PdfBorderDictionary.STYLE_SOLID);
>                     text.setText("");
>                     text.setFontSize(9.0f);
>                     text.setAlignment(Element.ALIGN_LEFT);
>                     if(required){
>                         text.setOptions(TextField.REQUIRED);
>                     }
>                     PdfFormField field = text.getTextField();
>                     writer.addAnnotation(field);
>                     //cb.restoreState();
>             }
>             catch (Exception e) {
>                 throw new ExceptionConverter(e);
>             }
>         }
>     }
> }
>


When I run this code, I get "java.lang.NullPointerException" but I don't
know where this is being thrown or why. Is the issue with the Pdfwriter
being null in the cellLayout method? My old code works fine for these
formfields but now I am trying to migrate over to XMLWorker as it seems
much easily modifiable but I am stuck on this. I tried looking at the
Header.java and Anchor.java but didn't get through. Any pointers would be
helpful.

Thanks!

Regards,
Parminder Kaur
------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
iText-questions mailing list
iText-questions@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/itext-questions

iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference 
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples: 
http://itextpdf.com/themes/keywords.php

Reply via email to