我将一个字节数组嵌入到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();
答案 0 :(得分:2)
我编写了一个强力方法来提取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语法。/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
注释,然后检查资产,直到找到包含AVI文件的流。 RUPS将向您展示如何深入到注释词典。