iTextSharp 116毫秒处理6G的文件

前言:

有一家印刷企业专为米兰新娘,微微新娘,金夫人这样的影楼印刷婚纱相册。通过一个B2B销售终端软件,把影楼的相片上传到印刷公司的服务器,服务器对这些图片进行处理。

比如:

1)为每个图片生成订单条码,生产码;

2)为每个图片进行色彩修正,图像处理(拉长腿,去红眼,去色斑等功能),其中用到了Perfectly Clear商业组件。^_^

3)把属于一本相册的所有图片转换为一个PDF文件。

4)用Enfocus Switch软件,检测PDF的完整性。

5)把生成PDF的文件合成上10G的PDF文件(今天要说的也是这儿),方便印刷机台的操作。

6)……

方法:

处理:对PDF的处理,有一个比较牛的插件叫iTextSharp。这儿用这个插件对PDF文件进行文档合并。这个插件是用C++开发的,但是有Java版,C#版。

iText官方网站

Java版iText组件

Java版工具包

C#版iText组件

C#版工具包

测试环境:

测试数据(把5个1.2G的PDF合并为一个6G的PDF):

合并代码:

Java版:

/**********************************************************/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

public class ItextMerge {
    public static void main(String[] args) {
        List<InputStream> list = new ArrayList<InputStream>();
        try {
            // Source pdfs
            list.add(new FileInputStream(new File("f:/1.pdf")));
            list.add(new FileInputStream(new File("f:/2.pdf")));

            // Resulting pdf
            OutputStream out = new FileOutputStream(new File("f:/result.pdf"));

            doMerge(list, out);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Merge multiple pdf into one pdf
     *
     * @param list
     *            of pdf input stream
     * @param outputStream
     *            output file output stream
     * @throws DocumentException
     * @throws IOException
     */
    public static void doMerge(List<InputStream> list, OutputStream outputStream)
            throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        PdfContentByte cb = writer.getDirectContent();

        for (InputStream in : list) {
            PdfReader reader = new PdfReader(in);
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.newPage();
                //import the page from source pdf
                PdfImportedPage page = writer.getImportedPage(reader, i);
                //add the page to the destination pdf
                cb.addTemplate(page, 0, 0);
            }
        }

        outputStream.flush();
        document.close();
        outputStream.close();
    }
}
/*********************************************/

C#版:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Stopwatch sw1 = new Stopwatch();
    sw1.Start();
    string[] pdfList = new string[5];
    pdfList[0] = @"D:\PDF文件合并\Test\1.pdf";
    pdfList[1] = @"D:\PDF文件合并\Test\2.pdf";
    pdfList[2] = @"D:\PDF文件合并\Test\3.pdf";
    pdfList[3] = @"D:\PDF文件合并\Test\4.pdf";
    pdfList[4] = @"D:\PDF文件合并\Test\5.pdf";
    //pdfList[5] = @"D:\PDF文件合并\Test\6.pdf";
    //pdfList[6] = @"D:\PDF文件合并\Test\7.pdf";
    //pdfList[7] = @"D:\PDF文件合并\Test\8.pdf";
    //pdfList[8] = @"D:\PDF文件合并\Test\9.pdf";
    //pdfList[9] = @"D:\PDF文件合并\Test\10.pdf";

    mergePDFFiles(pdfList);

    sw1.Stop();

    string xx = sw1.ElapsedMilliseconds.ToString();  //116715

}

void mergePDFFiles(string[] pdfList)
{
    string mergePDFFiles = @"D:\PDF文件合并\Test\total.pdf";

    Document DOC = new Document();
    //getInstance
    PdfWriter writer = PdfWriter.GetInstance(DOC, new FileStream(mergePDFFiles, FileMode.Create));

    DOC.Open();
    PdfContentByte cb = writer.DirectContent;
    PdfImportedPage newPage;

    for (int i = 0; i < pdfList.Length; i++)
    {

        PdfReader reader = new PdfReader(pdfList[i]);
        int iPageNum = reader.NumberOfPages;
        for (int j = 1; j <= iPageNum; j++)
        {
            DOC.NewPage();
            //DOC.newPage();
            newPage = writer.GetImportedPage(reader, j);
            //newPage = writer.getImportedPage(reader, j);

            cb.AddTemplate(newPage, 0, 0);
            //cb.addTemplate(newPage, 0, 0);
        }
    }
    DOC.Close();
}

合并结果:

116毫秒,合并6G文件。

分享6个一流PPT资源:http://www.cnblogs.com/xcj26/p/5590647.html  。

有东西,全部分享了,放在硬盘里没用。

时间: 2024-11-05 14:54:56

iTextSharp 116毫秒处理6G的文件的相关文章

iTextSharp

iTextSharp 116毫秒处理6G的文件 前言: 有一家印刷企业专为米兰新娘,微微新娘,金夫人这样的影楼印刷婚纱相册.通过一个B2B销售终端软件,把影楼的相片上传到印刷公司的服务器,服务器对这些图片进行处理. 比如: 1)为每个图片生成订单条码,生产码: 2)为每个图片进行色彩修正,图像处理(拉长腿,去红眼,去色斑等功能),其中用到了Perfectly Clear商业组件.^_^ 3)把属于一本相册的所有图片转换为一个PDF文件. 4)用Enfocus Switch软件,检测PDF的完整性

Java高效读取大文件

1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种

Java高效读取大文件(转)

1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: 1 2 3 Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)

用java实现大文件分割、排序、合并

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Collections; import java.util.Iterator; import java

在C#.NET中,如何生成PDF文件?主要有以下几个途径

1.使用.NET文件流技术:若通过.NET的文件流技术生成PDF文件,必须对PDF文件的语法很清楚,例如BT表示实体内容开始:ET表示实体内容结束:TD表示换行等等.我们可以从Adobe的官方网站上下载PDF的语法说明文档,但文档几乎有1000页.如果熟悉好语法以后再编程,花费的时间肯定很长,而且生成的PDF文档不一定能满足要求.有关C# 代码参见附件.有关PDF文件的语法详见:http://partners.adobe.com/public/developer/en/pdf/PDFRefere

Android 文件夹命名规范 国际化资源

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

文件读写操作

1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.io.LineNumberReader; 8 import java.text.SimpleDateFo

解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件

1.传统的在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: 1 2 3 Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常. 例如:读取一个大约1G的文件: 1 2 3

C#对word、excel、pdf等格式文件的操作总结 .

一.word 这是我以前工作时写过的一个业务逻辑处理类,里面有不少文件操作的方法,这里主要关注一下C#对word的操作.里面的方法可以直接拿出来用,主要是通过word的dot模版来进行创建word.替换word等操作. namespace Excel2Word { public class BLL { private Microsoft.Office.Interop.Word.Application app = null;//全局变量 word应用程序 /// /// 从Excel中读取数据 /