Я создаю файл PDF в проекте Java8 с использованием библиотеки Apache FOP. Английский контент отображается без каких-либо проблем, но русские символы странные. Они выглядят следующим образом: Ð # огР̧н.Apache FOP. Проблема с циририческими символами
Кажется, что проблема здесь как-то связана с кодировкой, но как я могу ее исправить?
здесь класс я использую для создания PDF:
public class PdfGenerationTools implements StreamResource.StreamSource
{
String content;
public PdfGenerationTools(String content) {
this.content = content;
}
@Override
public InputStream getStream()
{
ByteArrayInputStream foStream =
new ByteArrayInputStream(content.getBytes(StringTools.UTF8));
// Basic FOP configuration. You could create this object
// just once and keep it.
FopFactory fopFactory = FopFactory.newInstance();
fopFactory.setStrictValidation(false); // For an example
// Configuration for this PDF document - mainly metadata
FOUserAgent userAgent = getFOUserAgent(fopFactory);
// Transform to PDF
ByteArrayOutputStream fopOut = new ByteArrayOutputStream();
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,
userAgent, fopOut);
TransformerFactory factory =
TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Source src = new
javax.xml.transform.stream.StreamSource(foStream);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
fopOut.close();
return new ByteArrayInputStream(fopOut.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private FOUserAgent getFOUserAgent(FopFactory factory)
{
FOUserAgent userAgent = factory.newFOUserAgent();
userAgent.setProducer("Company");
userAgent.setCreationDate(new Date());
userAgent.setTitle("Printing jobs");
userAgent.setTargetResolution(300); // DPI
return userAgent;
}
public static String initDoc()
{
return "<?xml version='1.0' encoding='ISO-8859-1'?>"+
"<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>"+
"<fo:layout-master-set>"+
"<fo:simple-page-master master-name='A4' margin='2cm'>"+
"<fo:region-body />"+
"</fo:simple-page-master>"+
"</fo:layout-master-set>"+
"<fo:page-sequence master-reference='A4'>"+
"<fo:flow flow-name='xsl-region-body'>";
}
public static String closeDoc()
{
return "</fo:flow>"+
"</fo:page-sequence>"+
"</fo:root>";
}
public static String initTable()
{
return "<fo:block space-before.optimum=\"10pt\"></fo:block>" +
"<fo:table table-layout=\"fixed\" border-width=\"1mm\" border-style=\"solid\">" +
"<fo:table-column column-number=\"1\" column-width=\"50%\"/>" +
"<fo:table-column column-number=\"2\" column-width=\"50%\"/>" +
"<fo:table-body>";
}
public static String closeTable()
{
return "</fo:table-body>" +
"</fo:table>";
}
public static String initTableRow()
{
return "<fo:table-row keep-together.within-page=\"always\">";
}
public static String closeTableRow()
{
return "</fo:table-row>";
}
public static String getCell(String ... args)
{
final StringBuilder sb = new StringBuilder();
sb.append("<fo:table-cell padding=\"1mm\" border-width=\"1mm\" border-style=\"double\">");
for (String arg : args)
{
sb.append("<fo:block font-family=\"SansSerif\">")
.append(arg)
.append("</fo:block>");
}
sb.append("</fo:table-cell>");
return sb.toString();
}
}
Когда я изменил кодировку с 'ISO-8859-1' в 'UTF-8' мой кириллицы подстроку выглядит следующим образом: «## ###». Кажется, я отсутствующими шрифтами здесь ..
Это похоже на многобайтовый UTF-8, который рассматривается как некоторая кодировка ISO/Windows по одному байту. Для остальных сделайте небольшой тест, например http://www.javaranch.com/journal/200409/CreatingMultipleLanguagePDFusingApacheFOP.html –
Возможно, это проблема с настройкой шрифта ([этот мой ответ] (http://stackoverflow.com/) a/28251945/4453460) могут быть полезны) или проблема с кодировкой. Добавление небольшого фрагмента FO с кириллическими символами может помочь получить ответ, поскольку в противном случае невозможно попытаться воспроизвести вашу проблему (см. [MCVE] (http://stackoverflow.com/help/mcve)). – lfurini
Я добавил фрагмент кода выше, чтобы показать, как я генерирую pdf-контент – user1053031