Java在.dat文件中编写所有pdf文件字节

时间:2013-07-10 18:36:06

标签: java

我编写的代码将所有pdf文件写入文件夹获取字节并写入.dat文件。实际上它的工作和写入.dat文件中的所有字节但是当我用Acrobat打开该.dat文件时它打开黑页。

这是我的代码..

    import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;

public class xmlfile1filebytes {

  public static void main(String[] args) throws IOException {

    File folder = new File ("07072013");
    File[] listOfFiles = folder.listFiles();

    System.out.println("There are " + listOfFiles.length + " files"); 
    String filesin;

    String timeStamp = new SimpleDateFormat("MM-dd-yyyy[HH.mm.ss]")
     .format(Calendar.getInstance().getTime());
     System.out.println(timeStamp);

    BufferedWriter xmlfile = null;
    BufferedWriter datfile = null;

    String outxmlfile = ("07072013\\" + timeStamp + ".xml");
    xmlfile = new BufferedWriter(new FileWriter(outxmlfile));

    String outdatfile = ("07072013\\" + timeStamp + ".dat");
    datfile = new BufferedWriter(new FileWriter(outdatfile));

    int offset = 0;
    int size = 0;

    for (int i = 0; i < listOfFiles.length; i++) {

        File f = listOfFiles[i];

       // System.out.println(i + " " + f.getAbsolutePath());
        if (f.isFile()) {

            filesin = listOfFiles[i].getName();

            if (filesin.endsWith("pdf")) {

                Path aPath = Paths.get(f.getAbsolutePath()); 

                System.out.println(filesin);

                byte[] actualBytes = Files.readAllBytes(aPath);
                size = actualBytes.length;

                xmlfile.append((i + 1) + ")" + " File = " + filesin + ", Offset = " + offset + ", Size = " + size + "\n");


                offset = offset + size;
                xmlfile.newLine();

                String s = new String(actualBytes);

                datfile.append(s);
                datfile.newLine();


                File datfileinfolder = new File ("07072013\\" + timeStamp + ".dat");

                long datfilesize = datfileinfolder.length();
                final int BLOCK_SIZE = 200 * 1024;

                for (int curBlock = 0;  curBlock < actualBytes.length; curBlock += BLOCK_SIZE) {
                    String toWrite = new String(
                            Arrays.copyOfRange(actualBytes, curBlock, Math.min(curBlock + BLOCK_SIZE, actualBytes.length)));

                     String suffix = "";

                     if (curBlock > 0) {
                         //append underscores other file information and then perform writes
                         suffix =  String.valueOf(curBlock /  BLOCK_SIZE);
                     }    

                     BufferedWriter datfile1 = null;
                     String outdatfile1 = ("07072013\\" + suffix + timeStamp + ".dat");
                     datfile1 = new BufferedWriter(new FileWriter(outdatfile1));


                     datfile1.append(toWrite);
                     datfile1.close(); 

                }

                //long datfilesizeinkb = datfilesize /1024;

                //System.out.println("Size = " + datfilesizeinkb);



             }
        }
    }
     datfile.close();
     xmlfile.close();
  }
}

1 个答案:

答案 0 :(得分:1)

从您的帖子和您的评论中不清楚您真正想要实现的目标。您最初的问题似乎是将多个PDF文件合并到一个.dat文件中,您希望能够使用acrobat打开该文件。

如果您正在尝试这样做,那么我建议使用Apache PDFBox,特别是PDFMergerUtility类。代码的大纲如下:

PDFMergerUtility merger = new PDFMergerUtility();
File[] files = folder.listFiles();
for (File file : files) {
    merger.addSource(file);
}

merger.setDestinationFileName("output.pdf");
merger.mergeDocuments();

这应该将您的源文件合并为一个大型PDF文件。当然,您可以在此文件上使用.dat扩展名,但我不确定您为何会这样做。唯一可以实现的是打破文件扩展名关联,因此双击该文件将无法打开它。

您要问的第二个问题是如何将数据分成200KB的块。我不确定你为什么要这样做。如果这样做,您将不必(必然)能够在Acrobat中打开生成的文件。 PDF文件非常具体的内部格式。部分文件无法打开。如果目标是为每个输入文件提供一个输出文件,那么简单的文件副本就可以实现此目的。如果目标是获取所有这些文件并将它们合并为200KB块中的单个流(同样,为什么?),那么您可能需要考虑使用压缩库。在这种情况下,this answer可能会帮助您入门。