/** * Business logic that checks if a certain object is in conformance with PDF/X. * * @param key the type of PDF ISO conformance that has to be checked * @param obj1 the object that is checked for conformance */ public void checkPdfIsoConformance(int key, Object obj1) { if (writer == null || !writer.isPdfX()) return; int conf = writer.getPDFXConformance(); switch (key) { case PdfIsoKeys.PDFISOKEY_COLOR: switch (conf) { case PdfWriter.PDFX1A2001: if (obj1 instanceof ExtendedColor) { ExtendedColor ec = (ExtendedColor) obj1; switch (ec.getType()) { case ExtendedColor.TYPE_CMYK: case ExtendedColor.TYPE_GRAY: return; case ExtendedColor.TYPE_RGB: throw new PdfXConformanceException( MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed")); case ExtendedColor.TYPE_SEPARATION: SpotColor sc = (SpotColor) ec; checkPdfIsoConformance( PdfIsoKeys.PDFISOKEY_COLOR, sc.getPdfSpotColor().getAlternativeCS()); break; case ExtendedColor.TYPE_SHADING: ShadingColor xc = (ShadingColor) ec; checkPdfIsoConformance( PdfIsoKeys.PDFISOKEY_COLOR, xc.getPdfShadingPattern().getShading().getColorSpace()); break; case ExtendedColor.TYPE_PATTERN: PatternColor pc = (PatternColor) ec; checkPdfIsoConformance( PdfIsoKeys.PDFISOKEY_COLOR, pc.getPainter().getDefaultColor()); break; } } else if (obj1 instanceof BaseColor) throw new PdfXConformanceException( MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed")); break; } break; case PdfIsoKeys.PDFISOKEY_CMYK: break; case PdfIsoKeys.PDFISOKEY_RGB: if (conf == PdfWriter.PDFX1A2001) throw new PdfXConformanceException( MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed")); break; case PdfIsoKeys.PDFISOKEY_FONT: if (!((BaseFont) obj1).isEmbedded()) throw new PdfXConformanceException( MessageLocalization.getComposedMessage( "all.the.fonts.must.be.embedded.this.one.isn.t.1", ((BaseFont) obj1).getPostscriptFontName())); break; case PdfIsoKeys.PDFISOKEY_IMAGE: PdfImage image = (PdfImage) obj1; if (image.get(PdfName.SMASK) != null) throw new PdfXConformanceException( MessageLocalization.getComposedMessage("the.smask.key.is.not.allowed.in.images")); switch (conf) { case PdfWriter.PDFX1A2001: PdfObject cs = image.get(PdfName.COLORSPACE); if (cs == null) return; if (cs.isName()) { if (PdfName.DEVICERGB.equals(cs)) throw new PdfXConformanceException( MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed")); } else if (cs.isArray()) { if (PdfName.CALRGB.equals(((PdfArray) cs).getPdfObject(0))) throw new PdfXConformanceException( MessageLocalization.getComposedMessage("colorspace.calrgb.is.not.allowed")); } break; } break; case PdfIsoKeys.PDFISOKEY_GSTATE: PdfDictionary gs = (PdfDictionary) obj1; // The example PdfXPdfA threw a NullPointerException because gs was null if (gs == null) break; PdfObject obj = gs.get(PdfName.BM); if (obj != null && !PdfGState.BM_NORMAL.equals(obj) && !PdfGState.BM_COMPATIBLE.equals(obj)) throw new PdfXConformanceException( MessageLocalization.getComposedMessage("blend.mode.1.not.allowed", obj.toString())); obj = gs.get(PdfName.CA); double v = 0.0; if (obj != null && (v = ((PdfNumber) obj).doubleValue()) != 1.0) throw new PdfXConformanceException( MessageLocalization.getComposedMessage( "transparency.is.not.allowed.ca.eq.1", String.valueOf(v))); obj = gs.get(PdfName.ca); v = 0.0; if (obj != null && (v = ((PdfNumber) obj).doubleValue()) != 1.0) throw new PdfXConformanceException( MessageLocalization.getComposedMessage( "transparency.is.not.allowed.ca.eq.1", String.valueOf(v))); break; case PdfIsoKeys.PDFISOKEY_LAYER: throw new PdfXConformanceException( MessageLocalization.getComposedMessage("layers.are.not.allowed")); } }