Hi, > Am 14.06.2016 um 08:38 schrieb Magnus Evensberget > <[email protected]>: > > We solved this by this code: > > public Optional<Integer> getMaxLengthOfField(PDAcroForm form, String > fieldName) { > if(hasField(form, fieldName)) { > PDTextField field = getTextField(form, fieldName).get(); > if(field != null) { > PDFont font = PDType1Font.COURIER; > int fontSize = getFontSizeFromAppearance(field.getDefaultAppearance()); > float oneCharWidth = (font.getAverageFontWidth() / > PDF_FONT_WIDTH_UNIT) * fontSize; > > COSDictionary dict = field.getCOSObject(); > COSBase box = dict.getObjectFromPath("AP/N/BBox"); > if (!(box instanceof COSArray)) { > box = dict.getItem(COSName.RECT); > } > if (box instanceof COSArray) { > COSArray rect = (COSArray)box; > float fieldWidth = ((COSFloat)rect.get(2)).floatValue() - > ((COSFloat)rect.get(0)).floatValue(); > > int maxLength = (int)Math.floor(fieldWidth / oneCharWidth); > return Optional.of(maxLength); > } > } > } > return Optional.absent(); > } > > This only work with fonts where all characters are equally wide (such as > Courier) >
you can get the width of a string using PDFont.getStringWidth(String text) see http://pdfbox.apache.org/docs/2.0.2/javadocs/org/apache/pdfbox/pdmodel/font/PDFont.html#getStringWidth(java.lang.String) also works for proportional fonts. BR Maruan > > > On Mon, 13 Jun 2016 at 22:50 Tilman Hausherr <[email protected]> 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 <[email protected]> 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 <[email protected]> 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: [email protected] >>>>> For additional commands, e-mail: [email protected] >>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [email protected] >>>> For additional commands, e-mail: [email protected] >>>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [email protected] >>> For additional commands, e-mail: [email protected] >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> >> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

