blob: 317f9af5712dbde29b388fa4855bf68628d5e51d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.xmlgraphics.ps.dsc.tools;
import java.io.IOException;
import org.apache.xmlgraphics.ps.DSCConstants;
import org.apache.xmlgraphics.ps.PSGenerator;
import org.apache.xmlgraphics.ps.dsc.DSCException;
import org.apache.xmlgraphics.ps.dsc.DSCParser;
import org.apache.xmlgraphics.ps.dsc.DSCParserConstants;
import org.apache.xmlgraphics.ps.dsc.events.DSCComment;
import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
import org.apache.xmlgraphics.ps.dsc.events.DSCHeaderComment;
import org.apache.xmlgraphics.ps.dsc.events.PostScriptComment;
/**
* Helper methods commonly used when dealing with DSC-compliant PostScript files.
*/
public class DSCTools implements DSCParserConstants {
/**
* Indicates whether the given event ends a header comment section according to the rules in
* DSC 3.0, chapter 4.4.
* @param event the event to check
* @return true if a header comment section would be ended either explicitely or implicitely
* by the given event
*/
public static boolean headerCommentsEndHere(DSCEvent event) {
switch (event.getEventType()) {
case DSC_COMMENT:
DSCComment comment = event.asDSCComment();
return (comment.getName().equals(DSCConstants.END_COMMENTS));
case COMMENT:
String s = ((PostScriptComment)event).getComment();
if (s == null || s.length() == 0) {
return true;
} else {
char c = s.charAt(0);
return ("\n\t ".indexOf(c) >= 0);
}
default:
return true;
}
}
/**
* Verifies that the file being parsed is a DSC 3.0 file.
* @param parser the DSC parser
* @return the header comment event
* @throws DSCException In case of a violation of the DSC spec
* @throws IOException In case of an I/O problem
*/
public static DSCHeaderComment checkAndSkipDSC30Header(DSCParser parser)
throws DSCException, IOException {
if (!parser.hasNext()) {
throw new DSCException("File has no content");
}
DSCEvent event = parser.nextEvent();
if (event.getEventType() == HEADER_COMMENT) {
DSCHeaderComment header = (DSCHeaderComment)event;
if (!header.isPSAdobe30()) {
throw new DSCException("PostScript file does not start with '"
+ DSCConstants.PS_ADOBE_30 + "'");
}
return header;
} else {
throw new DSCException("PostScript file does not start with '"
+ DSCConstants.PS_ADOBE_30 + "'");
}
}
/**
* Advances the parser to the next page or to the trailer or the end of file comment.
* @param parser the DSC parser
* @param gen the PSGenerator instance to pass the skipped events through to
* @return the DSC comment found (Page, Trailer or EOF)
* @throws IOException In case of an I/O error
* @throws DSCException In case of a violation of the DSC spec
*/
public static DSCComment nextPageOrTrailer(DSCParser parser, PSGenerator gen)
throws IOException, DSCException {
while (parser.hasNext()) {
DSCEvent event = parser.nextEvent();
if (event.getEventType() == DSC_COMMENT) {
DSCComment comment = event.asDSCComment();
if (DSCConstants.PAGE.equals(comment.getName())) {
return comment;
} else if (DSCConstants.TRAILER.equals(comment.getName())) {
return comment;
}
} else if (event.getEventType() == EOF) {
//The Trailer may be missing
return event.asDSCComment();
}
if (gen != null) {
event.generate(gen); //Pipe through to PSGenerator
}
}
return null;
}
}