PrinceXML: ввод не является правильным UTF-8

Я создаю HTML из базы данных, а затем отправляю его в PrinceXML для преобразования в PDF. Код, который я использую для этого:

string _htmlTemplate = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><html lang=""en-GB"" xml:lang=""en-GB"" xmlns=""http://www.w3.org/1999/xhtml""><head><meta http-equiv=""Content-type"" content=""text/html;charset=UTF-8"" /><title>Generated PDF Contract</title></head><body>{0}</body></html>";

string _pgeContent = string.Format(_htmlTemplate, sb.ToString());
writer.Write(sb.ToString());
Byte[] arrBytes = UTF8Encoding.Default.GetBytes(_pgeContent);
Stream s = new MemoryStream(arrBytes);

Prince princeConverter = new Prince(ConfigurationManager.AppSettings["PrinceXMLInstallLoc"].ToString());
princeConverter.SetLog(ConfigurationManager.AppSettings["PrinceXMLLogLoc"]);
princeConverter.AddStyleSheet(Server.MapPath(ConfigurationManager.AppSettings["FormsDocGenCssLocl"]));
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.BufferOutput = true;

Однако преобразование завершается ошибкой:

Ввод не соответствует UTF-8, укажите кодировку! Байты: 0xA0 0x77 0x65 0x62

Я взял сгенерированный html и загрузил его в валидатор W3C. Он проверяет разметку как XHTML 1.0 Transitional в кодировке UTF-8 без ошибок или предупреждений.

Я также тщательно просмотрел файл в поисках недопустимых символов. Пока ничего.

Может ли кто-нибудь предложить что-то еще, что я мог бы попробовать?


person indra    schedule 17.11.2010    source источник
comment
Да, преобразовать поток в UTF-8, как предлагается в сообщении об ошибке.   -  person Darin Dimitrov    schedule 17.11.2010
comment
@DarinDimitrov Разве тот факт, что валидатор W3c анализирует его как действительный XHTML в кодировке UTF-8, не означает, что это является UTF-8 ? Или я что-то упускаю...?   -  person indra    schedule 17.11.2010


Ответы (1)


Ну, после дня бормотания проклятий и вырывания того, что осталось от моих волос, я нашел решение для моей конкретной проблемы.

Похоже, что System.Text.UTF8Encoding по умолчанию не выводит байт идентификатора UTF-8. Поэтому в моем случае мне нужно было использовать конструктор, который принимает логический параметр для управления выводом этого.

UTF8Encoding u8enc = new UTF8Encoding(true);//Ensures a UTF8 identifier is emitted.

После этого все было хорошо. Надеюсь, это поможет кому-то :-)

person indra    schedule 18.11.2010
comment
Немного неважно, но поддерживает ли Prince переходный тип документа XHTML, который вы там использовали? - person user961627; 28.01.2013