/** * Get the {@link PdfDictionary} object that that contain resources of specified type. * * @param resType the resource type. Should be {@link PdfName#ColorSpace}, {@link PdfName#ExtGState}, * {@link PdfName#Pattern}, {@link PdfName#Shading}, {@link PdfName#XObject}, {@link PdfName#Font}. * @return the {@link PdfDictionary} object containing all resources of specified type, * or {@code null} in case of incorrect resource type. */ public PdfDictionary getResource(PdfName resType) { return getPdfObject().getAsDictionary(resType); }
/** * Sets the array of predefined procedure set names (see ISO-320001 Paragraph 14.2). * Deprecated in PDF 2.0. * * @param array the array of predefined procedure set names to be set. */ public void setProcSet(PdfArray array) { getPdfObject().put(PdfName.ProcSet, array); }
/** * Gets the array of predefined procedure set names (see ISO-320001 Paragraph 14.2). * Deprecated in PDF 2.0. * * @return the array of predefined procedure set names. */ public PdfArray getProcSet() { return getPdfObject().getAsArray(PdfName.ProcSet); }
/** * Sets {@link PdfResources} object. * * @param pdfResources {@link PdfResources} to set. * @return this {@link PdfPage} instance. */ public PdfPage setResources(PdfResources pdfResources) { put(PdfName.Resources, pdfResources.getPdfObject()); this.resources = pdfResources; return this; }
/** * Gets the names of all the added resources. * * @return the name of all the added resources. */ public Set<PdfName> getResourceNames() { Set<PdfName> names = new TreeSet<>(); // TODO: isn't it better to use HashSet? Do we really need certain order? for (PdfName resType : getPdfObject().keySet()) { names.addAll(getResourceNames(resType)); } return names; }
/** * Gets the names of all resources of specified type. * * @param resType the resource type. Should be {@link PdfName#ColorSpace}, {@link PdfName#ExtGState}, * {@link PdfName#Pattern}, {@link PdfName#Shading}, {@link PdfName#XObject}, {@link PdfName#Font}. * @return set of resources name of corresponding type. May be empty. * Will be empty in case of incorrect resource type. */ public Set<PdfName> getResourceNames(PdfName resType) { PdfDictionary resourceCategory = getPdfObject().getAsDictionary(resType); return resourceCategory == null ? new TreeSet<PdfName>() : resourceCategory.keySet(); // TODO: TreeSet or HashSet enough? }
protected void addResource(PdfObject resource, PdfName resType, PdfName resName) { if (resType.equals(PdfName.XObject)) { checkAndResolveCircularReferences(resource); } if (readOnly) { setPdfObject(getPdfObject().clone(Collections.<PdfName>emptyList())); buildResources(getPdfObject()); isModified = true; readOnly = false; } if (getPdfObject().containsKey(resType) && getPdfObject().getAsDictionary(resType).containsKey(resName)) return; resourceToName.put(resource, resName); PdfDictionary resourceCategory = getPdfObject().getAsDictionary(resType); if (resourceCategory == null) { getPdfObject().put(resType, resourceCategory = new PdfDictionary()); } resourceCategory.put(resName, resource); }
protected void buildResources(PdfDictionary dictionary) { for (PdfName resourceType : dictionary.keySet()) { if (getPdfObject().get(resourceType) == null) { getPdfObject().put(resourceType, new PdfDictionary()); } PdfDictionary resources = dictionary.getAsDictionary(resourceType); if (resources == null) { continue; } for (PdfName resourceName : resources.keySet()) { PdfObject resource = resources.get(resourceName, false); resourceToName.put(resource, resourceName); } } }
static PdfColorSpace determineColorSpace(PdfName colorSpace, PdfCanvasProcessor processor) { PdfColorSpace pdfColorSpace = null; if (PdfColorSpace.directColorSpaces.contains(colorSpace)) { pdfColorSpace = PdfColorSpace.makeColorSpace(colorSpace); } else { PdfResources pdfResources = processor.getResources(); PdfDictionary resourceColorSpace = pdfResources.getPdfObject().getAsDictionary(PdfName.ColorSpace); pdfColorSpace = PdfColorSpace.makeColorSpace(resourceColorSpace.get(colorSpace)); } return pdfColorSpace; } }
private void checkPage(PdfPage page) { PdfDictionary pageDict = page.getPdfObject(); if (isAlreadyChecked(pageDict)) return; checkPageObject(pageDict, page.getResources().getPdfObject()); PdfDictionary pageResources = page.getResources().getPdfObject(); checkResources(pageResources); checkAnnotations(pageDict); checkPageSize(pageDict); int contentStreamCount = page.getContentStreamCount(); for (int j = 0; j < contentStreamCount; ++j) { checkedObjects.add(page.getContentStream(j)); } }
private void checkPage(PdfPage page) { PdfDictionary pageDict = page.getPdfObject(); if (isAlreadyChecked(pageDict)) return; checkPageObject(pageDict, page.getResources().getPdfObject()); PdfDictionary pageResources = page.getResources().getPdfObject(); checkResources(pageResources); checkAnnotations(pageDict); checkPageSize(pageDict); int contentStreamCount = page.getContentStreamCount(); for (int j = 0; j < contentStreamCount; ++j) { checkedObjects.add(page.getContentStream(j)); } }
/** * Creates form XObject from page content. * The page shall be from the document, to which FormXObject will be added. * * @param page an instance of {@link PdfPage} */ public PdfFormXObject(PdfPage page) { this(page.getCropBox()); getPdfObject().getOutputStream().writeBytes(page.getContentBytes()); resources = new PdfResources((PdfDictionary) page.getResources().getPdfObject().clone()); getPdfObject().put(PdfName.Resources, resources.getPdfObject()); }
private void checkAndResolveCircularReferences(PdfObject pdfObject) { // Consider the situation when an XObject references the resources of the first page. // We add this XObject to the first page, there is no need to resolve any circular references // and then we flush this object and try to add it to the second page. // Now there are circular references and we cannot resolve them because the object is flushed // and we cannot get resources. // On the other hand, this situation may occur any time when object is already flushed and we // try to add it to resources and it seems difficult to overcome this without keeping /Resources key value. if (pdfObject instanceof PdfDictionary && !pdfObject.isFlushed()) { PdfDictionary pdfXObject = (PdfDictionary) pdfObject; PdfObject pdfXObjectResources = pdfXObject.get(PdfName.Resources); if (pdfXObjectResources != null && pdfXObjectResources.getIndirectReference() != null) { if (pdfXObjectResources.getIndirectReference().equals(getPdfObject().getIndirectReference())) { PdfObject cloneResources = getPdfObject().clone(); cloneResources.makeIndirect(getPdfObject().getIndirectReference().getDocument()); pdfXObject.put(PdfName.Resources, cloneResources.getIndirectReference()); } } } }
/** * Generates new (unique) resource name. * * @param resources the {@link PdfResources} object for which name will be generated. * @return new (unique) resource name. */ public PdfName generate(PdfResources resources) { PdfName newName = new PdfName(prefix + counter++); PdfDictionary r = resources.getPdfObject(); if (r.containsKey(resourceType)) { while (r.getAsDictionary(resourceType).containsKey(newName)) { newName = new PdfName(prefix + counter++); } } return newName; } }
private void flushResourcesContentStreams() { flushResourcesContentStreams(getResources().getPdfObject()); PdfArray annots = getAnnots(false); if (annots != null) { for (int i = 0; i < annots.size(); ++i) { PdfDictionary apDict = annots.getAsDictionary(i).getAsDictionary(PdfName.AP); if (apDict != null) { flushAppearanceStreams(apDict); } } } }
/** * Copies page as FormXObject to the specified document. * * @param toDocument a document to copy to. * @return copied {@link PdfFormXObject} object. */ public PdfFormXObject copyAsFormXObject(PdfDocument toDocument) throws IOException { PdfFormXObject xObject = new PdfFormXObject(getCropBox()); List<PdfName> excludedKeys = new ArrayList<>(Arrays.asList(PdfName.MediaBox, PdfName.CropBox, PdfName.Contents) ); excludedKeys.addAll(this.excludedKeys); PdfDictionary dictionary = getPdfObject().copyTo(toDocument, excludedKeys, true); xObject.getPdfObject().getOutputStream().write(getContentBytes()); xObject.getPdfObject().mergeDifferent(dictionary); //Copy inherited resources if (!xObject.getPdfObject().containsKey(PdfName.Resources)) { PdfObject copyResource = getResources().getPdfObject().copyTo(toDocument, true); xObject.getPdfObject().put(PdfName.Resources, copyResource); } return xObject; }
PdfDictionary currentColorSpaces = null; if (resources != null) { currentColorSpaces = resources.getPdfObject().getAsDictionary(PdfName.ColorSpace);
public Tiling(Rectangle bbox, float xStep, float yStep, boolean colored) { super(new PdfStream()); getPdfObject().put(PdfName.Type, PdfName.Pattern); getPdfObject().put(PdfName.PatternType, new PdfNumber(1)); getPdfObject().put(PdfName.PaintType, new PdfNumber(colored ? PaintType.COLORED : PaintType.UNCOLORED)); getPdfObject().put(PdfName.TilingType, new PdfNumber(TilingType.CONSTANT_SPACING)); getPdfObject().put(PdfName.BBox, new PdfArray(bbox)); getPdfObject().put(PdfName.XStep, new PdfNumber(xStep)); getPdfObject().put(PdfName.YStep, new PdfNumber(yStep)); resources = new PdfResources(); getPdfObject().put(PdfName.Resources, resources.getPdfObject()); }
private void copyInheritedProperties(PdfPage copyPdfPage, PdfDocument pdfDocument) { if (copyPdfPage.getPdfObject().get(PdfName.Resources) == null) { PdfObject copyResource = pdfDocument.getWriter().copyObject(getResources().getPdfObject(), pdfDocument, false); copyPdfPage.getPdfObject().put(PdfName.Resources, copyResource); } if (copyPdfPage.getPdfObject().get(PdfName.MediaBox) == null) { //media box shall be in any case copyPdfPage.setMediaBox(getMediaBox()); } if (copyPdfPage.getPdfObject().get(PdfName.CropBox) == null) { //original pdfObject don't have CropBox, otherwise copyPdfPage will contain it PdfArray cropBox = (PdfArray) getInheritedValue(PdfName.CropBox, PdfObject.ARRAY); //crop box is optional, we shall not set default value. if (cropBox != null) { copyPdfPage.put(PdfName.CropBox, cropBox.copyTo(pdfDocument)); } } if (copyPdfPage.getPdfObject().get(PdfName.Rotate) == null) { //original pdfObject don't have Rotate, otherwise copyPdfPage will contain it PdfNumber rotate = (PdfNumber) getInheritedValue(PdfName.Rotate, PdfObject.NUMBER); //rotate is optional, we shall not set default value. if (rotate != null) { copyPdfPage.put(PdfName.Rotate, rotate.copyTo(pdfDocument)); } } }
getPdfObject().put(PdfName.Resources, resources.getPdfObject());