Java Examples for com.itextpdf.text.pdf.PdfCopy

The following java examples will help you to understand the usage of com.itextpdf.text.pdf.PdfCopy. These source code samples are taken from different open source projects.

Example 1
Project: egd-web-master  File: PdfGenerator.java View source code
public static byte[] concatanatePDF(byte[] pdf1, byte[] pdf2) throws IOException, DocumentException {
    // näite järgi pdfide kokku panemine -- pole proovinud kas töötab
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    PdfReader reader = new PdfReader(pdf1);
    Document document = new Document(reader.getPageSizeWithRotation(1));
    PdfCopy copy = new PdfCopy(document, output);
    document.open();
    // esimene pdf lisatakse
    PdfImportedPage pdfImportedPage;
    for (int i = 0; i < reader.getNumberOfPages(); ) {
        ++i;
        pdfImportedPage = copy.getImportedPage(reader, i);
        copy.addPage(pdfImportedPage);
    }
    // teine pdf lisatakse
    reader = new PdfReader(pdf2);
    for (int i = 0; i < reader.getNumberOfPages(); ) {
        ++i;
        pdfImportedPage = copy.getImportedPage(reader, i);
        copy.addPage(pdfImportedPage);
    }
    document.close();
    return output.toByteArray();
}
Example 2
Project: preservation-tools-master  File: iTextRepairPdf.java View source code
/**
	 * Makes a copy from each PDF-file in the folder and puts it in the same
	 * folder with the prefix"Mig_iText"
	 * 
	 * @param takes
	 *            in PdfReader and the filename as a string
	 * @return: void
	 * 
	 */
@SuppressWarnings("rawtypes")
static void repairWithItext(PdfReader reader, File filename) throws DocumentException, IOException {
    Map<String, String> info = reader.getInfo();
    Document document = new Document();
    String filenameStr = filename.getName();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(examinedFolder + "//" + "Mig_iText" + filenameStr));
    int pdfVersion = filetools.pdf.PdfAnalysis.getPdfVersion(filename.toString());
    //TODO: But all the output PDF is PDF 1.4
    switch(pdfVersion) {
        case 2:
            copy.setPdfVersion(PdfWriter.PDF_VERSION_1_2);
            break;
        case 3:
            copy.setPdfVersion(PdfWriter.PDF_VERSION_1_3);
            break;
        case 4:
            copy.setPdfVersion(PdfWriter.PDF_VERSION_1_4);
            break;
        case 5:
            copy.setPdfVersion(PdfWriter.PDF_VERSION_1_5);
            break;
        case 6:
            copy.setPdfVersion(PdfWriter.PDF_VERSION_1_6);
            break;
        case 7:
            copy.setPdfVersion(PdfWriter.PDF_VERSION_1_7);
            break;
    }
    // Bruno's books
    if (info.get("Title") != null)
        document.addTitle((String) info.get("Title"));
    if (info.get("Author") != null)
        document.addAuthor((String) info.get("Author"));
    if (info.get("Keywords") != null)
        document.addKeywords((String) info.get("Keywords"));
    // TODO: Is this the right Keyword?
    if (info.get("Date") != null)
        document.addKeywords((String) info.get("Date"));
    copy.createXmpMetadata();
    document.open();
    int n = reader.getNumberOfPages();
    for (int i = 0; i < n; ) {
        copy.addPage(copy.getImportedPage(reader, ++i));
    }
    copy.freeReader(reader);
    document.close();
}
Example 3
Project: itextpdf-master  File: SmartPdfSplitter.java View source code
public boolean split(OutputStream os, long sizeInBytes) throws IOException, DocumentException {
    if (!hasMorePages()) {
        os.close();
        return false;
    }
    overSized = false;
    Document document = new Document();
    PdfCopy copy = new PdfSmartCopy(document, os);
    document.open();
    boolean hasPage = false;
    PdfResourceCounter counter = new PdfResourceCounter(reader.getTrailer());
    long trailer = counter.getLength(null);
    Map<Integer, PdfObject> resources = counter.getResources();
    long length = 0;
    long page;
    while (hasMorePages()) {
        counter = new PdfResourceCounter(reader.getPageN(currentPage));
        page = counter.getLength(resources);
        resources = counter.getResources();
        length += page + trailer + xrefLength(resources.size());
        LOGGER.info(String.format("Page %s: Comparing %s with %s", currentPage, length, sizeInBytes));
        LOGGER.info(String.format("   page %s trailer %s xref %s", page, trailer, xrefLength(resources.size())));
        if (!hasPage || length < sizeInBytes) {
            hasPage = true;
            copy.addPage(copy.getImportedPage(reader, currentPage));
            length = copy.getOs().getCounter();
            LOGGER.info(String.format("Size after adding page: %s", length));
            if (length > sizeInBytes)
                overSized = true;
            currentPage++;
        } else {
            LOGGER.info("Page doesn't fit");
            break;
        }
    }
    document.close();
    return true;
}
Example 4
Project: phresco-master  File: DocumentUtil.java View source code
/**
     * @param titleSection
     * @param pdfCopy
     * @throws IOException
     * @throws BadPdfFormatException
     */
