我编写了代码,将所有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();
}
}
最佳答案
从您的帖子和评论中不清楚您真正想要实现的目标。您最初的问题似乎是将多个 PDF 文件合并到一个 .dat 文件中,您希望能够使用 acrobat 打开该文件。
如果这就是您想要做的,那么我建议使用 Apache PDFBox特别是 PDFMergerUtility类(class)。代码概要如下:
PDFMergerUtility merger = new PDFMergerUtility();
File[] files = folder.listFiles();
for (File file : files) {
merger.addSource(file);
}
merger.setDestinationFileName("output.pdf");
merger.mergeDocuments();
这应该将您的源文件合并为一个大的 PDF 文件。当然,您可以在此文件上使用 .dat 扩展名,但我不确定您为什么要这样做。唯一能完成的事情就是打破文件扩展名关联,这样双击文件就不会打开它。
您问的第二个问题是如何将数据分成 200KB 的 block 。我不确定你为什么要这样做。如果您这样做,您将(必然)无法在 Acrobat 中打开生成的文件。 PDF 文件的内部格式非常具体。部分文件将无法打开。如果目标是每个输入文件都有一个输出文件,那么简单的文件副本就可以实现这一目标。如果目标是获取所有这些文件并将它们合并到 200KB block 的单个流中(为什么?),那么您可能需要考虑使用压缩库。在这种情况下,this answer可能会帮助您入门。
关于Java将所有pdf文件字节写入.dat文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17578374/