iTextSharp 5.3.3:Insert PushbuttonField in PDF and SetAction - itext

I want to create PushButton in PDF-document and set Action (GoToLocalPage):
PushButton:=New PushbuttonField(stamper.writer, New Rectangle(300, 300,330,330),"Text");
PushButton.Image:=img;
PushButton.ProportionalIcon:=True;
PushButton.Layout:=PushbuttonField.LAYOUT_ICON_ONLY;
PushButton.Field.Action:=PdfAction.GotoLocalPage(2, New PdfDestination(PdfDestination.FIT), stamper.Writer);
stamper.AddAnnotation(PushButton.Field,5);
As a result, the Action is not working. What am I doing wrong?
In all the examples written: PushButton.GetFields().SetAction(...). But in iTextSharp 5.3.3 method GetFields does not exist...
I tried:
Action:=PdfAction.GotoLocalPage(2, New PdfDestination(PdfDestination.FIT), stamper.Writer);
PushButton.Field.SetAdditionalActions(iTextSharp.text.pdf.PdfName.D, Action);
But it's does not working too..

This is how I would do it :
PdfAnnotation pushbuttonAnn = PushButton.Field;
pushbuttonAnn.Action:=PdfAction.GotoLocalPage(2, New PdfDestination PdfDestination.FIT), stamper.Writer);
stamper.AddAnnotation(pushbuttonAnn,5);

Related

Set table using "setFixedPosition" on specified page in a reopened PDF document

This question is the follow up to another question on stackoverflow.
I open an existing PDF with this code snippet:
reader = New PdfReader(filenameSource)
writer = New PdfWriter(destFile)
pdf = New PdfDocument(reader, writer)
doc = New Document(pdf, pdf.GetDefaultPageSize, False)
I can add a paragraph now via doc.add(new Paragraph(...))
But when I try to place a table with table.setFixedPosition(...), the table doesn´t show on the page.
Has anybody any hint for me?
Thanks and best regards
Benjamin
Based on your information I wrote this piece of code:
PdfReader reader = new PdfReader("LoremIpsum.pdf");
PdfWriter writer = new PdfWriter("LoremIpsum-with-positioned-table.pdf");
PdfDocument pdf = new PdfDocument(reader, writer);
Document doc = new Document(pdf, pdf.GetDefaultPageSize(), false);
Table table = new Table(new float[] { 200 });
table.AddCell(new Cell().Add(new Paragraph("test")).SetBackgroundColor(ColorConstants.CYAN));
table.SetFixedPosition(1, 100, 100, 200);
doc.Add(table);
doc.Close();
This didn't reproduce your issue
when I try to place a table with table.setFixedPosition(...), the table doesn´t show on the page.
because the result looks like this:
The table clearly shows.

adding pushbutton to already existing templates [duplicate]

I have used iText to fill data into existing AcroForm fields in a PDF.
I am now looking for a solution to add new AcroForm fields to a PDF. Is this possible with iText? If so, how can I do this?
This is documented in the official documentation, more specifically in the SubmitForm example. When using a tool such as iText, you should read the official documentation first ;-)
Anyway, I've written you a simple example called AddField. It adds a button field at a specific position defined by new Rectangle(36, 700, 72, 730).
public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
PushbuttonField button = new PushbuttonField(
stamper.getWriter(), new Rectangle(36, 700, 72, 730), "post");
button.setText("POST");
button.setBackgroundColor(new GrayColor(0.7f));
button.setVisibility(PushbuttonField.VISIBLE_BUT_DOES_NOT_PRINT);
PdfFormField submit = button.getField();
submit.setAction(PdfAction.createSubmitForm(
"http://itextpdf.com:8180/book/request", null,
PdfAction.SUBMIT_HTML_FORMAT | PdfAction.SUBMIT_COORDINATES));
stamper.addAnnotation(submit, 1);
stamper.close();
}
}
As you can see, you need to create a PdfFormField object (using helper classes such as PushbuttonField, TextField,...) and then use PdfStamper's addAnnotation() method to add the field to a specific page.

ITextSharp errror "Off is not a valid name for a checkbox appearance (should be Off or Yes)"