public static void addPages(InputStream titleSection, PdfCopy pdfCopy) throws IOException, BadPdfFormatException {
    if (isDebugEnabled) {
        S_LOGGER.debug("Entering Method DocumentUtil.addPages(InputStream titleSection, PdfCopy pdfCopy)");
    }
    PdfReader reader = new PdfReader(titleSection);
    reader.consolidateNamedDestinations();
    int pages = reader.getNumberOfPages();
    for (int i = 1; i <= pages; i++) {
        PdfImportedPage importedPage = pdfCopy.getImportedPage(reader, i);
        pdfCopy.addPage(importedPage);
    }
    pdfCopy.freeReader(reader);
}
Example 5
Project: pdf-tools-master  File: PdfPermissionManager.java View source code
public static void merge(File output, List<File> inputFiles, ProgressDisplay progress) throws IOException, DocumentException {
    //$NON-NLS-1$
    progress.startTask(Messages.getString("PdfPermissionManager.Combine"), inputFiles.size(), true);
    FileOutputStream outputStream = null;
    PdfCopy copy = null;
    int pageCount = 0;
    try {
        Document document = new Document();
        outputStream = new FileOutputStream(output);
        copy = new PdfCopy(document, outputStream);
        document.open();
        int n = 0;
        for (File file : inputFiles) {
            if (progress.isCanceled()) {
                break;
            }
            progress.setNote(file.getName());
            FileInputStream inputStream = null;
            PdfReader reader = null;
            try {
                inputStream = new FileInputStream(file);
                reader = new PdfReader(inputStream);
                unlockReader(reader);
                for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                    if (progress.isCanceled()) {
                        break;
                    }
                    document.newPage();
                    pageCount++;
                    // import the page from source pdf
                    PdfImportedPage page = copy.getImportedPage(reader, i);
                    copy.addPage(page);
                }
            } finally {
                if (reader != null) {
                    reader.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
                progress.setProgress(++n);
            }
        }
        outputStream.flush();
        document.close();
    } finally {
        progress.endTask();
        // check if any page was written.
        if (copy != null && pageCount > 0) {
            copy.close();
        }
        if (outputStream != null) {
            outputStream.close();
        }
    }
}
Example 6
Project: wabacus-master  File: WabacusFacade.java View source code
private static void exportReportDataOnPDF(String pageid, ReportRequest rrequest, WabacusResponse wresponse) {
    boolean success = true;
    try {
        rrequest.setWResponse(wresponse);
        wresponse.setRRequest(rrequest);
        rrequest.init(pageid);
        if (rrequest.getLstAllReportBeans() == null || rrequest.getLstAllReportBeans().size() == 0) {
            throw new WabacusRuntimeException("导出页面" + pageid + "上的数据失败,plainexcel导出方式只能导出报表,不能导出其它应用");
        }
        Document document = new Document();
        ByteArrayOutputStream baosResult = new ByteArrayOutputStream();
        PdfCopy pdfCopy = new PdfCopy(document, baosResult);
        document.open();
        boolean ispdfprint = rrequest.isPdfPrintAction();
        for (IComponentConfigBean ccbeanTmp : rrequest.getLstComponentBeans()) {
            //依次导出配置有PDF模板的组件
            PDFExportBean pdfbeanTmp = null;
            if (ispdfprint) {
                pdfbeanTmp = ccbeanTmp.getPdfPrintBean();
            } else if (ccbeanTmp.getDataExportsBean() != null) {
                pdfbeanTmp = (PDFExportBean) ccbeanTmp.getDataExportsBean().getDataExportBean(Consts.DATAEXPORT_PDF);
            }
            if (pdfbeanTmp != null && pdfbeanTmp.getPdftemplate() != null && !pdfbeanTmp.getPdftemplate().trim().equals("")) {
                PdfAssistant.getInstance().addPdfPageToDocument(pdfCopy, PdfAssistant.getInstance().showReportDataOnPdfWithTpl(rrequest, ccbeanTmp));
            }
        }
        AbsReportType reportTypeObjTmp;
        for (ReportBean rbTmp : rrequest.getLstAllReportBeans()) {
            reportTypeObjTmp = (AbsReportType) rrequest.getComponentTypeObj(rbTmp, null, false);
            //如果当前报表是在某个有PDF模板的组件中导出,则不在这里导,而是在上面导出
            if (rrequest.isReportInPdfTemplate(rbTmp.getId()))
                continue;
            PdfAssistant.getInstance().addPdfPageToDocument(pdfCopy, reportTypeObjTmp.displayOnPdf());
        }
        document.close();
        BufferedOutputStream bos = null;
        if (rrequest.isExportToLocalFile()) {
            bos = new BufferedOutputStream(new FileOutputStream(new File(rrequest.getDataExportFilepath())));
        } else {
            if (!ispdfprint) {
                String title = WabacusAssistant.getInstance().encodeAttachFilename(rrequest.getRequest(), rrequest.getDataExportFilename());
                wresponse.getResponse().setHeader("Content-disposition", "attachment;filename=" + title + ".pdf");
            }
            wresponse.getResponse().setContentLength(baosResult.size());
            bos = new BufferedOutputStream(wresponse.getResponse().getOutputStream());
        }
        baosResult.writeTo(bos);
        bos.close();
        baosResult.close();
        if (rrequest.isExportToLocalFile() && rrequest.isDataexport_localstroagezip()) {
            tarDataFile(rrequest);
        }
    } catch (WabacusRuntimeTerminateException wrwe) {
        if (wresponse.getStatecode() == Consts.STATECODE_FAILED) {
            success = false;
        }
    } catch (Exception wre) {
        wresponse.setStatecode(Consts.STATECODE_FAILED);
        log.error("导出页面" + rrequest.getPagebean().getId() + "下的报表失败", wre);
        success = false;
    } finally {
        rrequest.destroy(success);
    }
    doPostDataExport(rrequest, wresponse);
}
Example 7
Project: jeboorker-master  File: PdfCropper.java View source code
@Override
public void crop(DocumentInfo pdfFile, File targetFile, PageRectsMap pageRectsMap, int viewWidth, int viewHeight, ProgressMonitor progressMonitor) throws IOException, DocumentException {
    IResourceHandler originalFile = pdfFile.getOriginalFile();
    HashMap<String, String> pdfInfo = pdfFile.getDocInfo();
    PdfReader reader1 = PDFUtils.getReader(originalFile.toFile());
    PdfReader reader2 = null;
    float normalizedPdfWidth = pdfFile.getNormalizedWidth();
    float normalizedPdfHeight = pdfFile.getNormalizedHeight();
    LoggerFactory.getLogger(PdfCropper.class).log(Level.INFO, "Finding ratio : viewSize " + viewWidth + "x" + viewHeight + ", pdf size " + normalizedPdfWidth + "x" + normalizedPdfHeight);
    double widthRatio = normalizedPdfWidth / viewWidth;
    double heightRatio = normalizedPdfHeight / viewHeight;
    if (widthRatio != heightRatio) {
        System.err.println("WARNING>>> RATION NOT SAME ?! " + widthRatio + " " + heightRatio);
    }
    Document document = null;
    PdfCopy writer = null;
    PdfStamper stamper = null;
    IResourceHandler tempFile = null;
    OutputStream tempFileOut = null;
    // open the original
    try {
        reader1.consolidateNamedDestinations();
        int originalPageCount = reader1.getNumberOfPages();
        document = new Document(reader1.getPageSizeWithRotation(1));
        tempFile = ResourceHandlerFactory.getTemporaryResource("tmp");
        writer = new PdfCopy(document, tempFileOut = tempFile.getContentOutputStream(false));
        document.open();
        PdfImportedPage page;
        int newPageCount = 0;
        for (int i = 0; i < originalPageCount; ) {
            ++i;
            ArrayList<java.awt.Rectangle> cropRects = pageRectsMap.getRects(i);
            int cropCellCount = 0;
            if (cropRects != null) {
                cropCellCount = cropRects.size();
            }
            if (cropCellCount == 0) {
                //we will assume there is one crop cell that covers the whole page
                cropCellCount = 1;
            }
            newPageCount += cropCellCount;
            for (int iCell = 0; iCell < cropCellCount; iCell++) {
                progressMonitor.setNote("Writing page " + ((i - 1) * cropCellCount + iCell) + " of " + newPageCount);
                progressMonitor.setProgress(i * 100 / originalPageCount);
                page = writer.getImportedPage(reader1, i);
                writer.addPage(page);
            }
        }
        document.close();
        document = null;
        reader2 = PDFUtils.getReader(tempFile.toFile());
        stamper = new PdfStamper(reader2, new FileOutputStream(targetFile));
        int pageCount = reader2.getNumberOfPages();
        newPageCount = 0;
        for (int iOriginalPage = 1; iOriginalPage <= originalPageCount; iOriginalPage++) {
            normalizedPdfHeight = (int) reader1.getPageSize(iOriginalPage).getHeight();
            ArrayList<java.awt.Rectangle> cropRectsInIPDFCoords = pageRectsMap.getConvertedRectsForCropping(iOriginalPage, viewWidth, viewHeight, normalizedPdfWidth, normalizedPdfHeight);
            int cropCellCount = 0;
            if (cropRectsInIPDFCoords != null) {
                cropCellCount = cropRectsInIPDFCoords.size();
            }
            if (cropCellCount == 0) {
                // we will still add one full page
                newPageCount++;
                LoggerFactory.getLogger(PdfCropper.class).log(Level.INFO, "Cropping page " + newPageCount + " ... full page size");
            } else {
                for (int i = 0; i < cropCellCount; ) {
                    ++i;
                    newPageCount++;
                    // http://stackoverflow.com/questions/4089757/how-do-i-resize-an-existing-pdf-with-coldfusion-itext
                    progressMonitor.setNote("Cropping page " + newPageCount + " of " + pageCount);
                    progressMonitor.setProgress(newPageCount * 100 / pageCount);
                    if (cropRectsInIPDFCoords != null) {
                        java.awt.Rectangle cropRect = cropRectsInIPDFCoords.get(i - 1);
                        applyCropToPage(reader2, newPageCount, cropRect);
                    }
                }
            }
        }
        // put the information, like author name etc.
        stamper.setMoreInfo(pdfInfo);
    } finally {
        if (document != null) {
            document.close();
        }
        if (stamper != null) {
            stamper.close();
        }
        if (reader1 != null) {
            reader1.close();
        }
        if (reader2 != null) {
            reader2.close();
        }
        if (writer != null) {
            writer.flush();
            writer.close();
        }
        IOUtils.closeQuietly(tempFileOut);
        if (tempFile != null) {
            tempFile.delete();
        }
    }
}
Example 8
Project: xtf-dsc-master  File: PipeFopElement.java View source code
/** 
     * Do the work of joining the FOP output and a PDF together. This involves
     * several steps:
     * 
     *  1. Based on parameters specified in the PipeFOP command, determine how
     *     the pages will overlap.
     *  2. Merge bookmarks and metadata
     *  3. Output the pages  
     */
