Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * {{{ header & license
   * Copyright (c) 2006 Wisconsin Court System
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public License
   * as published by the Free Software Foundation; either version 2.1
   * of the License, or (at your option) any later version.
   *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
  * GNU Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  * }}}
  */
 package org.xhtmlrenderer.pdf;
 
 import java.awt.Shape;
 import java.io.File;
 import java.io.Writer;
 import java.util.List;
 
 
 
 
 
 public class ITextRenderer {
     // These two defaults combine to produce an effective resolution of 96 px to the inch
     private static final float DEFAULT_DOTS_PER_POINT = 20f * 4f / 3f;
     private static final int DEFAULT_DOTS_PER_PIXEL = 20;
     
     private SharedContext _sharedContext;
     private ITextOutputDevice _outputDevice;
     
     private Document _doc;
     private BlockBox _root;
     
     private float _dotsPerPoint;
     
     private com.lowagie.text.Document _pdfDoc;
     private PdfWriter _writer;
     
     private PDFEncryption _pdfEncryption;
 
     // note: not hard-coding a default version in the _pdfVersion field as this may change between iText releases
     // check for null before calling writer.setPdfVersion()
     // use one of the values in PDFWriter.VERSION...
     private Character _pdfVersion;
 
     private char[] validPdfVersions = new char[]{
             .,
             .,
             .,
             .,
             .,
             .
     };
 
     private PDFCreationListener _listener;
    public ITextRenderer() {
    }
    
    public ITextRenderer(float dotsPerPointint dotsPerPixel) {
         = dotsPerPoint;
        
        
        ITextUserAgent userAgent = new ITextUserAgent();
         = new SharedContext(userAgent);
        userAgent.setSharedContext();
        
        ITextFontResolver fontResolver = new ITextFontResolver();
        .setFontResolver(fontResolver);
        
        ITextReplacedElementFactory replacedElementFactory = 
            new ITextReplacedElementFactory();
        .setReplacedElementFactory(replacedElementFactory);
        
        .setDotsPerPixel(dotsPerPixel);
        .setPrint(true);
        .setInteractive(false);
    }
    
    }
    
    private Document loadDocument(final String uri) {
        return .getUac().getXMLResource(uri).getDocument();
    }
    
    public void setDocument(String uri) {
        setDocument(loadDocument(uri), uri);
    }
    
    public void setDocument(Document docString url) {
        setDocument(docurlnew XhtmlNamespaceHandler());
    }
    public void setDocument(File file)
            throws IOException {
        
        File parent = file.getAbsoluteFile().getParentFile();
        setDocument(
                loadDocument(file.toURI().toURL().toExternalForm()),
                (parent == null ? "" : parent.toURI().toURL().toExternalForm())
        );
    }
    public void setDocumentFromString(String content) {
        InputSource is = new InputSource(new BufferedReader(new StringReader(content)));
        Document dom = XMLResource.load(is).getDocument();
        setDocument(domnull);
    }
    public void setDocument(Document docString urlNamespaceHandler nsh) {
         = doc;
        
        
        .reset();
        if (Configuration.isTrue("xr.cache.stylesheets"true)) {
            .getCss().flushStyleSheets();
        } else {
            .getCss().flushAllStyleSheets();
        }
        .setBaseURL(url);
                .getNamespaceHandler(), 
                docnew NullUserInterface());
    }
    public PDFEncryption getPDFEncryption() {
        return ;
    }
    public void setPDFEncryption(PDFEncryption pdfEncryption) {
         = pdfEncryption;
    }
    public void setPDFVersion(char _v) {
        for (int i = 0; i < .i++) {
            if (_v == [i]) {
                 = new Character(_v);
                return;
            }
        }
        throw new IllegalArgumentException("Invalid PDF version character; use " +
                "valid constants from PdfWriter (e.g. PdfWriter.VERSION_1_2)");
    }
    public char getPDFVersion() {
        return  == null ? '0' : .charValue();
    }
    public void layout() {
        LayoutContext c = newLayoutContext();
        BlockBox root = BoxBuilder.createRootBox(c);
        root.setContainingBlock(new ViewportBox(getInitialExtents(c)));
        root.layout(c);
        Dimension dim = root.getLayer().getPaintingDimension(c);
        root.getLayer().trimEmptyPages(cdim.height);
        root.getLayer().layoutPages(c);
         = root;
    }
    
        PageBox first = Layer.createPageBox(c"first");
        
        return new Rectangle(0, 0, first.getContentWidth(c), first.getContentHeight(c));
    }
    
        result.setFontContext(new ITextFontContext());
        
        
        result.setOutputDevice();
        
        
        result.setRootLayer(.getLayer());
        return result;
    }
    private LayoutContext newLayoutContext() {
        result.setFontContext(new ITextFontContext());
        
        
        return result;
    }
    
    public void createPDF(OutputStream osthrows DocumentException {
        createPDF(ostrue, 0);
    }
    
    public void writeNextDocument() throws DocumentException {
        writeNextDocument(0);
    }
    
    public void writeNextDocument(int initialPageNothrows DocumentException {
        List pages = .getLayer().getPages();
        
        RenderingContext c = newRenderingContext();
        c.setInitialPageNo(initialPageNo);
        PageBox firstPage = (PageBox)pages.get(0);
        com.lowagie.text.Rectangle firstPageSize = new com.lowagie.text.Rectangle(
                0, 0, 
                firstPage.getWidth(c) / 
                firstPage.getHeight(c) / );
        
        
        .setPageSize(firstPageSize);
        .newPage();  
        
        writePDF(pagescfirstPageSize);
    }
    
    public void finishPDF() {
        if ( != null) {
            fireOnClose();
            .close();
        }
    }
    
    public void createPDF(OutputStream osboolean finishthrows DocumentException {
        createPDF(osfinish, 0);
    }
    
    
NOTE: Caller is responsible for cleaning up the OutputStream if something goes wrong.
    public void createPDF(OutputStream osboolean finishint initialPageNothrows DocumentException {
        List pages = .getLayer().getPages();
        
        RenderingContext c = newRenderingContext();
        c.setInitialPageNo(initialPageNo);
        PageBox firstPage = (PageBox)pages.get(0);
        com.lowagie.text.Rectangle firstPageSize = new com.lowagie.text.Rectangle(
                0, 0, 
                firstPage.getWidth(c) / 
                firstPage.getHeight(c) / );
        
        com.lowagie.text.Document doc = 
            new com.lowagie.text.Document(firstPageSize, 0, 0, 0, 0);
        PdfWriter writer = PdfWriter.getInstance(docos);
        if ( != null) {
            writer.setPdfVersion(.charValue());
        }
        if ( != null) {
            writer.setEncryption(
                    .getUserPassword(), .getOwnerPassword(),
                    .getAllowedPrivileges(), .getEncryptionType());
        }
         = doc;
         = writer;
        firePreOpen();
        doc.open();
        
        writePDF(pagescfirstPageSizedocwriter);
        
        if (finish) {
            fireOnClose();
            doc.close();
        }
    }
    
    private void firePreOpen() {
        if ( != null) {
            .preOpen(this);
        }
    }
    private void fireOnClose() {
        if ( != null) {
            .onClose(this);
        }
    }
    private void writePDF(List pagesRenderingContext ccom.lowagie.text.Rectangle firstPageSizecom.lowagie.text.Document docPdfWriter writerthrows DocumentException {
        .setRoot();
        
        .start();
        .setWriter(writer);
        .initializePage(writer.getDirectContent(), firstPageSize.getHeight());
        
        
        int pageCount = .getLayer().getPages().size();
        c.setPageCount(pageCount);
        for (int i = 0; i < pageCounti++) {
            PageBox currentPage = (PageBox)pages.get(i);
            c.setPage(icurrentPage);
            paintPage(cwritercurrentPage);
            .finishPage();
            if (i != pageCount - 1) {
                PageBox nextPage = (PageBox)pages.get(i+1);
                com.lowagie.text.Rectangle nextPageSize = new com.lowagie.text.Rectangle(
                        0, 0, 
                        nextPage.getWidth(c) / 
                        nextPage.getHeight(c) / );
                doc.setPageSize(nextPageSize);
                doc.newPage();
                .initializePage(
                        writer.getDirectContent(), nextPageSize.getHeight());
            }
        }
        
        .finish(c);
    }
    
    private void paintPage(RenderingContext cPdfWriter writerPageBox page) {
        provideMetadataToPage(writerpage);
        
        page.paintBackground(c, 0, .);
        page.paintMarginAreas(c, 0, .);        
        page.paintBorder(c, 0, .);
        
        Shape working = .getClip();
        
        Rectangle content = page.getPrintClippingBounds(c);
        .clip(content);
        
        int top = -page.getPaintingTop() + 
            page.getMarginBorderPadding(c.);
        
        int left = page.getMarginBorderPadding(c.);
        
        .translate(lefttop);
        .getLayer().paint(c);
        .translate(-left, -top);
        
        .setClip(working);
    }
    
    private void provideMetadataToPage(PdfWriter writerPageBox page) {
        byte[] metadata = null;
        if (page.getMetadata() != null) {
            try {
                String metadataBody = stringfyMetadata(page.getMetadata());
                if (metadataBody != null) {
                    metadata = createXPacket(stringfyMetadata(page.getMetadata())).getBytes("UTF-8");
                }
            } catch (UnsupportedEncodingException e) {
                // Can't happen
                throw new RuntimeException(e);
            }
        }
        
        writer.setPageXmpMetadata(metadata);
    }
    private String stringfyMetadata(Element element) {
        Element target = getFirstChildElement(element);
        if (target == null) {
            return null;
        }
        
        try {
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            transformer.setOutputProperty(."yes");
            StringWriter output = new StringWriter();
            transformer.transform(new DOMSource(target), new StreamResult(output));
            
            return output.toString();
        } catch (TransformerConfigurationException e) {
            // Things must be in pretty bad shape to get here so
            // rethrow as runtime exception
            throw new RuntimeException(e);
        } catch (TransformerException e) {
            throw new RuntimeException(e);
        }
    }
    
    private static Element getFirstChildElement(Element element) {
        Node n = element.getFirstChild();
        while (n != null) {
            if (n.getNodeType() == .) {
                return (Element)n;
            }
            n = n.getNextSibling();
        }
        return null;
    }
    
    private String createXPacket(String metadata) {
        StringBuffer result = new StringBuffer(metadata.length() + 50);
        result.append("<?xpacket begin='\uFEFF' id='W5M0MpCehiHzreSzNTczkc9d'?>\n");
        result.append(metadata);
        result.append("\n<?xpacket end='r'?>");
        
        return result.toString();
    }
    
        return ;
    }
    
    public SharedContext getSharedContext() {
        return ;
    }
    
    public void exportText(Writer writerthrows IOException {
        RenderingContext c = newRenderingContext();
        c.setPageCount(.getLayer().getPages().size());
        .exportText(cwriter);
    }
    
    public BlockBox getRootBox() {
        return ;
    }
    
    public float getDotsPerPoint() {
        return ;
    }
    
    public List findPagePositionsByID(Pattern pattern) {
        return .findPagePositionsByID(newLayoutContext(), pattern);
    }
    private static final class NullUserInterface implements UserInterface {
        public boolean isHover(Element e) {
            return false;
        }
        public boolean isActive(Element e) {
            return false;
        }
        public boolean isFocus(Element e) {
            return false;
        }
    }
    public PDFCreationListener getListener() {
        return ;
    }
    public void setListener(PDFCreationListener listener) {
         = listener;
    }
    
    public PdfWriter getWriter() {
        return ;
    }
New to GrepCode? Check out our FAQ X