jeremias 2003/03/27 03:02:36 Modified: src/java/org/apache/fop/pdf PDFXObject.java Log: Adjust to the PDF Stream changes. Revision Changes Path 1.2 +114 -98 xml-fop/src/java/org/apache/fop/pdf/PDFXObject.java Index: PDFXObject.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/pdf/PDFXObject.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- PDFXObject.java 11 Mar 2003 13:05:09 -0000 1.1 +++ PDFXObject.java 27 Mar 2003 11:02:36 -0000 1.2 @@ -67,7 +67,8 @@ * This is used as a reference for inserting the same image in the * document in another place. */ -public class PDFXObject extends PDFObject { +public class PDFXObject extends AbstractPDFStream { + private PDFImage pdfimage; private int xnum; @@ -75,12 +76,11 @@ * create an XObject with the given number and name and load the * image in the object * - * @param number the pdf object number * @param xnumber the pdf object X number * @param img the pdf image that contains the image data */ - public PDFXObject(int number, int xnumber, PDFImage img) { - super(number); + public PDFXObject(int xnumber, PDFImage img) { + super(); this.xnum = xnumber; pdfimage = img; } @@ -103,111 +103,127 @@ * @return the length of the data written */ protected int output(OutputStream stream) throws IOException { - int length = 0; - int i = 0; + int length = super.output(stream); + + // let it gc + // this object is retained as a reference to inserting + // the same image but the image data is no longer needed + pdfimage = null; + return length; + } + /** + * @see org.apache.fop.pdf.AbstractPDFStream#buildStreamDict(String) + */ + protected String buildStreamDict(String lengthEntry) { + String dictEntries = getFilterList().buildFilterDictEntries(); if (pdfimage.isPS()) { - length = outputEPSImage(stream); + return buildDictionaryFromPS(lengthEntry, dictEntries); } else { + return buildDictionaryFromImage(lengthEntry, dictEntries); + } + } + + private String buildDictionaryFromPS(String lengthEntry, + String dictEntries) { + StringBuffer sb = new StringBuffer(128); + sb.append(getObjectID()); + sb.append("<</Type /XObject\n"); + sb.append("/Subtype /PS\n"); + sb.append("/Length " + lengthEntry); + + sb.append(dictEntries); + sb.append("\n>>\n"); + return sb.toString(); + } - PDFStream imgStream = pdfimage.getDataStream(); + private String buildDictionaryFromImage(String lengthEntry, + String dictEntries) { + StringBuffer sb = new StringBuffer(128); + sb.append(getObjectID()); + sb.append("<</Type /XObject\n"); + sb.append("/Subtype /Image\n"); + sb.append("/Name /Im" + xnum + "\n"); + sb.append("/Length " + lengthEntry + "\n"); + sb.append("/Width " + pdfimage.getWidth() + "\n"); + sb.append("/Height " + pdfimage.getHeight() + "\n"); + sb.append("/BitsPerComponent " + pdfimage.getBitsPerPixel() + "\n"); + + PDFICCStream pdfICCStream = pdfimage.getICCStream(); + if (pdfICCStream != null) { + sb.append("/ColorSpace [/ICCBased " + + pdfICCStream.referencePDF() + "]\n"); + } else { + PDFColorSpace cs = pdfimage.getColorSpace(); + sb.append("/ColorSpace /" + cs.getColorSpacePDFString() + + "\n"); + } - String dictEntries = imgStream.applyFilters(); + /* PhotoShop generates CMYK values that's inverse, + this will invert the values - too bad if it's not + a PhotoShop image... + */ + if (pdfimage.getColorSpace().getColorSpace() + == PDFColorSpace.DEVICE_CMYK) { + sb.append("/Decode [ 1.0 0.0 1.0 0.0 1.0 0.0 1.1 0.0 ]\n"); + } - String p = this.number + " " + this.generation + " obj\n"; - p = p + "<</Type /XObject\n"; - p = p + "/Subtype /Image\n"; - p = p + "/Name /Im" + xnum + "\n"; - p = p + "/Length " + (imgStream.getDataLength() + 1) + "\n"; - p = p + "/Width " + pdfimage.getWidth() + "\n"; - p = p + "/Height " + pdfimage.getHeight() + "\n"; - p = p + "/BitsPerComponent " + pdfimage.getBitsPerPixel() - + "\n"; - - PDFICCStream pdfICCStream = pdfimage.getICCStream(); - if (pdfICCStream != null) { - p = p + "/ColorSpace [/ICCBased " - + pdfICCStream.referencePDF() + "]\n"; - } else { - PDFColorSpace cs = pdfimage.getColorSpace(); - p = p + "/ColorSpace /" + cs.getColorSpacePDFString() - + "\n"; - } - - /* PhotoShop generates CMYK values that's inverse, - this will invert the values - too bad if it's not - a PhotoShop image... - */ - if (pdfimage.getColorSpace().getColorSpace() - == PDFColorSpace.DEVICE_CMYK) { - p = p + "/Decode [ 1.0 0.0 1.0 0.0 1.0 0.0 1.1 0.0 ]\n"; - } - - if (pdfimage.isTransparent()) { - PDFColor transp = pdfimage.getTransparentColor(); - p = p + "/Mask [" + transp.red255() + " " - + transp.red255() + " " + transp.green255() - + " " + transp.green255() + " " - + transp.blue255() + " " + transp.blue255() + "]\n"; - } - String ref = pdfimage.getSoftMask(); - if (ref != null) { - p = p + "/SMask " + ref + "\n"; - } - - p = p + dictEntries; - p = p + ">>\n"; - - // push the pdf dictionary on the writer - byte[] pdfBytes = p.getBytes(); - stream.write(pdfBytes); - length += pdfBytes.length; - // push all the image data on the writer - // and takes care of length for trailer - length += imgStream.outputStreamData(stream); - - pdfBytes = ("endobj\n").getBytes(); - stream.write(pdfBytes); - length += pdfBytes.length; + if (pdfimage.isTransparent()) { + PDFColor transp = pdfimage.getTransparentColor(); + sb.append("/Mask [" + + transp.red255() + " " + + transp.red255() + " " + + transp.green255() + " " + + transp.green255() + " " + + transp.blue255() + " " + + transp.blue255() + "]\n"); + } + String ref = pdfimage.getSoftMask(); + if (ref != null) { + sb.append("/SMask " + ref + "\n"); } - // let it gc - // this object is retained as a reference to inserting - // the same image but the image data is no longer needed - pdfimage = null; - return length; - } - byte[] toPDF() { - return null; + sb.append(dictEntries); + sb.append("\n>>\n"); + return sb.toString(); + } + + /** + * @see org.apache.fop.pdf.PDFStream#outputRawStreamData(OutputStream) + */ + protected void outputRawStreamData(OutputStream out) throws IOException { + pdfimage.outputContents(out); } - private int outputEPSImage(OutputStream stream) throws IOException { - int length = 0; - int i = 0; - - PDFStream imgStream = pdfimage.getDataStream(); - String dictEntries = imgStream.applyFilters(); - - String p = this.number + " " + this.generation + " obj\n"; - p = p + "<</Type /XObject\n"; - p = p + "/Subtype /PS\n"; - p = p + "/Length " + (imgStream.getDataLength() + 1); - - p = p + dictEntries; - p = p + ">>\n"; - - // push the pdf dictionary on the writer - byte[] pdfBytes = p.getBytes(); - stream.write(pdfBytes); - length += pdfBytes.length; - // push all the image data on the writer and takes care of length for trailer - length += imgStream.outputStreamData(stream); - - pdfBytes = ("endobj\n").getBytes(); - stream.write(pdfBytes); - length += pdfBytes.length; + /** + * @see org.apache.fop.pdf.AbstractPDFStream#getSizeHint() + */ + protected int getSizeHint() throws IOException { + return 0; + } - return length; + /** + * @see org.apache.fop.pdf.AbstractPDFStream#prepareImplicitFilters() + */ + protected void prepareImplicitFilters() { + if (pdfimage.isDCT()) { + getFilterList().ensureDCTFilterInPlace(); + } + } + + /** + * This sets up the default filters for XObjects. It uses the PDFImage + * instance to determine what default filters to apply. + * @see org.apache.fop.pdf.AbstractPDFStream#setupFilterList() + */ + protected void setupFilterList() { + if (!getFilterList().isInitialized()) { + getFilterList().addDefaultFilters( + getDocumentSafely().getFilterMap(), + pdfimage.getFilterHint()); + } + super.setupFilterList(); } + }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]