You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Evan Williams <ev...@zapprx.com> on 2017/04/20 16:59:58 UTC
Profound Sadness Trying To Embed Fonts For Form FIelds
I am trying to change all of the fields in a PDF form to use a TrueType
font that I am embedding. Or trying to embed more accurately.
I have had good success with embedding fonts went I am drawing text in a
document, but for form fields, I have been unable to programmatically force
the font to embed.
I load the font in the constructor like this:
* final PDFont formFont = loadFontResourceWithDef(pdf, DEFAULT_F**O*
*NT_PATH,*
* DEF_DOCUMENT_FONT);*
* final PDResources resources = acroForm.getDefaultResources();*
* final String fontName = resources.add(formFont).getName();*
* acroForm.setDefaultResources(resources);*
* this.defaultAppearanceString = "/" + fontName + " 0 Tf 0 g";*
* }*
* public static PDFont loadFontResourceWithDef(PDDocument doc,*
* String fontpath, PDFont defFont) {*
* PDType0Font resFont = null;*
* try {*
* final InputStream is =
this.getClass().getResourceAsStream(fontpath);*
* if (is != null) {*
* resFont = PDType0Font.load(doc, is);*
* }*
* } catch (IOException e) {*
* log("Error loading font " + fontpath, e);*
* }*
* return resFont != null ? resFont : defFont;*
* }*
Presume that I have verified that the font actually is loaded into the
formFont variable.
Some time later, I iterate over the fields in the acroform and, for each
field, do this:
* if (field instanceof PDTextField) {*
* final PDTextField textfield = (PDTextField) field;*
* textfield.setDefaultAppearance(defaultAppearanceString);*
* }*
The result of this is that the appearances for the text fields are all
correct, but the font is never embedded, so it looks OK on my machine
(because the font that I am loading is available locally), but I get
charming empty rectangles on machines where the font is not present. If I
open the PDF in acrobat and manually change the font on one field and
change it back, the font them embeds and everything works fine.
I have uploaded an example to
https://dl.dropboxusercontent.com/u/25802656/ofev_rx_3338.pdf
Any thoughts would be helpful. I would rather not do a manual operation on
more than one hundred files.
Thank you, you the always helpful and wonderful PDFBox community.
--
*Evan Williams*
Sr. Software Engineer
evan.williams@zapprx.com
*www.ZappRx.com <http://www.zapprx.com/>*
Re: Profound Sadness Trying To Embed Fonts For Form FIelds
Posted by Evan Williams <ev...@zapprx.com>.
Thank you Maruan!
Thank you for your workaround and confirmation of the bug (although it is a
quite obscure use case, but that is where the bugs hide I suppose).
I will open an issue.
I appreciate your help very much.
On Tue, May 9, 2017 at 10:15 AM, Maruan Sahyoun <sa...@fileaffairs.de>
wrote:
> Hi,
> > Am 09.05.2017 um 14:53 schrieb Evan Williams <ev...@zapprx.com>:
> >
> > Thank you Tilman,
> >
> > It turns out that I just sent the wrong file to you. The embedding issue
> is
> > very real.
> >
> > A form that actually shows the problem is here:
> >
> > https://dl.dropboxusercontent.com/u/25802656/CF-CVS-Revised.pdf
> >
> > The form fields are empty in this example but the font is not embedded
> and
> > the form will show no-glyph rectangles on any machine that doesn't have
> > 'Noto Sans' installed.
> >
> > I have been trying experiments and it seems like, for the code I wrote,
> if
> > you try to set a font ONLY for the AcroForm where there is no text using
> > the same font in the document, the font will not embed. This is either
> > because:
> >
> > 1. My code is wrong (likely)
> > 2. There is a PDFBox bug (unpossible!)
> >
> > I believe that I can hack around this by writing tiny white text
> somewhere
> > in the document using the font that I would like to use for the form, bur
> > that is, to use a technical term, crappy.
> >
> > What can you advise?
> >
>
> you need to at least set a value with a single character for a form field.
> After that you can set the value of the form field back.
>
> The font is only embedded if it's actually used - please open an issue at
> https://issues.apache.org/jira/browse/PDFBOX/ for that.
>
> BR
> Maruan
>
>
> >
> > On Fri, Apr 21, 2017 at 12:52 AM, Tilman Hausherr <THausherr@t-online.de
> >
> > wrote:
> >
> >> Is the file you uploaded the result before or after your operation?
> >> Because everything works nicely with Adobe. The font Noto Sans is
> embedded,
> >> I don't have it on my machine.
> >>
> >> If it is the result "before" or "with Adobe", then please upload the
> >> result "after PDFBox" (and if possible, screenshots of "own machine" and
> >> "other machine without the font") and if possible use an unusual font,
> and
> >> also try
> >>
> >>
> >> resFont = PDType0Font.load(doc, is, false);
> >>
> >>
> >> I haven't tried running your code yet.
> >>
> >> Tilman
> >>
> >>
> >>
> >>
> >> Am 20.04.2017 um 18:59 schrieb Evan Williams:
> >>
> >>> I am trying to change all of the fields in a PDF form to use a TrueType
> >>> font that I am embedding. Or trying to embed more accurately.
> >>>
> >>> I have had good success with embedding fonts went I am drawing text in
> a
> >>> document, but for form fields, I have been unable to programmatically
> >>> force
> >>> the font to embed.
> >>>
> >>> I load the font in the constructor like this:
> >>>
> >>> * final PDFont formFont = loadFontResourceWithDef(pdf,
> >>> DEFAULT_F**O*
> >>> *NT_PATH,*
> >>> * DEF_DOCUMENT_FONT);*
> >>> * final PDResources resources = acroForm.getDefaultResources()
> ;*
> >>> * final String fontName = resources.add(formFont).getName();*
> >>> * acroForm.setDefaultResources(resources);*
> >>> * this.defaultAppearanceString = "/" + fontName + " 0 Tf 0 g";*
> >>>
> >>> * }*
> >>>
> >>> * public static PDFont loadFontResourceWithDef(PDDocument doc,*
> >>> * String fontpath, PDFont defFont) {*
> >>> * PDType0Font resFont = null;*
> >>> * try {*
> >>> * final InputStream is =
> >>> this.getClass().getResourceAsStream(fontpath);*
> >>> * if (is != null) {*
> >>> * resFont = PDType0Font.load(doc, is);*
> >>> * }*
> >>> * } catch (IOException e) {*
> >>> * log("Error loading font " + fontpath, e);*
> >>> * }*
> >>> * return resFont != null ? resFont : defFont;*
> >>> * }*
> >>>
> >>> Presume that I have verified that the font actually is loaded into the
> >>> formFont variable.
> >>>
> >>> Some time later, I iterate over the fields in the acroform and, for
> each
> >>> field, do this:
> >>>
> >>> * if (field instanceof PDTextField) {*
> >>> * final PDTextField textfield = (PDTextField) field;*
> >>> * textfield.setDefaultAppearance
> >>> (defaultAppearanceString);*
> >>> * }*
> >>>
> >>> The result of this is that the appearances for the text fields are all
> >>> correct, but the font is never embedded, so it looks OK on my machine
> >>> (because the font that I am loading is available locally), but I get
> >>> charming empty rectangles on machines where the font is not present.
> If I
> >>> open the PDF in acrobat and manually change the font on one field and
> >>> change it back, the font them embeds and everything works fine.
> >>>
> >>> I have uploaded an example to
> >>> https://dl.dropboxusercontent.com/u/25802656/ofev_rx_3338.pdf
> >>>
> >>> Any thoughts would be helpful. I would rather not do a manual
> operation on
> >>> more than one hundred files.
> >>>
> >>> Thank you, you the always helpful and wonderful PDFBox community.
> >>>
> >>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> >> For additional commands, e-mail: users-help@pdfbox.apache.org
> >>
> >>
> >
> >
> > --
> > *Evan Williams*
> > Principal Software Engineer
> > evan.williams@zapprx.com
> >
> > *www.ZappRx.com <http://www.zapprx.com/>*
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>
>
--
*Evan Williams*
Principal Software Engineer
evan.williams@zapprx.com
*www.ZappRx.com <http://www.zapprx.com/>*
Re: Profound Sadness Trying To Embed Fonts For Form FIelds
Posted by Maruan Sahyoun <sa...@fileaffairs.de>.
Hi,
> Am 09.05.2017 um 14:53 schrieb Evan Williams <ev...@zapprx.com>:
>
> Thank you Tilman,
>
> It turns out that I just sent the wrong file to you. The embedding issue is
> very real.
>
> A form that actually shows the problem is here:
>
> https://dl.dropboxusercontent.com/u/25802656/CF-CVS-Revised.pdf
>
> The form fields are empty in this example but the font is not embedded and
> the form will show no-glyph rectangles on any machine that doesn't have
> 'Noto Sans' installed.
>
> I have been trying experiments and it seems like, for the code I wrote, if
> you try to set a font ONLY for the AcroForm where there is no text using
> the same font in the document, the font will not embed. This is either
> because:
>
> 1. My code is wrong (likely)
> 2. There is a PDFBox bug (unpossible!)
>
> I believe that I can hack around this by writing tiny white text somewhere
> in the document using the font that I would like to use for the form, bur
> that is, to use a technical term, crappy.
>
> What can you advise?
>
you need to at least set a value with a single character for a form field. After that you can set the value of the form field back.
The font is only embedded if it's actually used - please open an issue at https://issues.apache.org/jira/browse/PDFBOX/ for that.
BR
Maruan
>
> On Fri, Apr 21, 2017 at 12:52 AM, Tilman Hausherr <TH...@t-online.de>
> wrote:
>
>> Is the file you uploaded the result before or after your operation?
>> Because everything works nicely with Adobe. The font Noto Sans is embedded,
>> I don't have it on my machine.
>>
>> If it is the result "before" or "with Adobe", then please upload the
>> result "after PDFBox" (and if possible, screenshots of "own machine" and
>> "other machine without the font") and if possible use an unusual font, and
>> also try
>>
>>
>> resFont = PDType0Font.load(doc, is, false);
>>
>>
>> I haven't tried running your code yet.
>>
>> Tilman
>>
>>
>>
>>
>> Am 20.04.2017 um 18:59 schrieb Evan Williams:
>>
>>> I am trying to change all of the fields in a PDF form to use a TrueType
>>> font that I am embedding. Or trying to embed more accurately.
>>>
>>> I have had good success with embedding fonts went I am drawing text in a
>>> document, but for form fields, I have been unable to programmatically
>>> force
>>> the font to embed.
>>>
>>> I load the font in the constructor like this:
>>>
>>> * final PDFont formFont = loadFontResourceWithDef(pdf,
>>> DEFAULT_F**O*
>>> *NT_PATH,*
>>> * DEF_DOCUMENT_FONT);*
>>> * final PDResources resources = acroForm.getDefaultResources();*
>>> * final String fontName = resources.add(formFont).getName();*
>>> * acroForm.setDefaultResources(resources);*
>>> * this.defaultAppearanceString = "/" + fontName + " 0 Tf 0 g";*
>>>
>>> * }*
>>>
>>> * public static PDFont loadFontResourceWithDef(PDDocument doc,*
>>> * String fontpath, PDFont defFont) {*
>>> * PDType0Font resFont = null;*
>>> * try {*
>>> * final InputStream is =
>>> this.getClass().getResourceAsStream(fontpath);*
>>> * if (is != null) {*
>>> * resFont = PDType0Font.load(doc, is);*
>>> * }*
>>> * } catch (IOException e) {*
>>> * log("Error loading font " + fontpath, e);*
>>> * }*
>>> * return resFont != null ? resFont : defFont;*
>>> * }*
>>>
>>> Presume that I have verified that the font actually is loaded into the
>>> formFont variable.
>>>
>>> Some time later, I iterate over the fields in the acroform and, for each
>>> field, do this:
>>>
>>> * if (field instanceof PDTextField) {*
>>> * final PDTextField textfield = (PDTextField) field;*
>>> * textfield.setDefaultAppearance
>>> (defaultAppearanceString);*
>>> * }*
>>>
>>> The result of this is that the appearances for the text fields are all
>>> correct, but the font is never embedded, so it looks OK on my machine
>>> (because the font that I am loading is available locally), but I get
>>> charming empty rectangles on machines where the font is not present. If I
>>> open the PDF in acrobat and manually change the font on one field and
>>> change it back, the font them embeds and everything works fine.
>>>
>>> I have uploaded an example to
>>> https://dl.dropboxusercontent.com/u/25802656/ofev_rx_3338.pdf
>>>
>>> Any thoughts would be helpful. I would rather not do a manual operation on
>>> more than one hundred files.
>>>
>>> Thank you, you the always helpful and wonderful PDFBox community.
>>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
>> For additional commands, e-mail: users-help@pdfbox.apache.org
>>
>>
>
>
> --
> *Evan Williams*
> Principal Software Engineer
> evan.williams@zapprx.com
>
> *www.ZappRx.com <http://www.zapprx.com/>*
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org
Re: Profound Sadness Trying To Embed Fonts For Form FIelds
Posted by Evan Williams <ev...@zapprx.com>.
Thank you Tilman,
It turns out that I just sent the wrong file to you. The embedding issue is
very real.
A form that actually shows the problem is here:
https://dl.dropboxusercontent.com/u/25802656/CF-CVS-Revised.pdf
The form fields are empty in this example but the font is not embedded and
the form will show no-glyph rectangles on any machine that doesn't have
'Noto Sans' installed.
I have been trying experiments and it seems like, for the code I wrote, if
you try to set a font ONLY for the AcroForm where there is no text using
the same font in the document, the font will not embed. This is either
because:
1. My code is wrong (likely)
2. There is a PDFBox bug (unpossible!)
I believe that I can hack around this by writing tiny white text somewhere
in the document using the font that I would like to use for the form, bur
that is, to use a technical term, crappy.
What can you advise?
On Fri, Apr 21, 2017 at 12:52 AM, Tilman Hausherr <TH...@t-online.de>
wrote:
> Is the file you uploaded the result before or after your operation?
> Because everything works nicely with Adobe. The font Noto Sans is embedded,
> I don't have it on my machine.
>
> If it is the result "before" or "with Adobe", then please upload the
> result "after PDFBox" (and if possible, screenshots of "own machine" and
> "other machine without the font") and if possible use an unusual font, and
> also try
>
>
> resFont = PDType0Font.load(doc, is, false);
>
>
> I haven't tried running your code yet.
>
> Tilman
>
>
>
>
> Am 20.04.2017 um 18:59 schrieb Evan Williams:
>
>> I am trying to change all of the fields in a PDF form to use a TrueType
>> font that I am embedding. Or trying to embed more accurately.
>>
>> I have had good success with embedding fonts went I am drawing text in a
>> document, but for form fields, I have been unable to programmatically
>> force
>> the font to embed.
>>
>> I load the font in the constructor like this:
>>
>> * final PDFont formFont = loadFontResourceWithDef(pdf,
>> DEFAULT_F**O*
>> *NT_PATH,*
>> * DEF_DOCUMENT_FONT);*
>> * final PDResources resources = acroForm.getDefaultResources();*
>> * final String fontName = resources.add(formFont).getName();*
>> * acroForm.setDefaultResources(resources);*
>> * this.defaultAppearanceString = "/" + fontName + " 0 Tf 0 g";*
>>
>> * }*
>>
>> * public static PDFont loadFontResourceWithDef(PDDocument doc,*
>> * String fontpath, PDFont defFont) {*
>> * PDType0Font resFont = null;*
>> * try {*
>> * final InputStream is =
>> this.getClass().getResourceAsStream(fontpath);*
>> * if (is != null) {*
>> * resFont = PDType0Font.load(doc, is);*
>> * }*
>> * } catch (IOException e) {*
>> * log("Error loading font " + fontpath, e);*
>> * }*
>> * return resFont != null ? resFont : defFont;*
>> * }*
>>
>> Presume that I have verified that the font actually is loaded into the
>> formFont variable.
>>
>> Some time later, I iterate over the fields in the acroform and, for each
>> field, do this:
>>
>> * if (field instanceof PDTextField) {*
>> * final PDTextField textfield = (PDTextField) field;*
>> * textfield.setDefaultAppearance
>> (defaultAppearanceString);*
>> * }*
>>
>> The result of this is that the appearances for the text fields are all
>> correct, but the font is never embedded, so it looks OK on my machine
>> (because the font that I am loading is available locally), but I get
>> charming empty rectangles on machines where the font is not present. If I
>> open the PDF in acrobat and manually change the font on one field and
>> change it back, the font them embeds and everything works fine.
>>
>> I have uploaded an example to
>> https://dl.dropboxusercontent.com/u/25802656/ofev_rx_3338.pdf
>>
>> Any thoughts would be helpful. I would rather not do a manual operation on
>> more than one hundred files.
>>
>> Thank you, you the always helpful and wonderful PDFBox community.
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
> For additional commands, e-mail: users-help@pdfbox.apache.org
>
>
--
*Evan Williams*
Principal Software Engineer
evan.williams@zapprx.com
*www.ZappRx.com <http://www.zapprx.com/>*
Re: Profound Sadness Trying To Embed Fonts For Form FIelds
Posted by Tilman Hausherr <TH...@t-online.de>.
Is the file you uploaded the result before or after your operation?
Because everything works nicely with Adobe. The font Noto Sans is
embedded, I don't have it on my machine.
If it is the result "before" or "with Adobe", then please upload the
result "after PDFBox" (and if possible, screenshots of "own machine" and
"other machine without the font") and if possible use an unusual font,
and also try
resFont = PDType0Font.load(doc, is, false);
I haven't tried running your code yet.
Tilman
Am 20.04.2017 um 18:59 schrieb Evan Williams:
> I am trying to change all of the fields in a PDF form to use a TrueType
> font that I am embedding. Or trying to embed more accurately.
>
> I have had good success with embedding fonts went I am drawing text in a
> document, but for form fields, I have been unable to programmatically force
> the font to embed.
>
> I load the font in the constructor like this:
>
> * final PDFont formFont = loadFontResourceWithDef(pdf, DEFAULT_F**O*
> *NT_PATH,*
> * DEF_DOCUMENT_FONT);*
> * final PDResources resources = acroForm.getDefaultResources();*
> * final String fontName = resources.add(formFont).getName();*
> * acroForm.setDefaultResources(resources);*
> * this.defaultAppearanceString = "/" + fontName + " 0 Tf 0 g";*
>
> * }*
>
> * public static PDFont loadFontResourceWithDef(PDDocument doc,*
> * String fontpath, PDFont defFont) {*
> * PDType0Font resFont = null;*
> * try {*
> * final InputStream is =
> this.getClass().getResourceAsStream(fontpath);*
> * if (is != null) {*
> * resFont = PDType0Font.load(doc, is);*
> * }*
> * } catch (IOException e) {*
> * log("Error loading font " + fontpath, e);*
> * }*
> * return resFont != null ? resFont : defFont;*
> * }*
>
> Presume that I have verified that the font actually is loaded into the
> formFont variable.
>
> Some time later, I iterate over the fields in the acroform and, for each
> field, do this:
>
> * if (field instanceof PDTextField) {*
> * final PDTextField textfield = (PDTextField) field;*
> * textfield.setDefaultAppearance(defaultAppearanceString);*
> * }*
>
> The result of this is that the appearances for the text fields are all
> correct, but the font is never embedded, so it looks OK on my machine
> (because the font that I am loading is available locally), but I get
> charming empty rectangles on machines where the font is not present. If I
> open the PDF in acrobat and manually change the font on one field and
> change it back, the font them embeds and everything works fine.
>
> I have uploaded an example to
> https://dl.dropboxusercontent.com/u/25802656/ofev_rx_3338.pdf
>
> Any thoughts would be helpful. I would rather not do a manual operation on
> more than one hundred files.
>
> Thank you, you the always helpful and wonderful PDFBox community.
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org