Пожалуйста, прекратите использовать HTMLWorker
, как многократно повторялось в StackOverflow, класс HTMLWorker
был оставлен в пользу XML Worker давным-давно. Мы не будем инвестировать в дальнейшее развитие HTMLWorker
, поэтому использовать его очень плохо. Перейдите к XML Worker.
Также обновите до последней версии iText, версию, которую вы используете в датах с 4 февраля 2011 г. , за 4 года исправлено множество ошибок Прошло. Убедитесь, что у вас есть как контейнер iText, так и баннер XML Worker с тем же номером версии.
Изображения Base64 еще не поддерживаются, но я сделал вам очень простое доказательство концепции, показывая, насколько легко это заключается в добавлении поддержки для таких изображений. Взгляните на пример ParseHtml4 и полученный PDF: html_4.pdf .
Для этого вам нужно написать реализацию ImageProvider
. Я сделал это, расширив класс AbstractImageProvider
:
class Base64ImageProvider extends AbstractImageProvider {
@Override
public Image retrieve(String src) {
int pos = src.indexOf("base64,");
try {
if (src.startsWith("data") && pos > 0) {
byte[] img = Base64.decode(src.substring(pos + 7));
return Image.getInstance(img);
}
else {
return Image.getInstance(src);
}
} catch (BadElementException ex) {
return null;
} catch (IOException ex) {
return null;
}
}
@Override
public String getImageRootPath() {
return null;
}
}
Как вы можете видеть, я проверяю существование "base64,"
в том, что передается XML-работнику через атрибут src
тег img
. Если присутствует String
, я расшифровываю все, что следует за "base64,"
, и я возвращаю объект Image
, который создается с помощью результирующих байтов.
После того, как вы создали эту реализацию ImageProvider
, это только вопрос передачи его XML-работнику.
Ваш Пользовательский контроллер должен иметь
public class UserController : Controller {
public ActionResult Index(string domain, string username) { return View(); }
}
, Эти две переменные на Индексном методе пользовательского контроллера подняты с маршрута.
MapRoute()
дополнительный метод более чем Routes.Add()
. Используйте MapRoute()
, если Вы не должны делать что-то более сложное, чем оно позволяет.
Маршруты оценены в порядке, они определяются, таким образом, они Вы звонили сначала.
Пользуйтесь!
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"User",
"User/{domain}/{username}",
new { controller = "User", action = "Index", username= UrlParameter.Optional }
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}