2013-03-07 12 views
14

У меня есть html-страница с текстом, изображением, и я разбираю содержимое HTML в iText для создания PDF-файла. В сгенерированном PDF-изображении изображения не отображаются, и отображается только текст.iText - HTML to PDF - Изображение не отображается в PDF

Если я пройду по абсолютной траектории, как D: /Deiva/CRs/HTMLPage/article-101-horz.jpg, тогда изображение будет напечатано. Но если я пытаюсь напечатать изображение с сервера, как

http://localhost:8085/content/dam/article-101-h1.jpg or http://www.google.co.in/intl/en_ALL/images/logos/images_logo_lg.gif

тогда он не получает напечатан в формате PDF.

Примечание: Я использую itextpdf-5.2.1.jar для создания PDF.

Мой HTML код (article.html):

<html> 
    <head> 
    </head> 
    <body> 
    <p>Generate PDF with image using iText.</p> 
    <img src="http://localhost:8085/content/dam/article-10-h1.jpg"></img> 
    <img src="http://www.google.co.in/intl/en_ALL/images/logos/imgs_logo_lg.gif"></img> 
    <img class="right horz" src="D:/Deiva/CRs/HTMLPage/article-101-horz.jpg"></img> 
    </body> 
</html> 

Я использую следующий код Java для генерации PDF:

private void createPDF(){ 

    String path = "D:/Deiva/Test.pdf"; 
    PdfWriter pdfWriter = null; 

    //create a new document 
    Document document = new Document(); 

    try { 

    //get Instance of the PDFWriter 
    pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(path)); 

    //document header attributes 
    document.addAuthor("betterThanZero"); 
    document.addCreationDate(); 
    document.addProducer(); 
    document.addCreator("MySampleCode.com"); 
    document.addTitle("Demo for iText XMLWorker"); 
    document.setPageSize(PageSize.LETTER); 

    //open document 
    document.open(); 
    InputStream is = new    FileInputStream("D:/Deiva/CRs/Oncology/Phase5/CR1/HTMLPage/Article.html"); 

    // create new input stream reader 
    InputStreamReader isr = new InputStreamReader(is); 

    //get the XMLWorkerHelper Instance 
    XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); 
    //convert to PDF 
    worker.parseXHtml(pdfWriter, document, isr); 

    //close the document 
    document.close(); 
    //close the writer 
    pdfWriter.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

Просьба предложить решение для отображения изображение в формате PDF.

Заранее благодарен.

Деива

ответ

1

Попробуйте получить изображение в объект памяти или байтовый поток, а затем отливал этот объект изображения к изображению одного itextsharp.

исследовать перегруженные iTextSharp.text.Image

EDIT:

Хотя код на C#, это может помочь вам.

Получить изображение с локального диска, как:

Bitmap image1; 
image1 = new Bitmap(@"C:\Documents and Settings\All Users\" 
      + @"Documents\My Music\music.jpeg", true); 

Примечание:: Если у вас есть изображение на папку приложения, то есть функции, чтобы получить локальный путь к файлу из них в C#. Не знаю о Java. Изображения с внешнего сайта можно скачать как

System.Net.WebClient client = new WebClient(); 
client.DownloadFile(imageURL, localPathname); // look into java to get local path 

Теперь преобразовать этот поток байтов в объект изображения, как

MemoryStream imgMemoryStream = new MemoryStream(imgByteArray); 
Image myImage = Drawing.Image.FromStream(imgMemoryStream); 

Теперь acreate объект iTextSharp изображения из него и добавить его в doucment в

iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance(myImage, System.Drawing.Imaging.ImageFormat.Jpeg); 
document.Add(pic); 

Надеюсь, это вам поможет.

+0

Привет, Saksham, Спасибо за ваш ответ. У вас есть образец кода в java? Если у вас есть, пожалуйста, поделитесь этим кодом. Это поможет мне закончить эту задачу как можно скорее. – Deiva

+0

Извините. Я работаю над C# – Saksham

+0

@ Надеюсь, это поможет вам. – Saksham

3

