-1

我编写了代码,将文件夹中的所有 pdf 文件写入获取字节并写入 .dat 文件。实际上,它的工作并将所有字节写入 .dat 文件,但是当我使用 Acrobat 打开该 .dat 文件时,它会以空白页打开....实际上它应该在 acrobat 中打开第一页,对吗?请帮助我..谢谢!由于页眉,其他页面无法打开..但第一页应该打开对吗??

这是我的代码..

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();
  }
}
4

2 回答 2

0

一些高级代码,但在某些地方是错误的。二进制数据应该使用 OutputStream,而不是 Writer。new String(actualBytes);使用当前的平台编码,并且希望它独立于平台。在通常是 UTF-8 的 Linux 上,在 UTF-8 中,并非所有字节序列都形成一个合法的字符串,更好new String(actualBytes, "Windows-1252");- 但这是 hack on hack。

根据您的目的,一个.zip文件似乎是最好的。简单地将几个 PDF 文件的内容添加到一个文件中不会创建一个完整的文件。如果你给它结尾.pdf,也许一些PDF查看器可能会显示它(即使最后有垃圾:其他PDF)。

要创建 zip 文件,请使用带有 ZipFile/ZipOutputStream 的旧 API,或使用 Java 7 的Zip FileSystem

于 2013-07-11T21:43:33.800 回答
0

您正在使用 a Writer,其中 aOutputStream是正确的选择。Writer 进行字符编码,并且可能进行行尾转换,这可能会损坏二进制数据。

顺便说一句:为您写入的每个数据块重新打开和关闭输出文件效率低下。

于 2013-07-11T21:17:32.540 回答