我有文字,图像的HTML页面,我解析HTML内容的iText生成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显示图像。
提前致谢。
德瓦玛丽娜
Answer 1:
我想,你可以很容易地使用一个Servlet观看图像做。 如何写一个servlet因为这是这里
这里为您样品调度。 根据需要,只要编辑所需要的地方
@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);
}
}
}
}
Answer 2:
下面是一些例子: https://developers.itextpdf.com/examples/xml-worker-itext5/html-images
htmlContext.setImageProvider(new AbstractImageProvider() {
public String getImageRootPath() { return "src/main/resources/html/"; }
});
如果你解析HTML文件存储在一个目录,它是从工作目录不同,iText的将无法创建图像对象。 我们必须提供ImageProvider界面,告诉iText的,如果遇到img标签做什么的实现。 这个接口有以下方法:
Image retrieve(final String src);
String getImageRootPath();
void store(String src, Image img);
void reset();
你可以写自己的类实现这四个方法,或者你也可以继承AbstractImageProvider。 优选的是,选择后者。 XML工人将使用AbstractImageProvider类的店()方法来缓存在一个地图中遇到的所有图像对象。 当检索()方法被调用用于与相同的src的图像这些对象将被重新使用。 如果你不缓存图像,您的PDF将是臃肿。 相同的图像比特和字节将被写入到PDF不止一次。 复位()方法清除缓存; 当ImageProvider克隆就使用它。 最后,getImageRootPath()方法未实现。
如果你解析HTML文件存储在一个目录,它是从工作目录不同,iText的将无法创建图像对象。 我们必须提供ImageProvider界面,告诉iText的,如果遇到img标签做什么的实现。 这个接口有以下方法:
你可以写自己的类实现这四个方法,或者你也可以继承AbstractImageProvider。 优选的是,选择后者。 XML工人将使用AbstractImageProvider类的店()方法来缓存在一个地图中遇到的所有图像对象。 当检索()方法被调用用于与相同的src的图像这些对象将被重新使用。 如果你不缓存图像,您的PDF将是臃肿。 相同的图像比特和字节将被写入到PDF不止一次。 复位()方法清除缓存; 当ImageProvider克隆就使用它。 最后,getImageRootPath()方法未实现。 你必须自己实现它,如下面的代码片段完成:
Answer 3:
显示与iText的图像,你必须改变有关Image提供商喜欢它的默认配置:我做到这一点从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.");
}}
Answer 4:
尝试获取图像到存储器或字节流对象,然后浇铸该图像对象到iTextSharp的图像之一。
探索的重载iTextSharp.text.Image
编辑:
尽管代码是在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);
希望这可以帮助你。
Answer 5:
我也面临着同样的以问题..
但它与图像的绝对路径的工作。 似乎不能与远程路径工作。 什么ID在这里做的是保存图像文件系统的临时位置,并生成PDF,最后删除临时位置的图像文件。
<img src="/home/jboss/temp/imgs/img.png"/>
文章来源: iText – HTML to PDF - Image is not displayed in PDF