Я думаю, вы можете сделать это легко, используя сервлет для просмотра изображения.Как написать сервлет для этого - here

Здесь вы можете найти образец диспетчера. Просто измените необходимые места при необходимости

@Controller 
public class ImageController extends DispatcherServlet { 



    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB. 

    // Properties --------------------------------------------------------------------------------- 

    private String imagePath; 

    @RequestMapping(value="images/{imageId:.+}", method = RequestMethod.GET) 
    public @ResponseBody void getImage(@PathVariable String imageId,HttpServletRequest request, HttpServletResponse response){ 
     String requestedImage = request.getPathInfo(); 
     this.imagePath ="image path in server here"; 

     if (requestedImage == null) { 
      // Do your thing if the image is not supplied to the request URI. 
      // Throw an exception, or send 404, or show default/warning image, or just ignore it. 
      try { 
       response.sendError(HttpServletResponse.SC_NOT_FOUND); 
      }catch(IOException ioException){ 
       logger.error("error image path incorrect:{}", ioException); 

      } // 404. 
      return; 
     } 

     File image=null; 
     try { 
      image = new File(imagePath, URLDecoder.decode(imageId, "UTF-8")); 
     } catch (UnsupportedEncodingException unsupportedEncodingException) { 
      logger.error("error image can not decode:{}", unsupportedEncodingException); 

     } 

     // Check if file actually exists in filesystem. 
     if (!image.exists()) { 
      // Do your thing if the file appears to be non-existing. 
      // Throw an exception, or send 404, or show default/warning image, or just ignore it. 
      try { 
       response.sendError(HttpServletResponse.SC_NOT_FOUND); 
      }catch(IOException ioException){ 
       logger.error("error image does not exists:{}", ioException); 

      } // 404. 
      return; 
     } 

     // Get content type by filename. 
     String contentType = "jpeg"; 
     contentType="image/"+contentType; 

     // Init servlet response. 
     response.reset(); 
     response.setBufferSize(DEFAULT_BUFFER_SIZE); 
     response.setContentType(contentType); 
     response.setHeader("Content-Length", String.valueOf(image.length())); 
     response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\""); 

     // Prepare streams. 
     BufferedInputStream input = null; 
     BufferedOutputStream output = null; 

     try { 
      // Open streams. 
      try { 
       input = new BufferedInputStream(new FileInputStream(image), DEFAULT_BUFFER_SIZE); 
      } catch (FileNotFoundException e) { 

       logger.error("error creating file input stream to the image file :{}", e); 


      } 
      try { 

       output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE); 

      } catch (IOException e) { 


       logger.error("error creating output stream to the http response :{}", e); 

      } 

      // Write file contents to response. 
      byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
      int length; 
      try { 
       while ((length = input.read(buffer)) > 0) { 
        output.write(buffer, 0, length); 
       } 
      } catch (IOException e) { 

       logger.error("error writing the image file to outputstream :{}", e); 

      } 
     } finally { 
      // Gently close streams. 
      close(output); 
      close(input); 
     } 
    } 

    // Helpers (can be refactored to public utility class) ---------------------------------------- 




private void close(Closeable resource) { 
    if (resource != null) { 
     try { 
      resource.close(); 
     } catch (IOException e) { 
      // Do your thing with the exception. Print it, log it or mail it. 
      logger.error("error closing resources:{}", e); 
     } 
    } 
} 




} 
+0

Это даже близко к жизнеспособному ответу! Давай, пример, ссылки и т. Д. !! : D – christopher

+0

@ Крис: Я столкнулся с той же проблемой и добился ее таким образом. Просто подумал, что это ему поможет. :) –

+0

Согласен, но я поставил щедрость, потому что это вопрос, который в основном остался без ответа здесь, и если вы хотите получить награду, можете ли вы показать ее более подробно. – christopher

0

Я также столкнулся с тем же вопросом ..

, но она работает с изображением абсолютного путем. кажется, не работает с удаленным путем. Какой идентификатор сделал это, сохраните изображение в временном расположении файловой системы и создайте pdf, наконец, удалите файл изображения из временного местоположения.

