, . , . RemoveAllText.java , ExtGState . , , //TODO .
public static void main(String[] args) throws IOException
{
if( args.length != 2 )
{
usage();
}
else
{
try (PDDocument document = PDDocument.load(new File(args[0])))
{
if (document.isEncrypted())
{
System.err.println(
"Error: Encrypted documents are not supported for this example.");
System.exit(1);
}
for (PDPage page : document.getPages())
{
insertOverprint(page, document);
}
document.save(args[1]);
}
}
}
private static void insertOverprint(PDPage page, PDDocument document) throws IOException
{
PDExtendedGraphicsState extGStateNonStrokingOverprintCtrlTrue = new PDExtendedGraphicsState();
extGStateNonStrokingOverprintCtrlTrue.setNonStrokingOverprintControl(true);
COSName nameExtGStateNonStrokingOverprintCtrlTrue = page.getResources().add(extGStateNonStrokingOverprintCtrlTrue);
PDExtendedGraphicsState extGStateStrokingOverprintCtrlTrue = new PDExtendedGraphicsState();
extGStateStrokingOverprintCtrlTrue.setStrokingOverprintControl(true);
COSName nameExtGStateStrokingOverprintCtrlTrue = page.getResources().add(extGStateStrokingOverprintCtrlTrue);
PDExtendedGraphicsState extGStateNonStrokingOverprintCtrlFalse = new PDExtendedGraphicsState();
extGStateNonStrokingOverprintCtrlFalse.setNonStrokingOverprintControl(false);
COSName nameExtGStateNonStrokingOverprintCtrlFalse = page.getResources().add(extGStateNonStrokingOverprintCtrlFalse);
PDExtendedGraphicsState extGStateStrokingOverprintCtrlFalse = new PDExtendedGraphicsState();
extGStateStrokingOverprintCtrlFalse.setStrokingOverprintControl(false);
COSName nameExtGStateStrokingOverprintCtrlFalse = page.getResources().add(extGStateStrokingOverprintCtrlFalse);
PDFStreamParser parser = new PDFStreamParser(page);
List<Object> newTokens = new ArrayList<>();
Object token = parser.parseNextToken();
while (token != null)
{
if (token instanceof Operator && !newTokens.isEmpty())
{
String opname = ((Operator) token).getName();
Object lastToken = newTokens.get(newTokens.size() - 1);
if (lastToken instanceof COSName && !"Pattern".equals(((COSName) lastToken).getName()) &&
("CS".equals(opname.toUpperCase()) || "SCN".equals(opname.toUpperCase())))
{
COSName name = (COSName) lastToken;
System.out.println(name.getName() + " " + opname);
newTokens.add(token);
if (true)
{
if (Character.isUpperCase(opname.charAt(0)))
{
newTokens.add(nameExtGStateStrokingOverprintCtrlTrue);
}
else
{
newTokens.add(nameExtGStateNonStrokingOverprintCtrlTrue);
}
}
else
{
if (opname.contains("S"))
{
newTokens.add(nameExtGStateStrokingOverprintCtrlFalse);
}
else
{
newTokens.add(nameExtGStateNonStrokingOverprintCtrlFalse);
}
}
newTokens.add(Operator.getOperator("gs"));
token = parser.parseNextToken();
continue;
}
else if ("G".equals(opname.toUpperCase()) || "RG".equals(opname.toUpperCase()) || "K".equals(opname.toUpperCase()))
{
newTokens.add(token);
if (Character.isUpperCase(opname.charAt(0)))
{
newTokens.add(nameExtGStateStrokingOverprintCtrlFalse);
}
else
{
newTokens.add(nameExtGStateNonStrokingOverprintCtrlFalse);
}
newTokens.add(Operator.getOperator("gs"));
token = parser.parseNextToken();
continue;
}
}
newTokens.add(token);
token = parser.parseNextToken();
}
PDStream newContents = new PDStream(document);
try (OutputStream out = newContents.createOutputStream(COSName.FLATE_DECODE))
{
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newTokens);
}
page.setContents(newContents);
}
private static void usage()
{
System.err.println("Usage: java " + InsertOverprint.class.getName() + " <input-pdf> <output-pdf>");
}
: sc, scn, SC SCN - . , . . "Pattern", .
25.7.2017: RemoveAllTexts ( ) , xobject, . , , createTokensWithoutText().