private void mergePdf(XPathContext context, byte[] origPdfData, File fileToAppend, MergeMode mergeMode, MergeAt mergeAt, OutputStream outStream) throws IOException, DocumentException, BadPdfFormatException, XPathException {
    PdfReader[] readers = new PdfReader[2];
    HashMap<String, String>[] infos = new HashMap[2];
    int[] nInPages = new int[2];
    int[] pageOffsets = new int[2];
    int nOutPages = 0;
    // Read in the PDF that FOP generated and the one we're merging
    readers[0] = new PdfReader(origPdfData);
    readers[1] = new PdfReader(new BufferedInputStream(new FileInputStream(fileToAppend)));
    // Perform processing that's identical for both
    for (int i = 0; i < 2; i++) {
        readers[i].consolidateNamedDestinations();
        infos[i] = readers[i].getInfo();
        nInPages[i] = readers[i].getNumberOfPages();
    }
    // Calculate page offsets depending on the merge mode.
    switch(mergeMode) {
        case SEQUENTIAL:
            nOutPages = nInPages[0] + nInPages[1];
            switch(mergeAt) {
                case START:
                    pageOffsets[0] = nInPages[1];
                    pageOffsets[1] = 0;
                    break;
                case END:
                    pageOffsets[0] = 0;
                    pageOffsets[1] = nInPages[0];
                    break;
            }
            break;
        case OVERLAY:
        case UNDERLAY:
            nOutPages = Math.max(nInPages[0], nInPages[1]);
            pageOffsets[0] = 0;
            if (mergeAt == MergeAt.END)
                pageOffsets[1] = Math.max(0, nInPages[0] - nInPages[1]);
            else
                pageOffsets[1] = 0;
            break;
    }
    // Construct the copying writer
    Document pdfDocument = new Document(readers[0].getPageSizeWithRotation(1));
    PdfCopy pdfWriter = new PdfCopy(pdfDocument, outStream);
    pdfDocument.open();
    // Merge the metadata
    mergeMetadata(infos, pdfWriter, context);
    // Copy bookmarks from both PDFs
    ArrayList allBookmarks = new ArrayList();
    for (int i = 0; i < 2; i++) {
        List bookmarks = SimpleBookmark.getBookmark(readers[i]);
        if (bookmarks != null) {
            if (pageOffsets[i] != 0)
                SimpleBookmark.shiftPageNumbers(bookmarks, pageOffsets[i], null);
            allBookmarks.addAll(bookmarks);
        }
    }
    PageInfo[] basePages = new PageInfo[nOutPages];
    PageInfo[] mergePages = new PageInfo[nOutPages];
    //
    for (int i = 0; i < nOutPages; i++) {
        for (int j = 0; j < 2; j++) {
            int inPageNum = i - pageOffsets[j];
            if (inPageNum < 0 || inPageNum >= nInPages[j])
                continue;
            PageInfo info = new PageInfo();
            info.reader = readers[j];
            info.pageNum = inPageNum + 1;
            if (basePages[i] == null)
                basePages[i] = info;
            else {
                info.impPage = pdfWriter.getImportedPage(info.reader, info.pageNum);
                info.image = Image.getInstance(info.impPage);
                mergePages[i] = info;
            }
        }
    }
    for (int i = 0; i < nOutPages; i++) {
        PageInfo base = basePages[i];
        base.impPage = pdfWriter.getImportedPage(base.reader, base.pageNum);
        if (mergePages[i] != null) {
            PageStamp ps = pdfWriter.createPageStamp(base.impPage);
            PdfContentByte contentBuf = null;
            if (mergeMode == MergeMode.OVERLAY)
                contentBuf = ps.getOverContent();
            else if (mergeMode == MergeMode.UNDERLAY)
                contentBuf = ps.getUnderContent();
            else
                assert false : "page offset calculations were wrong";
            // this is the trick
            Image img = Image.getInstance(mergePages[i].image);
            contentBuf.addImage(img, base.impPage.getWidth(), 0, 0, base.impPage.getHeight(), 0, 0);
            ps.alterContents();
        }
        pdfWriter.addPage(base.impPage);
    }
    // Set the combined bookmarks.
    if (!allBookmarks.isEmpty())
        pdfWriter.setOutlines(allBookmarks);
    // And we're done.
    pdfDocument.close();
}
Example 9
Project: Origamist-master  File: JAXBOrigamiHandler.java View source code
@Override
public Set<File> export(final Origami origami, File file, ExportFormat format, ExportOptions options, Runnable progressCallback) throws IOException {
    Set<File> result = new LinkedHashSet<File>();
    if (format == ExportFormat.XML) {
        try {
            save(origami, file);
        } catch (MarshalException e) {
            throw new IOException(e);
        } catch (JAXBException e) {
            throw new IOException(e);
        }
        result.add(file);
        if (progressCallback != null)
            progressCallback.run();
    } else if (format == ExportFormat.PNG || format == ExportFormat.SVG || format == ExportFormat.PDF) {
        // a lot of code is common for those 3 formats, so we won't divide them
        Double dpi = null;
        Locale locale = null;
        Insets pageInsets = null;
        boolean withBackground = true;
        // configure from options
        if (options != null) {
            if (options instanceof PNGExportOptions) {
                PNGExportOptions options2 = (PNGExportOptions) options;
                dpi = options2.getDpi();
                locale = options2.getLocale();
                withBackground = options2.isWithBackground();
                pageInsets = options2.getPageInsets();
            } else if (options instanceof SVGExportOptions) {
                SVGExportOptions options2 = (SVGExportOptions) options;
                dpi = options2.getDpi();
                locale = options2.getLocale();
                withBackground = options2.isWithBackground();
                pageInsets = options2.getPageInsets();
            } else if (options instanceof PDFExportOptions) {
                PDFExportOptions options2 = (PDFExportOptions) options;
                dpi = options2.getDpi();
                locale = options2.getLocale();
                withBackground = options2.isWithBackground();
                pageInsets = options2.getPageInsets();
            } else {
                dpi = 72d;
                locale = ServiceLocator.get(ConfigurationManager.class).get().getDiagramLocale();
                pageInsets = new Insets(25, 25, 25, 25);
            }
        } else {
            dpi = 72d;
            locale = ServiceLocator.get(ConfigurationManager.class).get().getDiagramLocale();
            pageInsets = new Insets(25, 25, 25, 25);
        }
        final File parentFile = (file.isDirectory() ? file : file.getParentFile());
        final FileNameGenerator fileNames;
        if (!file.isDirectory()) {
            String prefix = file.getName().replaceAll("\\.[^.]*$", "");
            String suffix = file.getName().replaceAll("^.*(\\.[^.]*)$", "$1");
            fileNames = new FileNameGeneratorImpl(prefix, suffix, origami.getNumberOfPages());
        } else {
            fileNames = new FileNameGeneratorImpl("", ".png", origami.getNumberOfPages());
        }
        UnitDimension paperDim = origami.getPaper().getSize();
        paperDim = paperDim.convertTo(Unit.INCH);
        final Dimension resultDim = new Dimension((int) (paperDim.getWidth() * dpi), (int) (paperDim.getHeight() * dpi));
        // create the graphics object - either from a buffered image, or an SVG graphics
        final Graphics2D g;
        BufferedImage buffer = null;
        Document svgDocument = null;
        if (format == ExportFormat.PNG) {
            buffer = new BufferedImage(resultDim.width, resultDim.height, BufferedImage.TYPE_INT_ARGB);
            g = buffer.createGraphics();
        } else {
            DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
            String svgNS = "http://www.w3.org/2000/svg";
            svgDocument = domImpl.createDocument(svgNS, "svg", null);
            SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(svgDocument);
            // this is important, otherwise the SVG files use a different font and that breaks the result
            ctx.setEmbeddedFontsOn(true);
            g = new SVGGraphics2D(ctx, true);
        }
        Font font = new JMultilineLabel("").getFont();
        // normalize the font size
        font = font.deriveFont((float) (font.getSize2D() * dpi / 72));
        // iterate through pages, draw them into the created graphics, and write to files
        IOException e = null;
        for (int i = 0; i <= origami.getNumberOfPages(); i++) {
            try {
                if (i > 0) {
                    // DRAW THE PAGE
                    drawPage(g, new Rectangle(0, 0, resultDim.width, resultDim.height), pageInsets, origami, i, locale, font, withBackground, progressCallback);
                } else {
                    // DRAW TITLE PAGE
                    drawTitlePage(g, new Rectangle(0, 0, resultDim.width, resultDim.height), pageInsets, origami, locale, font, withBackground, progressCallback);
                }
            } catch (InterruptedException ex) {
                g.dispose();
                return result;
            }
            if (format == ExportFormat.PNG && buffer != null) {
                try {
                    // write the image buffer to file
                    buffer.flush();
                    File pageFile = new File(parentFile, fileNames.getFileName(i));
                    ImageIO.write(buffer, "png", pageFile);
                    result.add(pageFile);
                } catch (IOException ex) {
                    e = ex;
                }
            } else if (format == ExportFormat.SVG || format == ExportFormat.PDF) {
                // write the SVG graphics to file
                File outFile = new File(parentFile, fileNames.getFileName(i));
                FileWriter writer = null;
                try {
                    writer = new FileWriter(outFile);
                    // PDF will be written with incorrect extension, but it doesn't matter since it is only
                    // temporary
                    ((SVGGraphics2D) g).stream(writer, true);
                    result.add(outFile);
                } catch (IOException ex) {
                    e = ex;
                } finally {
                    if (writer != null) {
                        try {
                            writer.flush();
                            writer.close();
                        } catch (IOException ex) {
                            e = ex;
                        }
                    }
                }
            }
        }
        g.dispose();
        if (format == ExportFormat.PDF) {
            // coversion to PDF is a little tricky
            // although the manuals say that exporting PDF directly from SVG tree is possible, I didn't get correct
            // results - always just a blank PDF page; so we've written the SVGs to disk, loading them from there
            // works
            // SVG doesn't handle pages, nor Batik does, so we must write one file per page and then merge them
            // using iText
            PDFTranscoder trans = new PDFTranscoder();
            trans.addTranscodingHint(PDFTranscoder.KEY_WIDTH, (float) resultDim.width);
            trans.addTranscodingHint(PDFTranscoder.KEY_HEIGHT, (float) resultDim.height);
            List<File> newResult = new LinkedList<File>();
            for (File f : result) {
                // transcode SVGs to PDFs - one file per page
                TranscoderInput input = new TranscoderInput(new FileReader(f));
                File outFile = new File(parentFile, f.getName() + ".pdf");
                newResult.add(outFile);
                OutputStream stream = new FileOutputStream(outFile);
                TranscoderOutput output = new TranscoderOutput(stream);
                try {
                    trans.transcode(input, output);
                    newResult.add(outFile);
                } catch (TranscoderException e1) {
                    e = new IOException(e1);
                } finally {
                    try {
                        stream.flush();
                        stream.close();
                    } catch (IOException e1) {
                        e = e1;
                    }
                    progressCallback.run();
                }
            }
            // delete the temporary SVG files
            for (File f : result) f.delete();
            result.clear();
            result.addAll(newResult);
            // initialize iText
            com.itextpdf.text.Document doc = new com.itextpdf.text.Document(new com.itextpdf.text.Rectangle(resultDim.width, resultDim.height));
            PdfCopy copy = null;
            try {
                copy = new PdfCopy(doc, new FileOutputStream(file));
            } catch (DocumentException e2) {
                e = new IOException(e2);
            }
            // merge the multiple pdf files into one
            if (copy != null) {
                doc.open();
                PdfReader reader = null;
                int n;
                for (File f : result) {
                    try {
                        reader = new PdfReader(f.toString());
                        // loop over the pages in documents
                        n = reader.getNumberOfPages();
                        for (int page = 0; page < n; ) {
                            try {
                                copy.addPage(copy.getImportedPage(reader, ++page));
                            } catch (BadPdfFormatException e1) {
                                e = new IOException(e1);
                            }
                        }
                    } catch (IOException ex) {
                        e = ex;
                    } finally {
                        if (reader != null)
                            copy.freeReader(reader);
                        progressCallback.run();
                    }
                }
                doc.close();
                for (File f : result) f.delete();
                result.clear();
                result.add(file);
            }
        }
        // this way we try to create the most files, so one error in the middle won't break the rest of files
        if (e != null)
            throw e;
    } else if (format == ExportFormat.MOV) {
        MOVExportOptions opt = (MOVExportOptions) options;
        Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration(), true);
        canvas.setSize(opt.getSize());
        final StepMorphingCanvasController morpher = new StepMorphingCanvasController(canvas, origami, origami.getModel().getSteps().getStep().get(0), (int) (opt.getFps() * opt.getStepDuration()));
        JPEGMovieAnimation anim = new JPEGMovieAnimation(file);
        int numFrames = (int) (origami.getModel().getSteps().getStep().size() * opt.getFps() * opt.getStepDuration());
        int i = 0;
        BufferedImage im;
        while ((im = morpher.getNextFrame()) != null) {
            anim.addFrame((float) (1f / opt.getFps()), im, 1f);
            progressCallback.run();
            if (// we don't want an infinite loop when something goes bad
            i++ > numFrames)
                break;
        }
        anim.close();
        result.add(file);
    } else {
        Logger.getLogger("application").error("Unsupported export format: " + format);
        throw new IOException("Unsupported export format: " + format);
    }
    return result;
}
Example 10
Project: alfresco-pdf-toolkit-master  File: PDFToolkitServiceImpl.java View source code
private NodeRef subsetPDFDocument(NodeRef targetNodeRef, Map<String, Serializable> params, String pages, boolean delete) {
    InputStream is = null;
    File tempDir = null;
    ContentWriter writer = null;
    PdfReader pdfReader = null;
    NodeRef destinationNode = null;
    try {
        ContentReader targetReader = getReader(targetNodeRef);
        is = targetReader.getContentInputStream();
        File alfTempDir = TempFileProvider.getTempDir();
        tempDir = new File(alfTempDir.getPath() + File.separatorChar + targetNodeRef.getId());
        tempDir.mkdir();
        Boolean inplace = Boolean.valueOf(String.valueOf(params.get(PARAM_INPLACE)));
        String fileName = getFilename(params, targetNodeRef);
        File file = new File(tempDir, ffs.getFileInfo(targetNodeRef).getName());
        pdfReader = new PdfReader(is);
        Document doc = new Document(pdfReader.getPageSizeWithRotation(1));
        PdfCopy copy = new PdfCopy(doc, new FileOutputStream(file));
        doc.open();
        List<Integer> pagelist = parsePageList(pages);
        for (int pageNum = 1; pageNum <= pdfReader.getNumberOfPages(); pageNum++) {
            if (pagelist.contains(pageNum) && !delete) {
                copy.addPage(copy.getImportedPage(pdfReader, pageNum));
            } else if (!pagelist.contains(pageNum) && delete) {
                copy.addPage(copy.getImportedPage(pdfReader, pageNum));
            }
        }
        doc.close();
        destinationNode = createDestinationNode(fileName, (NodeRef) params.get(PARAM_DESTINATION_FOLDER), targetNodeRef, inplace);
        writer = cs.getWriter(destinationNode, ContentModel.PROP_CONTENT, true);
        writer.setEncoding(targetReader.getEncoding());
        writer.setMimetype(FILE_MIMETYPE);
        // Put it in the repository
        writer.putContent(file);
        // Clean up
        file.delete();
    } catch (IOException e) {
        throw new AlfrescoRuntimeException(e.getMessage(), e);
    } catch (DocumentException e) {
        throw new AlfrescoRuntimeException(e.getMessage(), e);
    } catch (Exception e) {
        throw new AlfrescoRuntimeException(e.getMessage(), e);
    } finally {
        if (pdfReader != null) {
            pdfReader.close();
        }
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                throw new AlfrescoRuntimeException(e.getMessage(), e);
            }
        }
        if (tempDir != null) {
            tempDir.delete();
        }
    }
    return destinationNode;
}
Example 11
Project: Assignments-master  File: SmartPdfSplitter.java View source code
public boolean split(OutputStream os, long sizeInBytes) throws IOException, DocumentException {
    if (!hasMorePages()) {
        os.close();
        return false;
    }
    overSized = false;
    Document document = new Document();
    PdfCopy copy = new PdfSmartCopy(document, os);
    document.open();
    boolean hasPage = false;
    PdfResourceCounter counter = new PdfResourceCounter(reader.getTrailer());
    long trailer = counter.getLength(null);
    Map<Integer, PdfObject> resources = counter.getResources();
    long length = 0;
    long page;
    while (hasMorePages()) {
        counter = new PdfResourceCounter(reader.getPageN(currentPage));
        page = counter.getLength(resources);
        resources = counter.getResources();
        length += page + trailer + xrefLength(resources.size());
        LOGGER.info(String.format("Page %s: Comparing %s with %s", currentPage, length, sizeInBytes));
        LOGGER.info(String.format("   page %s trailer %s xref %s", page, trailer, xrefLength(resources.size())));
        if (!hasPage || length < sizeInBytes) {
            hasPage = true;
            copy.addPage(copy.getImportedPage(reader, currentPage));
            length = copy.getOs().getCounter();
            LOGGER.info(String.format("Size after adding page: %s", length));
            if (length > sizeInBytes)
                overSized = true;
            currentPage++;
        } else {
            LOGGER.info("Page doesn't fit");
            break;
        }
    }
    document.close();
    return true;
}