Hi, here is a quick sample program - hope it helps.
// Load the PDF document created by SimpleForm.java PDDocument document = PDDocument.load(new File("target/SimpleForm.pdf")); PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); // Get the field and the widget associated to it. // Note: there might be multiple widgets PDField field = acroForm.getField("SampleField"); PDAnnotationWidget widget = field.getWidgets().get(0); // Get the width of the fields box float widthOfField = widget.getRectangle().getWidth(); // Get the font and the font size setting // This is currently a little awkward and needs improvement to have a better API // for that. In many cases the string will be built like that: // /Helv 12 Tf 0 g // We could use PDFStreamParser to do the parsing. For the sample we split the // string. String defaultAppearance = ((PDTextField) field).getDefaultAppearance(); String[] parts = defaultAppearance.split(" "); // Get the font name COSName fontName = COSName.getPDFName(parts[0].substring(1)); float fontSize = Float.parseFloat(parts[1]); // Get the font resource. // First look up the font from the widgets appearance stream. // This will be the case if there is already a value. // If the value hasn't been set yet the font resource needs to be looked up from // the AcroForm default resources PDFont font = null; PDResources resources = null; resources = widget.getNormalAppearanceStream().getResources(); if (resources != null) { font = resources.getFont(fontName); } if (font == null) { font = acroForm.getDefaultResources().getFont(fontName); } String willFit = "short string"; String willNotFit = "this is a very long string which will not fit the width of the widget"; // calculate the string width at a certain font size float willFitWidth = font.getStringWidth(willFit) * fontSize / 1000; float willNotFitWidth = font.getStringWidth(willNotFit) * fontSize / 1000; assert willFitWidth < widthOfField; assert willNotFitWidth > widthOfField; document.close(); BR Maruan > Am 17.06.2016 um 18:03 schrieb Tilman Hausherr <thaush...@t-online.de>: > > Am 16.06.2016 um 23:12 schrieb Barry Neu: >> Given an earlier reply from Maruan: >> "you can get the width of a string using PDFont.getStringWidth(String text)" > > Yes this is true. > >> Is it not true one needs to know the font size to determine the string width? > > Yes that too. If you have a size 12 then multiply with 12. And divide by 1000 > (this is only for string widths): > > float stringWidth = font.getStringWidth( message )*fontSize/1000f; > > (This is from the CreateLandscapePDF example) > > If your font is size 12: 2780 * 12 / 1000 / 72 * 2.54 = 1.17cm > > To decide whether it will fit in your rectangle, just use > > 2780 * 12 / 1000 = 33.36 > > Sorry that this doesn't really go forward. If you have a PDF and a minimal > software maybe we can help better. > > Tilman > > >> My goal is to determine if a field value will fit in a field at the >> specified font size on the form. >> ... >> //get field size - 1 unit = 1/72 inch >> float fieldSize = field.getWidgets().get(0).getRectangle().getWidth(); >> >> //get field value size >> PDFont font = PDType1Font.HELVETICA; >> float fieldLength = font.getStringWidth(someValue); >> ... >> >> 1. How can an accurate length be calculated without a Font Size?? >> 2. And, the getStringWidth() method returns a value such as 2780.0 for a 5 >> character field .. what does that number represent? > > > >> Thanks again. >> >> >> >>> On Jun 16, 2016, at 2:19 PM, Tilman Hausherr<thaush...@t-online.de> wrote: >>> >>> Am 16.06.2016 um 20:56 schrieb Barry Neu: >>>> Thank you Tilman. >>>> >>>> I was poking around trying to find where to get the Font and Font size for >>>> a PDTextField but not having any luck. >>>> Is it in the CosDictionary or what is the proper way to find those 2 >>>> pieces of information? >>> getDefaultAppearance() >>> >>> you would have to parse that. >>> >>> I see there's also getDefaultAppearanceString() which is more advanced, but >>> this isn't public. See the source code of PDDefaultAppearanceString to see >>> what can be done with that, and make a copy for yourself. >>> >>> PDDefaultAppearanceString getDefaultAppearanceString() throws IOException >>> { >>> COSString da = (COSString) getInheritableAttribute(COSName.DA); >>> PDResources dr = getAcroForm().getDefaultResources(); >>> return new PDDefaultAppearanceString(da, dr); >>> } >>> >>> >>> Tilman >>> >>> >>>> Really appreciate the support. >>>> >>>>> On Jun 13, 2016, at 2:51 PM, Tilman Hausherr<thaush...@t-online.de> >>>>> wrote: >>>>> >>>>> Am 13.06.2016 um 22:36 schrieb Barry Neu: >>>>>> Thank you for the reply. >>>>>> I could store meta data about the fields’ capacity as a last resort. >>>>>> However, there are about 50 different forms to work with and the number >>>>>> will continue to grow. >>>>>> >>>>>> Including Tilman’s reply here: >>>>>> "Calculate the width of the /Rectangle. 1 unit = 1/72 inch.” >>>>>> >>>>>> Are the /Rect coordinates represented in the following order? >>>>>> Left rectangle boundary, Top, Right, Bottom >>>>>> >>>>>> So, 91.095 - 51.855 = 39.24/72s inch wide (or a little over a 1/2 inch)?? >>>>>> >>>>>> And, how does one get to the /Rect data? >>>>> Get the widgets of the field >>>>> >>>>> PDField.getWidgets(). Usually there is only one (unless you have several >>>>> widgets, i.e. that the field appears several times in the PDF. So do this >>>>> call: >>>>> >>>>> getWidgets().get(0).getRectangle().getWidth() >>>>> >>>>> What is in the PDF shouldn't matter, unless for debugging. I.e. don't try >>>>> to parse the PDF yourself. >>>>> >>>>> I suggest you have a look at the examples in the source download, >>>>> especially in org.apache.pdfbox.examples.interactive.form. >>>>> >>>>> Tilman >>>>> >>>>>> I have a debug session open in Eclipse but am not seeing the /Rect data >>>>>> in ether the PDField or PDAcroForm. >>>>>> >>>>>>> On Jun 13, 2016, at 12:32 PM, Aaron Mulder<ammul...@gmail.com> wrote: >>>>>>> >>>>>>> If the form isn't changing, can you just check out the field >>>>>>> definition in the PDF doc? Here's one from the PDF form I'm working >>>>>>> with: >>>>>>> >>>>>>> << /Type /Annot /T (SlotsTotal 19) /V () /Rect [ 51.855 457.452 91.095 >>>>>>> 478.332 >>>>>>> ] /DV () /FT /Tx /DA (/Helvetica 12 Tf 0 g) /F 4 /MK 1972 0 R /Q 1 >>>>>>> /Subtype >>>>>>> /Widget >> >>>>>>> >>>>>>> The /Rect units aren't in pixels but I assume the text width >>>>>>> calculation would be the same so it would work out. >>>>>>> >>>>>>> My PDF was originally a Linearized mess but I opened it and saved it >>>>>>> in Preview on OS X and then all the form elements came out in plain >>>>>>> text which made it easy to inspect in a text editor. >>>>>>> >>>>>>> Thanks, >>>>>>> Aaron >>>>>>> >>>>>>> >>>>>>> On Mon, Jun 13, 2016 at 1:32 PM, Barry Neu<barry....@gmail.com> wrote: >>>>>>>> Hello. >>>>>>>> >>>>>>>> Is it possible to calculate the pixel width of a text field on a >>>>>>>> fillable PDF? >>>>>>>> If so, is there an example available or where can I look to research? >>>>>>>> >>>>>>>> Some context: >>>>>>>> I’m working with PDFBox 2.0. >>>>>>>> Data for a fillable form is collected in a web user interface. If the >>>>>>>> value for a given field exceeds the field capacity on the form, the >>>>>>>> value should be populated on an addendum form. The font size of the >>>>>>>> field cannot scale down below a particular value. >>>>>>>> >>>>>>>> The font and font size are known in advance so the length of the Value >>>>>>>> can be calculated. But I need to know the pixel capacity of the field >>>>>>>> to know if the value will “fit”. >>>>>>>> Also open to an alternate strategy if someone has solved differently. >>>>>>>> >>>>>>>> Thanks for any help. >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org >>>>>>>> For additional commands, e-mail:users-h...@pdfbox.apache.org >>>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org >>>>>>> For additional commands, e-mail:users-h...@pdfbox.apache.org >>>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org >>>>>> For additional commands, e-mail:users-h...@pdfbox.apache.org >>>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org >>>>> For additional commands, e-mail:users-h...@pdfbox.apache.org >>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org >>>> For additional commands, e-mail:users-h...@pdfbox.apache.org >>>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail:users-unsubscr...@pdfbox.apache.org >>> For additional commands, e-mail:users-h...@pdfbox.apache.org >>> > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org For additional commands, e-mail: users-h...@pdfbox.apache.org