gpt4 book ai didi

java - 从 pdf 中提取嵌入对象

转载 作者:行者123 更新时间:2023-12-02 04:40:03 24 4
gpt4 key购买 nike

我已将字节数组嵌入到 pdf 文件中(Java)。现在我正在尝试提取相同的数组。该数组被嵌入为“MOVIE”文件。

我找不到任何关于如何做到这一点的线索......

有什么想法吗?

谢谢!

编辑

我使用此代码嵌入字节数组:

public static void pack(byte[] file) throws IOException, DocumentException{

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT));
writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7);
writer.addDeveloperExtension(PdfDeveloperExtension.ADOBE_1_7_EXTENSIONLEVEL3);

document.open();
RichMediaAnnotation richMedia = new RichMediaAnnotation(writer, new Rectangle(0,0,0,0));

PdfFileSpecification fs
= PdfFileSpecification.fileEmbedded(writer, null, "test.avi", file);
PdfIndirectReference asset = richMedia.addAsset("test.avi", fs);
RichMediaConfiguration configuration = new RichMediaConfiguration(PdfName.MOVIE);
RichMediaInstance instance = new RichMediaInstance(PdfName.MOVIE);
RichMediaParams flashVars = new RichMediaParams();
instance.setAsset(asset);
configuration.addInstance(instance);
RichMediaActivation activation = new RichMediaActivation();
richMedia.setActivation(activation);
PdfAnnotation richMediaAnnotation = richMedia.createAnnotation();
richMediaAnnotation.setFlags(PdfAnnotation.FLAGS_PRINT);
writer.addAnnotation(richMediaAnnotation);
document.close();

最佳答案

我编写了一种强力方法来提取 PDF 中的所有流并将它们存储为不带扩展名的文件:

public static final String SRC = "resources/pdfs/image.pdf";
public static final String DEST = "results/parse/stream%s";

public static void main(String[] args) throws IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new ExtractStreams().parse(SRC, DEST);
}

public void parse(String src, String dest) throws IOException {
PdfReader reader = new PdfReader(src);
PdfObject obj;
for (int i = 1; i <= reader.getXrefSize(); i++) {
obj = reader.getPdfObject(i);
if (obj != null && obj.isStream()) {
PRStream stream = (PRStream)obj;
byte[] b;
try {
b = PdfReader.getStreamBytes(stream);
}
catch(UnsupportedPdfException e) {
b = PdfReader.getStreamBytesRaw(stream);
}
FileOutputStream fos = new FileOutputStream(String.format(dest, i));
fos.write(b);
fos.flush();
fos.close();
}
}
}

请注意,我将所有作为流的 PDF 对象作为 PRStream 对象获取。我还使用两种不同的方法:

  • 当我使用 PdfReader.getStreamBytes(stream) 时,iText 将查看过滤器。例如:页面内容流由使用 /FlateDecode 压缩的 PDF 语法组成。通过使用PdfReader.getStreamBytes(stream),您将获得未压缩 PDF 语法。
  • 并非所有过滤器都受 iText 支持。以 /DCTDecode 为例,它是用于在 PDF 中存储 JPEG 的过滤器。为什么以及如何“解码”这样的流?您不会,此时我们会使用 PdfReader.getStreamBytesRaw(stream),这也是您从 PDF 中获取 AVI 字节所需的方法。

此示例已经为您提供了提取 PDF 流所需的方法。现在您需要找到所需流的路径。这需要 iText RUPS 。使用 iText RUPS,您可以查看 PDF 文件的内部结构。在您的情况下,您需要像此问题中所做的那样找到注释: All links of existing pdf change the action property to inherit zoom - iText library

您循环遍历页面字典,然后循环遍历该字典的 /Annots 数组(如果存在),但不检查 /Link 注释(是我提到的问题中提出的问题),您必须检查 /RichMedia 注释,并从那里检查 Assets ,直到找到包含 AVI 文件的流。 RUPS 将向您展示如何深入了解注释字典。

关于java - 从 pdf 中提取嵌入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30286601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com