private bool CheckImages() { bool flag; try { foreach (PDPage page in this.doc.getPages()) { PDResources resources = page.getResources(); Iterator iterator = resources.getXObjectNames().iterator(); while (iterator.hasNext()) { COSName cOSName = (COSName)iterator.next(); if (resources.isImageXObject(cOSName)) { PDXObject xObject = null; try { xObject = resources.getXObject(cOSName); } catch (Exception exception) { continue; } PDImageXObject pDImageXObject = (PDImageXObject)xObject; COSBase filters = pDImageXObject.getCOSStream().getFilters(); if (filters != null) { if ((filters.toString().ToLower().Contains("jpxdecode") ? true : filters.toString().ToLower().Contains("lzw"))) { flag = false; return(flag); } } if (pDImageXObject.getSoftMask() != null) { pDImageXObject.setColorSpace(null); } PDImageXObject mask = pDImageXObject.getMask(); pDImageXObject.getSoftMask(); if (mask != null) { pDImageXObject.setColorSpace(null); } } } } flag = true; } catch (Exception exception1) { flag = false; } return(flag); }
/** * Embeds an external file (generic - any type allowed) in the PDF. * * @param doc * PDDocument to attach the file to. * @param filename * name of the file that will become attachment name in the PDF * @param relationship * how the file relates to the content, e.g. "Alternative" * @param description * Human-readable description of the file content * @param subType * type of the data e.g. could be "text/xml" - mime like * @param data * the binary data of the file/attachment */ public void PDFAttachGenericFile(PDDocument doc, String filename, String relationship, String description, String subType, byte[] data) { PDComplexFileSpecification fs = new PDComplexFileSpecification(); fs.setFile(filename); COSDictionary dict = fs.getCOSDictionary(); dict.setName("AFRelationship", relationship); dict.setString("UF", filename); dict.setString("Desc", description); ByteArrayInputStream fakeFile = new ByteArrayInputStream(data); PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile); ef.setSubtype(subType); ef.setSize(data.Length); ef.setCreationDate(new GregorianCalendar()); ef.setModDate(GregorianCalendar.getInstance()); fs.setEmbeddedFile(ef); // In addition make sure the embedded file is set under /UF dict = fs.getCOSDictionary(); COSDictionary efDict = (COSDictionary)dict .getDictionaryObject(COSName.EF); COSBase lowerLevelFile = efDict.getItem(COSName.F); efDict.setItem(COSName.UF, lowerLevelFile); // now add the entry to the embedded file tree and set in the document. PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog()); PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles(); if (efTree == null) { efTree = new PDEmbeddedFilesNameTreeNode(); } //Map<String, COSObjectable> namesMap = new HashMap<String, COSObjectable>(); // Map<String, COSObjectable> oldNamesMap = efTree.getNames(); //if (oldNamesMap != null) { // for (String key : oldNamesMap.keySet()) { // namesMap.put(key, oldNamesMap.get(key)); // } //} //efTree.setNames(namesMap); //should be ported more exactly... efTree.setNames(Collections.singletonMap(filename, fs)); names.setEmbeddedFiles(efTree); doc.getDocumentCatalog().setNames(names); // AF entry (Array) in catalog with the FileSpec COSArray cosArray = (COSArray)doc.getDocumentCatalog() .getCOSDictionary().getItem("AF"); if (cosArray == null) { cosArray = new COSArray(); } cosArray.add(fs); COSDictionary dict2 = doc.getDocumentCatalog().getCOSDictionary(); COSArray array = new COSArray(); array.add(fs.getCOSDictionary()); // see below dict2.setItem("AF", array); doc.getDocumentCatalog().getCOSDictionary().setItem("AF", cosArray); }