private Set<String> getAllFilters(COSDocument document) { Set<String> res = new HashSet<>(); for (COSObject base : document.getObjects()) { if (base.getType() == COSObjType.COS_STREAM) { COSFilters baseFilters = ((COSStream) base.getDirectBase()).getFilters(); addFilters(res, baseFilters); } } return res; }
@Override public ASInputStream getData(final FilterFlags filterFlags) { try { if (filterFlags == FilterFlags.RAW_DATA || this.flags != FilterFlags.RAW_DATA) { this.stream.reset(); return this.stream; } ASInputStream result = getFilters().getInputStream( ASInputStream.createStreamFromStream(stream), this.getKey(ASAtom.DECODE_PARMS)); result.reset(); return result; } catch (IOException e) { LOGGER.log(Level.FINE, "Can't get stream data", e); return null; } }
@Override public int removeFiltersForAllMetadataObjects() { int res = 0; List<COSObject> objects = this.document.getDocument().getObjectsByType(ASAtom.METADATA); List<COSStream> metas = new ArrayList<>(); for (COSObject obj : objects) { if (obj.getType() == COSObjType.COS_STREAM) { metas.add((COSStream) obj.getDirectBase()); } else { LOGGER.log(Level.SEVERE, "Found non-stream Metadata dictionary."); } } for (COSStream stream : metas) { if (stream.getFilters().size() > 0) { try { stream.setFilters(new COSFilters()); res++; } catch (IOException e) { LOGGER.log(Level.FINE, "Error when removing filter from stream", e); return -1; } } } isUnfiltered = res > 0; return res; }
private List<CosFilter> getFilters() { COSFilters filters = ((COSStream) this.baseObject).getFilters(); if (filters == null || filters.getFilters().isEmpty()) { return Collections.emptyList();
@Override public boolean setData(final ASInputStream stream) { COSFilters filters = getFilters(); if (filters.empty()) { return setData(stream, FilterFlags.RAW_DATA); } try (InternalOutputStream fileWithData = InternalOutputStream.getInternalOutputStream()) { ASOutputStream encoder = filters.getOutputStream(fileWithData); encoder.write(stream); File encodedDataFile = fileWithData.getFile(); return setData(new InternalInputStream(encodedDataFile, true), FilterFlags.RAW_DATA); } catch (IOException e) { LOGGER.log(Level.FINE, "Can not set data", e); return false; } }
@Override public void checkMetadataStream( MetadataFixerResultImpl.Builder resultBuilder, PDFAFlavour flavour) { PDFAFlavour.Specification part = flavour.getPart(); if (part != PDFAFlavour.Specification.ISO_19005_1) { COSFilters filters = ((COSStream) this.stream.getDirectBase()).getFilters(); if (filters.size() == 1 && filters.getFilters().get(0) == ASAtom.FLATE_DECODE) { return; } try { ((COSStream) this.stream.getDirectBase()).setFilters(new COSFilters( COSName.construct(ASAtom.FLATE_DECODE))); this.doc.addChangedObject(stream); resultBuilder.addFix("Metadata stream filtered with FlateDecode"); } catch (IOException e) { LOGGER.log(Level.FINE, "Problems with setting filter for stream.", e); } } this.setRequiredDictionaryValue(ASAtom.METADATA, ASAtom.TYPE, resultBuilder); this.setRequiredDictionaryValue(ASAtom.getASAtom("XML"), ASAtom.SUBTYPE, resultBuilder); }