<img src="/home/jboss/temp/imgs/img.png"/> 
3

показать изображение с IText, вы должны Изменение конфигурации по умолчанию об имидже Provider Нравится: я сделать это с http://demo.itextsupport.com/xmlworker/itextdoc/flatsite.html

public class HtmlToPDF1 { 
    public static void main(String ... args) throws DocumentException, IOException {  

     FontFactory.registerDirectories(); 
     Document document = new Document(); 
     PdfWriter writer = PdfWriter.getInstance(document, 
      new FileOutputStream("src/test/ressources/mypdf.pdf")); 
     document.open(); HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
     htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 
     htmlContext.setImageProvider(new AbstractImageProvider() { 
      public String getImageRootPath() { 
       return "/home/fallphenix/workspace/JAVA/JEE/testHTMLtoPDF/src/test/ressources/"; 
      } 
     }); CSSResolver cssResolver = 
      XMLWorkerHelper.getInstance().getDefaultCssResolver(true); 
     Pipeline<?> pipeline = 
      new CssResolverPipeline(cssResolver, 
        new HtmlPipeline(htmlContext, 
         new PdfWriterPipeline(document, writer))); 
     XMLWorker worker = new XMLWorker(pipeline, true); 
     XMLParser p = new XMLParser(worker); 
     p.parse(new FileInputStream("src/test/ressources/other.html")); 
     document.close(); 
      System.out.println("Done.");   
    }} 
+0

Я использую проект maven. –

3

Вот некоторые примеры: https://developers.itextpdf.com/examples/xml-worker-itext5/html-images

htmlContext.setImageProvider(new AbstractImageProvider() { 
    public String getImageRootPath() { return "src/main/resources/html/"; } 
}); 

Если файл HTML, который вы обрабатываете, хранится в каталоге, отличном от рабочего каталога, iText не сможет создать Im возрастных объектов. Мы должны предоставить реализацию интерфейса ImageProvider, который сообщает iText, что делать, если встречается тег img. Этот интерфейс имеет следующие методы:

Image retrieve(final String src); 
String getImageRootPath(); 
void store(String src, Image img); 
void reset(); 

Вы можете написать свой собственный класс, реализующий эти четыре метода, или вы можете создать подкласс AbstractImageProvider. Предпочтительно использовать последний. XML Worker будет использовать метод store() класса AbstractImageProvider для кэширования всех объектов Image, которые встречаются на карте. Эти объекты будут повторно использоваться, когда метод retrieve() вызывается для изображения с тем же src. Если вы не кэшируете изображения, ваш PDF будет раздутым. Один и тот же бит и байты изображения будут записываться в PDF более одного раза. Метод reset() очищает кеш; он используется при клонировании ImageProvider. Наконец, метод getImageRootPath() не реализован.

Если файл HTML, обрабатываемый вами, хранится в каталоге, отличном от рабочего каталога, iText не сможет создавать объекты изображения. Мы должны предоставить реализацию интерфейса ImageProvider, который сообщает iText, что делать, если встречается тег img. Этот интерфейс имеет следующие методы:

Вы можете написать свой собственный класс, реализующий эти четыре метода, или вы можете подклассифицировать AbstractImageProvider. Предпочтительно использовать последний. XML Worker будет использовать метод store() класса AbstractImageProvider для кэширования всех объектов Image, которые встречаются на карте. Эти объекты будут повторно использоваться, когда метод retrieve() вызывается для изображения с тем же src. Если вы не кэшируете изображения, ваш PDF будет раздутым. Один и тот же бит и байты изображения будут записываться в PDF более одного раза. Метод reset() очищает кеш; он используется при клонировании ImageProvider. Наконец, метод getImageRootPath() не реализован. Вы должны реализовать его самостоятельно, как это делается в следующем фрагменте:

+0

htmlContext.setImageProvider (новый AbstractImageProvider() { общественности Строка getImageRootPath() { возвращение "SRC/главная/ресурсы/html /"; } }); –

Смежные вопросы