modificar example crear con java itextsharp itext relative-path html-to-pdf

java - example - iText-HTML a PDF-La imagen no se muestra en PDF



itextsharp (5)

Aquí hay algunos ejemplos: https://developers.itextpdf.com/examples/xml-worker-itext5/html-images

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

Si el archivo HTML que está analizando está almacenado en un directorio que es diferente del directorio de trabajo, iText no podrá crear objetos de imagen. Tenemos que proporcionar una implementación de la interfaz ImageProvider que le indique a iText qué hacer si se encuentra una etiqueta img. Esta interfaz tiene los siguientes métodos:

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

Puede escribir su propia clase implementando estos cuatro métodos, o puede subclase AbstractImageProvider. Se prefiere hacer lo último. XML Worker utilizará el método store () de la clase AbstractImageProvider para almacenar en caché todos los objetos de imagen que se encuentran en un mapa. Estos objetos se reutilizarán cuando se llame al método retrieve () para una imagen con el mismo src. Si no almacena imágenes en caché, su PDF se hinchará. Los mismos bits y bytes de la imagen se escribirán en el PDF más de una vez. El método reset () borra el caché; se utiliza cuando se clona un ImageProvider. Finalmente, el método getImageRootPath () no está implementado.

Si el archivo HTML que está analizando está almacenado en un directorio que es diferente del directorio de trabajo, iText no podrá crear objetos de imagen. Tenemos que proporcionar una implementación de la interfaz ImageProvider que le indique a iText qué hacer si se encuentra una etiqueta img. Esta interfaz tiene los siguientes métodos:

Puede escribir su propia clase implementando estos cuatro métodos, o puede subclase AbstractImageProvider. Se prefiere hacer lo último. XML Worker utilizará el método store () de la clase AbstractImageProvider para almacenar en caché todos los objetos de imagen que se encuentran en un mapa. Estos objetos se reutilizarán cuando se llame al método retrieve () para una imagen con el mismo src. Si no almacena imágenes en caché, su PDF se hinchará. Los mismos bits y bytes de la imagen se escribirán en el PDF más de una vez. El método reset () borra el caché; se utiliza cuando se clona un ImageProvider. Finalmente, el método getImageRootPath () no está implementado. Debe implementarlo usted mismo, como se hace en el siguiente fragmento de código:

Tengo una página html con texto, imagen y estoy analizando el contenido HTML a iText para generar el PDF. En el PDF generado, las imágenes incluidas no se muestran y solo se muestra el texto.

Si paso la ruta absoluta como D: /Deiva/CRs/HTMLPage/article-101-horz.jpg , la imagen se imprimirá. Pero si intento imprimir la imagen del servidor como

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

entonces no se está imprimiendo en el PDF.

NOTA: Lo estoy usandoextpdf-5.2.1.jar para generar el PDF.

Mi código 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>

Estoy usando el siguiente código java para generar el 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(); } }

Por favor, sugiera una solución para mostrar la imagen en PDF.

Gracias por adelantado.

Deiva


Creo que puedes hacerlo fácilmente usando un Servlet para ver la imagen. Cómo escribir un servlet para esto está here

Aquí un despachador de muestras para usted. Solo edite los lugares requeridos como sea necesario

@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); } } } }


Intente colocar la imagen en una memoria o en un objeto de flujo de bytes y luego convierta ese objeto de imagen en una imagen de itextsharp.

explorar las sobrecargas de iTextSharp.text.Image

EDITAR:

Aunque el código está en C #, podría ayudarte.

Obtenga imagen de su disco local como:

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

Nota:: Si tiene la imagen en la carpeta de su aplicación, tenemos funciones para obtener la ruta del archivo local en C #. No sé sobre Java. Las imágenes del sitio externo se pueden descargar como

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

Ahora convierta este flujo de bytes a un objeto de imagen como

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

Ahora cree un objeto de imagen iTextSharp desde él y agréguelo a su sitio como

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

Espero que esto te ayude.


También me enfrenté al mismo problema ..

Pero estaba trabajando con el camino absoluto de la imagen. Parece que no funciona con la ruta remota. La identificación que hice aquí es guardar la imagen en la ubicación temporal del sistema de archivos y genera el pdf, finalmente eliminar el archivo de imagen de la ubicación temporal.

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


para mostrar la imagen con Itext, tienes que cambiar la configuración predeterminada de Image Provider Me gusta: lo hago desde 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."); }}