You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-users@xmlgraphics.apache.org by Markus Ruggiero <ma...@kataputt.com> on 2011/02/19 08:01:14 UTC
Problem with font encoding in resulting PDF
Hi list,
I have a problem with font encoding that I was not able to find a solution in the list archive. This is MacOSX with Java SE6 and FOP 1.0. Please bear with me as I am new to XSLT and FOP.
The following character does not make it into to final PDF: → (Unicode #8594). The input XML is generated correct, showing the correct char when dumping to Eclipse console with System.out.println(myXML), encoding is UTF-8, the XSL is correctly set to UTF-8. However the resulting PDF shows a # instead of the desired character. Analysis of the PDF with Acrobat shows that the text is encoded ANSI with font Helvetica. How can I specify UTF-8? Helvetica does have the correct arrow char as pasting the XML file into BBEdit set to UTF-8/Helvetica also shows the correct character. Capturing the intermediate fo data and dumping it to Eclipse console also shows everything as it should be.
I use the following code to generate the resulting PDF byte[]. The code is right from the examples section on xmlgraphics.apache.org/fop/1.0/embedding. The data is then downloaded as PDF to the browser.
Thanks for any help
---markus---
private byte[] xml2pdf(URL xslt, String xml ) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
// Setup input and output files
File xsltfile = new File(xslt.getPath());
// configure fopFactory as desired
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired
try {
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
// Set the value of a <param> in the stylesheet
transformer.setParameter("versionParam", "2.0");
// Setup input for XSLT transformation
Source src = new StreamSource(new StringReader(xml));
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
}
finally {
out.close();
}
}
catch (Exception e) {
e.printStackTrace(System.err);
}
return out.toByteArray();
}
Re: Problem with font encoding in resulting PDF
Posted by Glenn Adams <gl...@skynav.com>.
You did not provide the most important details, namely the input FO and the
output PDF. In any case, it is most likely that you are not specifying a
font that contains the desired character. Try specifying
<fo:inline font-family="Arial Unicode MS">薔</fo:inline>
Of course, you will need to make sure you have this font (arialuni.ttf)
installed in ~/Library/Fonts or in /Library/Fonts/Microsoft.
G.
On Sat, Feb 19, 2011 at 12:01 AM, Markus Ruggiero <mailinglists@kataputt.com
> wrote:
> Hi list,
>
> I have a problem with font encoding that I was not able to find a solution
> in the list archive. This is MacOSX with Java SE6 and FOP 1.0. Please bear
> with me as I am new to XSLT and FOP.
>
> The following character does not make it into to final PDF: → (Unicode
> #8594). The input XML is generated correct, showing the correct char when
> dumping to Eclipse console with System.out.println(myXML), encoding is
> UTF-8, the XSL is correctly set to UTF-8. However the resulting PDF shows a
> # instead of the desired character. Analysis of the PDF with Acrobat shows
> that the text is encoded ANSI with font Helvetica. How can I specify UTF-8?
> Helvetica does have the correct arrow char as pasting the XML file into
> BBEdit set to UTF-8/Helvetica also shows the correct character. Capturing
> the intermediate fo data and dumping it to Eclipse console also shows
> everything as it should be.
>
> I use the following code to generate the resulting PDF byte[]. The code is
> right from the examples section on
> xmlgraphics.apache.org/fop/1.0/embedding. The data is then downloaded as
> PDF to the browser.
>
> Thanks for any help
> ---markus---
>
> private byte[] xml2pdf(URL xslt, String xml ) {
> ByteArrayOutputStream out = new ByteArrayOutputStream();
>
> try {
> // Setup input and output files
> File xsltfile = new File(xslt.getPath());
> // configure fopFactory as desired
> FopFactory fopFactory = FopFactory.newInstance();
>
> FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
>
> // configure foUserAgent as desired
> try {
> // Construct fop with desired output format
> Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
> // Setup XSLT
> TransformerFactory factory = TransformerFactory.newInstance();
> Transformer transformer = factory.newTransformer(newStreamSource(xsltfile));
> // Set the value of a <param> in the stylesheet
> transformer.setParameter("versionParam", "2.0");
> // Setup input for XSLT transformation
> Source src = new StreamSource(new StringReader(xml));
>
> // Resulting SAX events (the generated FO) must be piped through to
> FOP
> Result res = new SAXResult(fop.getDefaultHandler());
> // Start XSLT transformation and FOP processing
> transformer.transform(src, res);
> }
> finally {
> out.close();
> }
> }
> catch (Exception e) {
> e.printStackTrace(System.err);
> }
> return out.toByteArray();
> }
>
>
>