public PdfObject getPdfObject(PdfWriter writer) { PdfArray array = new PdfArray(PdfName.LAB); PdfDictionary dictionary = new PdfDictionary(); if (whitePoint == null || whitePoint.length != 3 || whitePoint[0] < 0.000001f || whitePoint[2] < 0.000001f || whitePoint[1] < 0.999999f || whitePoint[1] > 1.000001f) throw new RuntimeException(MessageLocalization.getComposedMessage("lab.cs.white.point")); dictionary.put(PdfName.WHITEPOINT, new PdfArray(whitePoint)); if (blackPoint != null) { if (blackPoint.length != 3 || blackPoint[0] < -0.000001f || blackPoint[1] < -0.000001f || blackPoint[2] < -0.000001f) throw new RuntimeException(MessageLocalization.getComposedMessage("lab.cs.black.point")); dictionary.put(PdfName.BLACKPOINT, new PdfArray(blackPoint)); } if (range != null) { if (range.length != 4 || range[0] > range[1] || range[2] > range[3]) throw new RuntimeException(MessageLocalization.getComposedMessage("lab.cs.range")); dictionary.put(PdfName.RANGE, new PdfArray(range)); } array.add(dictionary); return array; }
/** * Creates a submit form. * * @param file the URI to submit the form to * @param names the objects to submit * @param flags submit properties * @return A PdfAction */ public static PdfAction createSubmitForm(String file, Object names[], int flags) { PdfAction action = new PdfAction(); action.put(PdfName.S, PdfName.SUBMITFORM); PdfDictionary dic = new PdfDictionary(); dic.put(PdfName.F, new PdfString(file)); dic.put(PdfName.FS, PdfName.URL); action.put(PdfName.F, dic); if (names != null) action.put(PdfName.FIELDS, buildArray(names)); action.put(PdfName.FLAGS, new PdfNumber(flags)); return action; }
/** * Adds or replaces a page label. * * @param page the real page to start the numbering. First page is 1 * @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS * @param text the text to prefix the number. Can be <CODE>null</CODE> or empty * @param firstPage the first logical page number */ public void addPageLabel(int page, int numberStyle, String text, int firstPage) { if (page < 1 || firstPage < 1) throw new IllegalArgumentException( MessageLocalization.getComposedMessage( "in.a.page.label.the.page.numbers.must.be.greater.or.equal.to.1")); PdfDictionary dic = new PdfDictionary(); if (numberStyle >= 0 && numberStyle < numberingStyle.length) dic.put(PdfName.S, numberingStyle[numberStyle]); if (text != null) dic.put(PdfName.P, new PdfString(text, PdfObject.TEXT_UNICODE)); if (firstPage != 1) dic.put(PdfName.ST, new PdfNumber(firstPage)); map.put(Integer.valueOf(page - 1), dic); }
/** * Launches an application or a document. * * @param application the application to be launched or the document to be opened or printed. * @param parameters (Windows-specific) A parameter string to be passed to the application. It can * be <CODE>null</CODE>. * @param operation (Windows-specific) the operation to perform: "open" - Open a document, "print" * - Print a document. It can be <CODE>null</CODE>. * @param defaultDir (Windows-specific) the default directory in standard DOS syntax. It can be * <CODE>null</CODE>. */ public PdfAction(String application, String parameters, String operation, String defaultDir) { put(PdfName.S, PdfName.LAUNCH); if (parameters == null && operation == null && defaultDir == null) put(PdfName.F, new PdfString(application)); else { PdfDictionary dic = new PdfDictionary(); dic.put(PdfName.F, new PdfString(application)); if (parameters != null) dic.put(PdfName.P, new PdfString(parameters)); if (operation != null) dic.put(PdfName.O, new PdfString(operation)); if (defaultDir != null) dic.put(PdfName.D, new PdfString(defaultDir)); put(PdfName.WIN, dic); } }
/** * Translate a PRDictionary to a PdfDictionary. Also translate all of the objects contained in it. */ protected PdfDictionary copyDictionary(PdfDictionary in) throws IOException, BadPdfFormatException { PdfDictionary out = new PdfDictionary(); PdfObject type = PdfReader.getPdfObjectRelease(in.get(PdfName.TYPE)); for (Object element : in.getKeys()) { PdfName key = (PdfName) element; PdfObject value = in.get(key); // System.out.println("Copy " + key); if (type != null && PdfName.PAGE.equals(type)) { if (!key.equals(PdfName.B) && !key.equals(PdfName.PARENT)) out.put(key, copyObject(value)); } else out.put(key, copyObject(value)); } return out; }
/** @see com.lowagie.tools.AbstractTool#execute() */ public static void execute(String srcvalue, String destvalue, String rotvalue) { try { if (StringUtils.isBlank(srcvalue)) { throw new InstantiationException("You need to choose a sourcefile"); } File src = new File(srcvalue); if (StringUtils.isBlank(destvalue)) { throw new InstantiationException("You need to choose a destination file"); } File dest = new File(destvalue); if (StringUtils.isBlank(rotvalue)) { throw new InstantiationException("You need to choose a rotation"); } int rotation = Integer.parseInt(rotvalue); // we create a reader for a certain document PdfReader reader = new PdfReader(src.getAbsolutePath()); // we retrieve the total number of pages and the page size int total = reader.getNumberOfPages(); System.out.println("There are " + total + " pages in the original file."); PdfDictionary pageDict; int currentRotation; for (int p = 1; p <= total; p++) { currentRotation = reader.getPageRotation(p); pageDict = reader.getPageN(p); pageDict.put(PdfName.ROTATE, new PdfNumber(currentRotation + rotation)); } PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); stamper.close(); } catch (Exception e) { e.printStackTrace(); } }
void createWidgets(ArrayList<Object> list, AcroFields.Item item) { for (int k = 0; k < item.size(); ++k) { list.add(item.getPage(k)); PdfDictionary merged = item.getMerged(k); PdfObject dr = merged.get(PdfName.DR); if (dr != null) PdfFormField.mergeResources(resources, (PdfDictionary) PdfReader.getPdfObject(dr)); PdfDictionary widget = new PdfDictionary(); for (Object element : merged.getKeys()) { PdfName key = (PdfName) element; if (widgetKeys.containsKey(key)) widget.put(key, merged.get(key)); } widget.put(iTextTag, new PdfNumber(item.getTabOrder(k).intValue() + 1)); list.add(widget); } }
private File convertPdfToPdfA(final InputStream source) throws IOException, DocumentException { final File pdfAFile = TempFileProvider.createTempFile("digitalSigning-" + System.currentTimeMillis(), ".pdf"); // Reads a PDF document. PdfReader reader = new PdfReader(source); // PdfStamper: Applies extra content to the pages of a PDF document. This extra content can be // all the objects allowed in // PdfContentByte including pages from other Pdfs. PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(pdfAFile)); // A generic Document class. Document document = new Document(); // we create a writer that listens to the document PdfWriter writer = stamper.getWriter(); int numberPages = reader.getNumberOfPages(); writer.setPDFXConformance(PdfWriter.PDFA1A); document.open(); // PdfDictionary:A dictionary is an associative table containing pairs of objects. // The first element of each pair is called the key and the second element is called the value // <CODE>PdfName</CODE> is an object that can be used as a name in a PDF-file PdfDictionary outi = new PdfDictionary(PdfName.OUTPUTINTENT); outi.put(PdfName.OUTPUTCONDITIONIDENTIFIER, new PdfString("sRGB IEC61966-2.1")); outi.put(PdfName.INFO, new PdfString("sRGB IEC61966-2.1")); outi.put(PdfName.S, PdfName.GTS_PDFA1); writer.getExtraCatalog().put(PdfName.OUTPUTINTENTS, new PdfArray(outi)); // Add pages PdfImportedPage p = null; Image image; for (int i = 0; i < numberPages; i++) { p = writer.getImportedPage(reader, i + 1); image = Image.getInstance(p); document.add(image); } writer.createXmpMetadata(); document.close(); // Add Metadata from source pdf HashMap<String, String> info = reader.getInfo(); stamper.setMoreInfo(info); stamper.close(); return pdfAFile; }
public void alterContents() throws IOException { if (over == null && under == null) return; PdfArray ar = null; PdfObject content = PdfReader.getPdfObject(pageN.get(PdfName.CONTENTS), pageN); if (content == null) { ar = new PdfArray(); pageN.put(PdfName.CONTENTS, ar); } else if (content.isArray()) { ar = (PdfArray) content; } else if (content.isStream()) { ar = new PdfArray(); ar.add(pageN.get(PdfName.CONTENTS)); pageN.put(PdfName.CONTENTS, ar); } else { ar = new PdfArray(); pageN.put(PdfName.CONTENTS, ar); } ByteBuffer out = new ByteBuffer(); if (under != null) { out.append(PdfContents.SAVESTATE); applyRotation(pageN, out); out.append(under.getInternalBuffer()); out.append(PdfContents.RESTORESTATE); } if (over != null) out.append(PdfContents.SAVESTATE); PdfStream stream = new PdfStream(out.toByteArray()); stream.flateCompress(cstp.getCompressionLevel()); PdfIndirectReference ref1 = cstp.addToBody(stream).getIndirectReference(); ar.addFirst(ref1); out.reset(); if (over != null) { out.append(' '); out.append(PdfContents.RESTORESTATE); out.append(PdfContents.SAVESTATE); applyRotation(pageN, out); out.append(over.getInternalBuffer()); out.append(PdfContents.RESTORESTATE); stream = new PdfStream(out.toByteArray()); stream.flateCompress(cstp.getCompressionLevel()); ar.add(cstp.addToBody(stream).getIndirectReference()); } pageN.put(PdfName.RESOURCES, pageResources.getResources()); }
PdfMediaClipData(String file, PdfFileSpecification fs, String mimeType) throws IOException { put(PdfName.TYPE, new PdfName("MediaClip")); put(PdfName.S, new PdfName("MCD")); put(PdfName.N, new PdfString("Media clip for " + file)); put(new PdfName("CT"), new PdfString(mimeType)); PdfDictionary dic = new PdfDictionary(); dic.put(new PdfName("TF"), new PdfString("TEMPACCESS")); put(new PdfName("P"), dic); put(PdfName.D, fs.getReference()); }
@SuppressWarnings("unchecked") void mergeField(String name, AcroFields.Item item) { HashMap<String, Object> map = fieldTree; StringTokenizer tk = new StringTokenizer(name, "."); if (!tk.hasMoreTokens()) return; while (true) { String s = tk.nextToken(); Object obj = map.get(s); if (tk.hasMoreTokens()) { if (obj == null) { obj = new HashMap(); map.put(s, obj); map = (HashMap<String, Object>) obj; continue; } else if (obj instanceof HashMap) map = (HashMap<String, Object>) obj; else return; } else { if (obj instanceof HashMap) return; PdfDictionary merged = item.getMerged(0); if (obj == null) { PdfDictionary field = new PdfDictionary(); if (PdfName.SIG.equals(merged.get(PdfName.FT))) hasSignature = true; for (Object element : merged.getKeys()) { PdfName key = (PdfName) element; if (fieldKeys.containsKey(key)) field.put(key, merged.get(key)); } ArrayList<Object> list = new ArrayList<Object>(); list.add(field); createWidgets(list, item); map.put(s, list); } else { ArrayList<Object> list = (ArrayList<Object>) obj; PdfDictionary field = (PdfDictionary) list.get(0); PdfName type1 = (PdfName) field.get(PdfName.FT); PdfName type2 = (PdfName) merged.get(PdfName.FT); if (type1 == null || !type1.equals(type2)) return; int flag1 = 0; PdfObject f1 = field.get(PdfName.FF); if (f1 != null && f1.isNumber()) flag1 = ((PdfNumber) f1).intValue(); int flag2 = 0; PdfObject f2 = merged.get(PdfName.FF); if (f2 != null && f2.isNumber()) flag2 = ((PdfNumber) f2).intValue(); if (type1.equals(PdfName.BTN)) { if (((flag1 ^ flag2) & PdfFormField.FF_PUSHBUTTON) != 0) return; if ((flag1 & PdfFormField.FF_PUSHBUTTON) == 0 && ((flag1 ^ flag2) & PdfFormField.FF_RADIO) != 0) return; } else if (type1.equals(PdfName.CH)) { if (((flag1 ^ flag2) & PdfFormField.FF_COMBO) != 0) return; } createWidgets(list, item); } return; } } }
/* * the getCatalog method is part of PdfWriter. * we wrap this so that we can extend it */ @Override protected PdfDictionary getCatalog(PdfIndirectReference rootObj) { try { PdfDictionary theCat = pdf.getCatalog(rootObj); if (fieldArray == null) { if (acroForm != null) theCat.put(PdfName.ACROFORM, acroForm); } else addFieldResources(theCat); return theCat; } catch (IOException e) { throw new ExceptionConverter(e); } }
@Override protected PdfDictionary getCatalog(PdfIndirectReference rootObj) { try { PdfDictionary cat = pdf.getCatalog(rootObj); if (form != null) { PdfIndirectReference ref = addToBody(form).getIndirectReference(); cat.put(PdfName.ACROFORM, ref); } return cat; } catch (IOException e) { throw new ExceptionConverter(e); } }
private Image indexedModel(byte bdata[], int bpc, int paletteEntries) throws BadElementException { Image img = new ImgRaw(width, height, 1, bpc, bdata); PdfArray colorspace = new PdfArray(); colorspace.add(PdfName.INDEXED); colorspace.add(PdfName.DEVICERGB); byte np[] = getPalette(paletteEntries); int len = np.length; colorspace.add(new PdfNumber(len / 3 - 1)); colorspace.add(new PdfString(np)); PdfDictionary ad = new PdfDictionary(); ad.put(PdfName.COLORSPACE, colorspace); img.setAdditional(ad); return img; }
/** Creates the new PDF by merging the fields and forms. */ protected void closeIt() throws IOException { for (int k = 0; k < readers.size(); ++k) { readers.get(k).removeFields(); } for (int r = 0; r < readers.size(); ++r) { PdfReader reader = readers.get(r); for (int page = 1; page <= reader.getNumberOfPages(); ++page) { pageRefs.add(getNewReference(reader.getPageOrigRef(page))); pageDics.add(reader.getPageN(page)); } } mergeFields(); createAcroForms(); for (int r = 0; r < readers.size(); ++r) { PdfReader reader = readers.get(r); for (int page = 1; page <= reader.getNumberOfPages(); ++page) { PdfDictionary dic = reader.getPageN(page); PdfIndirectReference pageRef = getNewReference(reader.getPageOrigRef(page)); PdfIndirectReference parent = root.addPageRef(pageRef); dic.put(PdfName.PARENT, parent); propagate(dic, pageRef, false); } } for (Map.Entry<PdfReader, IntHashtable> entry : readers2intrefs.entrySet()) { PdfReader reader = entry.getKey(); try { file = reader.getSafeFile(); file.reOpen(); IntHashtable t = entry.getValue(); int keys[] = t.toOrderedKeys(); for (int k = 0; k < keys.length; ++k) { PRIndirectReference ref = new PRIndirectReference(reader, keys[k]); addToBody(PdfReader.getPdfObjectRelease(ref), t.get(keys[k])); } } finally { try { file.close(); // TODO: Removed - the user should be responsible for closing all PdfReaders. But, this // could cause a lot of memory leaks in code out there that hasn't been properly closing // things - maybe add a finalizer to PdfReader that calls PdfReader#close() ?? // reader.close(); } catch (Exception e) { // empty on purpose } } } pdf.close(); }
private static void crop(String input) throws Exception { String output = input.replace(".pdf", "-crop.pdf"); PdfReader reader = new PdfReader(input); final int n = reader.getNumberOfPages(); Rectangle pageSize = reader.getPageSize(1); System.out.println("Input page size: " + pageSize); float left = (pageSize.getWidth() - kTextWidth) / 2 - kMargin; float right = pageSize.getWidth() - left; float bottom = (pageSize.getHeight() - kTextHeight) / 2; float top = pageSize.getHeight() - bottom; PdfRectangle rect = new PdfRectangle(left, bottom + kOffset, right, top + kOffset); for (int i = 1; i <= n; i++) { PdfDictionary pageDict = reader.getPageN(i); pageDict.put(PdfName.CROPBOX, rect); } PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(output)); stamper.close(); }
/** * Generates the font dictionary. * * @param descendant the descendant dictionary * @param subsetPrefix the subset prefix * @param toUnicode the ToUnicode stream * @return the stream */ public PdfDictionary getFontBaseType( PdfIndirectReference descendant, String subsetPrefix, PdfIndirectReference toUnicode) { PdfDictionary dic = new PdfDictionary(PdfName.FONT); dic.put(PdfName.SUBTYPE, PdfName.TYPE0); // The PDF Reference manual advises to add -encoding to CID font names if (cff) dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName + "-" + encoding)); // dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix+fontName)); else dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName)); // dic.put(PdfName.BASEFONT, new PdfName(fontName)); dic.put(PdfName.ENCODING, new PdfName(encoding)); dic.put(PdfName.DESCENDANTFONTS, new PdfArray(descendant)); if (toUnicode != null) dic.put(PdfName.TOUNICODE, toUnicode); return dic; }
protected void setColorSpace(BaseColor color) { cspace = color; int type = ExtendedColor.getType(color); PdfObject colorSpace = null; switch (type) { case ExtendedColor.TYPE_GRAY: { colorSpace = PdfName.DEVICEGRAY; break; } case ExtendedColor.TYPE_CMYK: { colorSpace = PdfName.DEVICECMYK; break; } case ExtendedColor.TYPE_SEPARATION: { SpotColor spot = (SpotColor) color; colorDetails = writer.addSimple(spot.getPdfSpotColor()); colorSpace = colorDetails.getIndirectReference(); break; } case ExtendedColor.TYPE_DEVICEN: { DeviceNColor deviceNColor = (DeviceNColor) color; colorDetails = writer.addSimple(deviceNColor.getPdfDeviceNColor()); colorSpace = colorDetails.getIndirectReference(); break; } case ExtendedColor.TYPE_PATTERN: case ExtendedColor.TYPE_SHADING: { throwColorSpaceError(); } default: colorSpace = PdfName.DEVICERGB; break; } shading.put(PdfName.COLORSPACE, colorSpace); }
protected void createAcroForms() throws IOException { if (fieldTree.isEmpty()) return; form = new PdfDictionary(); form.put(PdfName.DR, resources); propagate(resources, null, false); if (needAppearances) { form.put(PdfName.NEEDAPPEARANCES, PdfBoolean.PDFTRUE); } form.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g ")); tabOrder = new HashMap<PdfArray, ArrayList<Integer>>(); calculationOrderRefs = new ArrayList<Object>(calculationOrder); form.put(PdfName.FIELDS, branchForm(fieldTree, null, "")); if (hasSignature) form.put(PdfName.SIGFLAGS, new PdfNumber(3)); PdfArray co = new PdfArray(); for (int k = 0; k < calculationOrderRefs.size(); ++k) { Object obj = calculationOrderRefs.get(k); if (obj instanceof PdfIndirectReference) co.add((PdfIndirectReference) obj); } if (co.size() > 0) form.put(PdfName.CO, co); }
/** * Text that shall be used as the decimal position in displaying numerical values. An empty string * indicates that the default shall be used.<br> * Default value: PERIOD "\u002E" * * @param dc */ public void setDecimalChartacter(PdfString dc) { super.put(PdfName.RD, dc); }
/** * Constructs a <CODE>PdfDictionary</CODE>-object of a certain type. * * @param type a <CODE>PdfName</CODE> */ public PdfDictionary(final PdfName type) { this(); dictionaryType = type; put(PdfName.TYPE, dictionaryType); }
/** * Text that shall be concatenated after the label specified by setLabel. An empty string * indicates that no text shall be added.<br> * Default value: A single ASCII SPACE character "\u0020" * * @param ss */ public void setLabelRightString(PdfString ss) { super.put(PdfName.SS, ss); }
/** * Text that shall be concatenated to the left of the label specified by setLabel. An empty string * indicates that no text shall be added.<br> * Default value: A single ASCII SPACE character "\u0020" * * @param ps */ public void setLabelLeftString(PdfString ps) { super.put(PdfName.PS, ps); }
/** * A text string specifying a label for displaying the units represented by this NumberFormat in a * user interface; the label should use a universally recognized abbreviation. * * @param label */ public void setLabel(PdfString label) { super.put(PdfName.U, label); }
/** * A name indicating the position of the label specified by setLabel with respect to the * calculated unit value. The characters specified by setLabelLeftString and setLabelRightString * shall be concatenated before considering this entry. Default value: suffix. * * @param pos PdfName.S or PdfName.P */ public void setLabelPosition(PdfName pos) { super.put(PdfName.O, pos); }
/** * The conversion factor used to multiply a value in partial units of the previous number format * array element to obtain a value in the units of this dictionary. When this entry is in the * first number format in the array, its meaning (that is, what it shall be multiplied by) depends * on which entry in the RectilinearMeasure references the NumberFormat array. * * @param n */ public void setConversionFactor(PdfNumber n) { super.put(PdfName.C, n); }
/** * Indicate whether and in what manner to display a fractional value from the result of converting * to the units of this NumberFormat means of the conversion factor entry. * * @param f */ public void setFractionalValue(Fraction f) { super.put(PdfName.F, f.getPdfName()); }
/** * Associates the specified <CODE>PdfObject</CODE> as value to the specified <CODE>PdfName</CODE> * as key in this map. * * <p>If the <VAR>value</VAR> is a <CODE>PdfNull</CODE>, it is treated just as any other <CODE> * PdfObject</CODE>. If the <VAR>value</VAR> is <CODE>null</CODE> however nothing is done. * * @param key a <CODE>PdfName</CODE> * @param value the <CODE>PdfObject</CODE> to be associated to the <VAR>key</VAR> */ public void putEx(final PdfName key, final PdfObject value) { if (value == null) return; put(key, value); }
/** * Generates the CIDFontTyte2 dictionary. * * @param fontDescriptor the indirect reference to the font descriptor * @param subsetPrefix the subset prefix * @param metrics the horizontal width metrics * @return a stream */ public PdfDictionary getCIDFontType2( PdfIndirectReference fontDescriptor, String subsetPrefix, Object metrics[]) { PdfDictionary dic = new PdfDictionary(PdfName.FONT); // sivan; cff if (cff) { dic.put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE0); dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName + "-" + encoding)); } else { dic.put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE2); dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName)); } dic.put(PdfName.FONTDESCRIPTOR, fontDescriptor); if (!cff) dic.put(PdfName.CIDTOGIDMAP, PdfName.IDENTITY); PdfDictionary cdic = new PdfDictionary(); cdic.put(PdfName.REGISTRY, new PdfString("Adobe")); cdic.put(PdfName.ORDERING, new PdfString("Identity")); cdic.put(PdfName.SUPPLEMENT, new PdfNumber(0)); dic.put(PdfName.CIDSYSTEMINFO, cdic); if (!vertical) { dic.put(PdfName.DW, new PdfNumber(1000)); StringBuffer buf = new StringBuffer("["); int lastNumber = -10; boolean firstTime = true; for (int k = 0; k < metrics.length; ++k) { int metric[] = (int[]) metrics[k]; if (metric[1] == 1000) continue; int m = metric[0]; if (m == lastNumber + 1) { buf.append(' ').append(metric[1]); } else { if (!firstTime) { buf.append(']'); } firstTime = false; buf.append(m).append('[').append(metric[1]); } lastNumber = m; } if (buf.length() > 1) { buf.append("]]"); dic.put(PdfName.W, new PdfLiteral(buf.toString())); } } return dic; }
public void addToBody() throws IOException { if (bBox != null) shading.put(PdfName.BBOX, new PdfArray(bBox)); if (antiAlias) shading.put(PdfName.ANTIALIAS, PdfBoolean.PDFTRUE); writer.addToBody(shading, getShadingReference()); }