package filetools.pdf; import java.awt.Color; import java.io.File; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import javax.activation.FileDataSource; import javax.swing.ImageIcon; import javax.swing.JOptionPane; import javax.swing.UIManager; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; import org.apache.pdfbox.preflight.PreflightDocument; import org.apache.pdfbox.preflight.ValidationResult; import org.apache.pdfbox.preflight.ValidationResult.ValidationError; import org.apache.pdfbox.preflight.exception.SyntaxValidationException; import org.apache.pdfbox.preflight.parser.PreflightParser; public class PdfAValidator { static String examinedFolder; static PrintWriter outputfile; static PrintWriter shortSummary; static Logger logger = LoggerFactory.getLogger(PdfAValidator.class); public static void main(String args[]) throws IOException { try { changecolor(); String path = "D://Eclipse New//PDFBoxLogo.gif"; String description = "PDFBox Logo"; ImageIcon icon = new ImageIcon(path, description); JOptionPane.showMessageDialog(null, "Please choose the folder with PDF/A files to validate.", "PDFBox Validation", JOptionPane.QUESTION_MESSAGE, icon); examinedFolder = utilities.BrowserDialogs.chooseFolder(); outputfile = new PrintWriter(new FileWriter(examinedFolder + "//" + "PdfAValidation.xml")); shortSummary = new PrintWriter(new FileWriter(examinedFolder + "//" + "PdfAValidationShortSummary.xml")); String xmlVersion = "xml version='1.0'"; String xmlEncoding = "encoding='ISO-8859-1'"; String xsltStyleSheet = "<?xml-stylesheet type=\"text/xsl\" href=\"PdfBoxValidationStyle.xsl\"?>"; String xsltStyleSheetSummary = "<?xml-stylesheet type=\"text/xsl\" href=\"PdfBoxSummaryStyle.xsl\"?>"; String xsltLocation = examinedFolder + "//" + "PdfBoxValidationStyle.xsl"; String xsltLocationSum = examinedFolder + "//" + "PdfBoxSummaryStyle.xsl"; output.XslStyleSheets.PdfBoxCustomizedXsl(xsltLocation); output.XslStyleSheets.PdfBoxSummaryCustomizedXsl(xsltLocationSum); outputfile.println("<?" + xmlVersion + " " + xmlEncoding + "?>"); outputfile.println(xsltStyleSheet); outputfile.println("<PdfBoxValidation>"); shortSummary.println("<?" + xmlVersion + " " + xmlEncoding + "?>"); shortSummary.println(xsltStyleSheetSummary); shortSummary.println("<PdfBoxValidationSummary>"); int examinedPdfa = 0; int validPdfa = 0; int invalidPdfa = 0; if (examinedFolder != null) { ArrayList<File> files = utilities.ListsFiles.getPaths(new File(examinedFolder), new ArrayList<File>()); for (int i = 0; i < files.size(); i++) { if (files.get(i) != null) { try { if (PdfAnalysis.testPdfOk(files.get(i))) /* * Test if the Pdf File is ok to be examined. * Otherwise gives error in Console */ { String PdfType = PdfAnalysis.checkIfPdfA(files.get(i)); if (PdfType.contains("PDF/A")) { outputfile.println("<PdfAFile>"); shortSummary.println("<PdfAFile>"); int syntaxError = 0; int graphicError = 0; int fontError = 0; int transparencyError = 0; int annotationError = 0; int actionError = 0; int metadataError = 0; examinedPdfa++; outputfile.println("<FileName>" + utilities.fileStringUtilities.getFileName(files.get(i)) + "</FileName>"); shortSummary.println("<FileName>" + utilities.fileStringUtilities.getFileName(files.get(i)) + "</FileName>"); PDDocument pd = new PDDocument(); pd = PDDocument.load(files.get(i)); PDDocumentInformation info = pd.getDocumentInformation(); getsomeMetadata(info); pd.close(); /* * the actual PdfAValidation starts here */ ValidationResult result = null; FileDataSource fd = new FileDataSource(files.get(i).toString()); PreflightParser parser = new PreflightParser(fd); try { parser.parse(); PreflightDocument document = parser.getPreflightDocument(); try { document.validate(); result = document.getResult(); document.close(); } catch (NullPointerException e) { /* * TODO: Why can this generate a * NullPointerException ? */ outputfile.println("<Error>" + e + "</Error>"); shortSummary.println("<Error>" + e + "</Error>"); logger.error("Error analyzing " + files.get(i).getAbsolutePath(), e); } } catch (SyntaxValidationException e) { /* * the parse method throws a * SyntaxValidationException if the PDF * file can't be parsed. */ result = e.getResult(); logger.error("Error analyzing " + files.get(i).getAbsolutePath(), e); } if (result != null) { if (result.isValid()) { outputfile.println("<Status>" + "Valid" + "</Status>"); shortSummary.println("<Status>" + "Valid" + "</Status>"); validPdfa++; } else { int errorslen = 0; outputfile.println("<Status>" + "Invalid" + "</Status>"); shortSummary.println("<Status>" + "Invalid" + "</Status>"); invalidPdfa++; for (ValidationError error : result.getErrorsList()) { errorslen++; String errorCode = error.getErrorCode().toString(); outputfile.println("<Code>" + error.getErrorCode() + "</Code>"); String errorDetails = utilities.fileStringUtilities.reduceXmlEscapors(error.getDetails()); if (errorCode.startsWith("1")) { outputfile.println("<Details Category=\"SyntaxError\">" + errorDetails + "</Details>"); syntaxError++; } if (errorCode.startsWith("2")) { outputfile.println("<Details Category=\"GraphicError\">" + errorDetails + "</Details>"); graphicError++; } if (errorCode.startsWith("3")) { outputfile.println("<Details Category=\"FontError\">" + errorDetails + "</Details>"); fontError++; } if (errorCode.startsWith("4")) { outputfile.println("<Details Category=\"TransparencyError\">" + errorDetails + "</Details>"); transparencyError++; } if (errorCode.startsWith("5")) { outputfile.println("<Details Category=\"AnnotationError\">" + errorDetails + "</Details>"); annotationError++; } if (errorCode.startsWith("6")) { outputfile.println("<Details Category=\"ActionError\">" + errorDetails + "</Details>"); actionError++; } if (errorCode.startsWith("7")) { outputfile.println("<Details Category=\"MetadataError\">" + errorDetails + "</Details>"); metadataError++; } } outputfile.println("<SyntaxErrors>" + syntaxError + "</SyntaxErrors>"); outputfile.println("<GraphicErrors>" + graphicError + "</GraphicErrors>"); outputfile.println("<FontErrors>" + fontError + "</FontErrors>"); outputfile.println("<TransparencyErrors>" + transparencyError + "</TransparencyErrors>"); outputfile.println("<AnnotationErrors>" + annotationError + "</AnnotationErrors>"); outputfile.println("<ActionErrors>" + actionError + "</ActionErrors>"); outputfile.println("<MetadataErrors>" + metadataError + "</MetadataErrors>"); shortSummary.println("<ErrorsCount>" + errorslen + "</ErrorsCount>"); } } outputfile.println("</PdfAFile>"); shortSummary.println("</PdfAFile>"); } } } catch (IOException e) { outputfile.println("<Error>" + e + "</Error>"); JOptionPane.showMessageDialog(null, e, "error message", JOptionPane.ERROR_MESSAGE); } } } } shortSummary.println("<Summary>"); shortSummary.println("<ExaminedPdfAFiles>" + examinedPdfa + "</ExaminedPdfAFiles>"); shortSummary.println("<ValidPdfAFiles>" + validPdfa + "</ValidPdfAFiles>"); shortSummary.println("<InvalidPdfAFiles>" + invalidPdfa + "</InvalidPdfAFiles>"); shortSummary.println("</Summary>"); outputfile.println("</PdfBoxValidation>"); shortSummary.println("</PdfBoxValidationSummary>"); shortSummary.close(); outputfile.close(); } catch (FileNotFoundException e) { logger.error("Error analyzing " + e); JOptionPane.showMessageDialog(null, e, "error message", JOptionPane.ERROR_MESSAGE); } } private static void getsomeMetadata(PDDocumentInformation info) throws IOException { try { Calendar creationYear = info.getCreationDate(); Date creationYearDate = creationYear.getTime(); int len = creationYearDate.toString().length(); String year = creationYearDate.toString().substring(len - 4, len); String creationSoftware = utilities.fileStringUtilities.reduceXmlEscapors(info.getProducer()); shortSummary.println("<CreationYear>" + year + "</CreationYear>"); shortSummary.println("<CreationSoftware>" + creationSoftware + "</CreationSoftware>"); outputfile.println("<CreationYear>" + year + "</CreationYear>"); outputfile.println("<CreationSoftware>" + creationSoftware + "</CreationSoftware>"); } catch (Exception e) { shortSummary.println("<CreationYear>" + "</CreationYear>"); shortSummary.println("<CreationSoftware>" + "</CreationSoftware>"); outputfile.println("<CreationYear>" + "</CreationYear>"); outputfile.println("<CreationSoftware>" + "</CreationSoftware>"); } } private static void changecolor() { UIManager.put("OptionPane.background", Color.white); UIManager.put("Panel.background", Color.white); } }