Running the following code snippet under VS 2010 using iTextSharp 5.5.6:
PdfReader reader = new PdfReader("Test.pdf");
FileStream fs = new FileStream("New.pdf", FileMode.Create);
PdfStamper p = new PdfStamper(reader, fs);
AcroFields form = p.AcroFields;
...
RadioCheckField newField = new RadioCheckField(p.Writer, new iTextSharp.text.Rectangle(20, 20), "MyCheckBox", "Off");
PdfFormField RadioField = newField.CheckField;
p.AddAnnotation(RadioField, 1);
I receive the error "ITextSharp errror "Off is not a valid name for a checkbox appearance (should be Off or Yes)" at the line declaring the RadioField object. Is this a bug? How do I work around it?
A check box can have two values:
one you define yourself in your method. That will be the value of the check box when selected.
one that is defined in ISO-32000-1: Off. That's the value of the check box when it's not selected.
There is a bug in your code because you are trying to create a check box of which the value is always Off whether it's selected or not.
Choose another value. Off is reserved for the off state. You need yo define a value for the on state. ISO-32000-1 recommends Yes.
This is how you make sure the check box is selected:
newField.Checked = true;
Unchecked is done like this:
newField.Checked = false;

How do I set an action for the root outline of a PDF

How do I set an action on the root Outline for a PDF?
I know I can do this on a kid of the root:
newOutline = new PdfOutline (rootOutline, PdfAction.GotoLocalPage ("1", false), rootNode.DivisionLabel, true);
But how to I do the same thing for the root?
In that I can not set the root outline (its readonly), and I can not set an action for it either. I get started like this:
PdfReader inputPdf = new PdfReader (rs);
int pageCount = inputPdf.NumberOfPages;
PdfStamper stamper = new PdfStamper (inputPdf, ws);
PdfWriter writer = stamper.Writer;
writer.ViewerPreferences = PdfWriter.PageModeUseOutlines;
PdfContentByte cb = writer.DirectContent;
PdfOutline rootOutline = cb.RootOutline;
Thanks for the help...
I could never get the PdfWriter returned by stamper.writer to work. I had to change my method such that it uses an independent PdfReader and PdfWriter pair, where I can copy the pages from the input PDF to output PDF while adding the needed local destinations and outlines. Grrr very frustrating working with iTextSharp...
I'm not sure that you can set an action for the root Outline. When would it trigger? The root is just a container for any other outlines.
If you want to always Go To Page 1 when the document opens, then there are other ways of doing that.

How to add a form field to an existing pdf with itextsharp?

How to add a form field to an existing pdf with itextsharp?
I have an existing pdf document, I'd like to add form fields to it without creating a copy and writing out a new document.
After further review, the ruling on the field is overturned. Turns out if you form flatten the stamper the fields do not show on the resulting document (because they lack 'appearance' settings). BTW, form flattening prevents further edits of a form field. Now we can add appearance to the form, however, an easier way is to use the TextField class and not worry about explicitly setting up 'appearance' objects.
public void ABetterWayToAddFormFieldToExistingPDF( )
{
PdfReader reader = new PdfReader(#"c:\existing.pdf");
FileStream out = new FileStream(#"C:\existingPlusFields.pdf", FileMode.Create, FileAccess.Write);
PdfStamper stamp = new PdfStamper(reader, out);
TextField field = new TextField(stamp.Writer, new iTextSharp.text.Rectangle(40, 500, 360, 530), "some_text");
// add the field here, the second param is the page you want it on
stamp.AddAnnotation(field.GetTextField(), 1);
stamp.FormFlattening = true; // lock fields and prevent further edits.
stamp.Close();
}
I struggled with this for awhile so figured I'd post the Question & Answer
Using the PdfStamper itext class is the key. (I guess this does make a copy but it's much cleaner than using the itext PdfCopy classes).
public void AddFormFieldToExistingPDF( )
{
PdfReader reader = new PdfReader(#"c:\existing.pdf");
FileStream out = new FileStream(#"C:\existingPlusFields.pdf", FileMode.Create, FileAccess.Write);
PdfStamper stamp = new PdfStamper(reader, out);
PdfFormField field = PdfFormField.CreateTextField(stamp.Writer, false, false, 50);
// set a field w/some position and size
field.SetWidget(new iTextSharp.text.Rectangle(40, 500, 360, 530),
PdfAnnotation.HIGHLIGHT_INVERT);
field.SetFieldFlags(PdfAnnotation.FLAGS_PRINT);
field.FieldName = "some_field";
// add the field here, the second param is the page you want it on
stamp.AddAnnotation(field, 1);
stamp.Close();
}
Using pdfStamper you can complete it.
PdfStamper Stamper= new PdfStamper(new PdfReader(sourcefile), File.Create(NewOutputFile));
TextField moreText = new TextField(Stamper.Writer,
new iTextSharp.text.Rectangle(20, 20, 590, 780), "moreText");
moreText.Visibility = TextField.VISIBLE_BUT_DOES_NOT_PRINT;
moreText.Text = "Use this space for any additional information";
moreText.Options = (TextField.MULTILINE);
PdfFormField Fieldtxt = moreText.GetTextField();
Stamper.AddAnnotation(Fieldtxt, n);