使用pdfbox将pdf文件转换为byte[],并反之亦然

5
我已经阅读了文档和示例,但是我很难将它们整合在一起。我只是想将一个测试pdf文件转换为字节数组,然后将字节数组转换回pdf文件,然后创建pdf文件到磁盘上。
可能并没有太大帮助,但这是我目前的进展:
package javaapplication1;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;

public class JavaApplication1 {

    private COSStream stream;

    public static void main(String[] args) {
        try {
            PDDocument in = PDDocument.load("C:\\Users\\Me\\Desktop\\JavaApplication1\\in\\Test.pdf");
            byte[] pdfbytes = toByteArray(in);
            PDDocument out;
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    private static byte[] toByteArray(PDDocument pdDoc) throws IOException, COSVisitorException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            pdDoc.save(out);
            pdDoc.close();
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return out.toByteArray();
    }

    public void PDStream(PDDocument document) {
        stream = new COSStream(document.getDocument().getScratchFile());
    }
}

PDF是一个字节数组,只需读取二进制文件即可。但也许你的意思不同? - Andrey
由于某些原因,当我将PDF转换为字节数组,然后再转回PDF时,尝试打开新创建的PDF时会显示文件已损坏。因此,我决定使用pdfbox来避免这种情况。是否可能跳过pdfbox并进行操作,以获取一个可用的PDF? - user1191027
你最终的目标是什么?我无法看到将 PDF 转换为字节数组,再转回去的自给自足用途。 - Andrey
嗯,我正在测试能否将PDF存储在数据库中。我知道存储应该使用文件系统,但我仍想将其存储到数据库中。唯一能实现这一点的方法是将其转化为字节数组(byte[] array)的形式。 - user1191027
只需将其作为文件流读取,就可以了。我真的看不出它不起作用的原因。 - Andrey
1个回答

7
你可以使用Apache commons,在我看来,在任何Java项目中都是必不可少的。
然后,您可以使用FileUtilsreadFileToByteArray(File file)writeByteArrayToFile(File file, byte[] data)
(这里是commons-io,也就是FileUtils所在的地方:http://commons.apache.org/proper/commons-io/download_io.cgi
例如,我刚刚尝试了这个,并且效果非常好。
try {
    File file = new File("/example/path/contract.pdf");
    byte[] array = FileUtils.readFileToByteArray(file);
    FileUtils.writeByteArrayToFile(new File("/example/path/contract2.pdf"), array);

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

当我使用它时,将byte[]转换回文件时会创建损坏的PDF文件...你能成功地做到这一点吗? - user1191027
即使使用FileUtils?我经常使用它处理各种文件,包括一些PDF文件,从未遇到任何问题 ): - Doodad
你有没有任何旧代码可以复制粘贴演示一下? - user1191027
刚刚在这里运行了一个测试,更新了代码并且成功运行(除了“/example/path”是真实路径的部分)。 - Doodad
是的,那个确实很好用。谢谢你的帮助,我很感激。 - user1191027
1
没问题,伙计,我们在这里互相帮助:D 很高兴我能帮到你。 - Doodad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接