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/05/09 12:53:15 UTC

Re: Profound Sadness Trying To Embed Fonts For Form FIelds

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 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