在http://my.oschina.net/yifanxiang/blog/678139中。修改了一下代码如下:
/**
* 生成单页pdf
* @param ctx
* @return
* @throws DocumentException
* @throws IOException
*/
public static byte[] buildPdf(String ctx) throws DocumentException, IOException{
ByteArrayOutputStream baos=new ByteArrayOutputStream(1024);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, baos);
writer.setInitialLeading(12);//文字间距
document.open();
HtmlToPdfUtil.MyFontsProvider fontProvider = new HtmlToPdfUtil.MyFontsProvider();
fontProvider.addFontSubstitute("lowagie", "garamond");
fontProvider.setUseUnicode(true);
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
DefaultTagProcessorFactory tpf=(DefaultTagProcessorFactory)Tags.getHtmlTagProcessorFactory();
tpf.addProcessor(Tag.IMG, Image.class.getName());//默认是com.itextpdf.tool.xml.html.Image|自个定义一个image的处理类
htmlContext.setTagFactory(tpf);
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);
ByteArrayInputStream bais=new ByteArrayInputStream(ctx.getBytes());
p.parse(new InputStreamReader(bais));
p.flush();
document.close();
byte[] result=baos.toByteArray();
baos.flush();
baos.close();
return result;
}
主要就是以下两句:
DefaultTagProcessorFactory tpf=(DefaultTagProcessorFactory)Tags.getHtmlTagProcessorFactory();
tpf.addProcessor(Tag.IMG, Image.class.getName());//默认是com.itextpdf.tool.xml.html.Image|自个定义一个image的处理类(这个Image是我自个定义的image)
自定义的Image类:
package com.junziqian.common.convert;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Element;
import com.itextpdf.text.log.Level;
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfString;
import com.itextpdf.text.xml.XMLUtil;
import com.itextpdf.tool.xml.NoCustomContextException;
import com.itextpdf.tool.xml.Tag;
import com.itextpdf.tool.xml.WorkerContext;
import com.itextpdf.tool.xml.css.CssUtils;
import com.itextpdf.tool.xml.exceptions.LocaleMessages;
import com.itextpdf.tool.xml.exceptions.RuntimeWorkerException;
import com.itextpdf.tool.xml.html.AbstractTagProcessor;
import com.itextpdf.tool.xml.html.HTML;
import com.itextpdf.tool.xml.net.ImageRetrieve;
import com.itextpdf.tool.xml.net.exc.NoImageException;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
public class Image extends AbstractTagProcessor {
private final CssUtils utils = CssUtils.getInstance();
private static final Logger logger = LoggerFactory.getLogger(Image.class);
/*
* (non-Javadoc)
*
* @see
* com.itextpdf.tool.xml.TagProcessor#endElement(com.itextpdf.tool.xml.Tag,
* java.util.List, com.itextpdf.text.Document)
*/
@Override
public List<Element> end(final WorkerContext ctx, final Tag tag, final List<Element> currentContent) {
Map<String, String> attributes = tag.getAttributes();
String src = attributes.get(HTML.Attribute.SRC);
com.itextpdf.text.Image img = null;
List<Element> l = new ArrayList<Element>(1);
if (null !