Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JAVA进行PDF比较_Java_Pdf_Pdfbox - Fatal编程技术网

使用JAVA进行PDF比较

使用JAVA进行PDF比较,java,pdf,pdfbox,Java,Pdf,Pdfbox,我必须比较两个PDF。我不能使用任何比较工具,因为我们希望自动化测试,并且文档存储在不同的服务器和位置 我使用PDFbox来比较PDF。一个文档包含二维码,一个包含条形码。另一方面,这两个文档都包含一个附加的PDF 我使用以下给定代码: public List<Object> compareDoc(Message<PDFStore> message) throws Exception{ List<String> insertedRows = compa

我必须比较两个PDF。我不能使用任何比较工具,因为我们希望自动化测试,并且文档存储在不同的服务器和位置

我使用PDFbox来比较PDF。一个文档包含二维码,一个包含条形码。另一方面,这两个文档都包含一个附加的PDF

我使用以下给定代码:

public List<Object> compareDoc(Message<PDFStore> message) throws Exception{
    List<String> insertedRows = compareResult.getInsertedRows(); 
    List<String> deletedRows = compareResult.getDeletedRows();
    List<String> oldValueOfChangedRows = compareResult.getOldValueOfChangedRows();
    List<String> newValueOfChangedRows = compareResult.getNewValueOfChangedRows();
    try{
        compareResult.init();
        PDFStore store = message.getPayload();
        byte[] scritturaPDF = store.getScritturaPDF();
        FileUtils.writeByteArrayToFile(new File("C:\\Old Sys BackUp\\Data\\text1.pdf"), scritturaPDF);

        byte[] reconfPDF = store.getReconfPDF();
        FileUtils.writeByteArrayToFile(new File("C:\\Old Sys BackUp\\Data\\text2.pdf"), reconfPDF);

        strip("C:\\Old Sys BackUp\\Data\\text1.pdf", "C:\\Old Sys BackUp\\Data\\text3.pdf");
        strip("C:\\Old Sys BackUp\\Data\\text2.pdf", "C:\\Old Sys BackUp\\Data\\text4.pdf");

        String[] fileArray = {"C:\\Old Sys BackUp\\Data\\text3.pdf" ,"C:\\Old Sys BackUp\\Data\\text3.txt"}; 
        String[] fileArray1 = {"C:\\Old Sys BackUp\\Data\\text4.pdf","C:\\Old Sys BackUp\\Data\\text4.txt"};

        ExtractText.main(fileArray);
        ExtractText.main(fileArray1);

        List<String> scritturaPDFlist = fileToLines("C:\\Old Sys BackUp\\Data\\text3.txt");
        List<String> reconfPDFList = fileToLines("C:\\Old Sys BackUp\\Data\\text4.txt");
        Patch patch = DiffUtils.diff(scritturaPDFlist, reconfPDFList);
        DiffRowGenerator.Builder builder = new DiffRowGenerator.Builder();
        builder.showInlineDiffs(true);
        DiffRowGenerator dfg = builder.build();
        List<DiffRow> diffList = dfg.generateDiffRows(scritturaPDFlist, reconfPDFList);
        if(patch.getDeltas().size() > 0){
            List<Delta> deltas = patch.getDeltas();
            for (Delta delta: deltas) {
                  logger.trace("difference is " +  delta);
            }
            logger.trace("difference count is " + patch.getDeltas().size());
        }
        if(diffList !=null){
            for(DiffRow diffRow : diffList){
                 if (diffRow.getTag().equals(DiffRow.Tag.INSERT)){
                    insertedRows.add(changeString( diffRow.getNewLine()));             
                 }
                 else if (diffRow.getTag().equals(DiffRow.Tag.DELETE)){
                     deletedRows.add(changeString( diffRow.getOldLine()));

                 }
                 else if (diffRow.getTag().equals(DiffRow.Tag.CHANGE)){
                     oldValueOfChangedRows.add(changeString( diffRow.getNewLine()));
                     newValueOfChangedRows.add(changeString( diffRow.getOldLine()));
                 }
            }
        }

    }catch(Exception e){
        e.printStackTrace();
    }

    List<Object> o = new ArrayList<Object> ();
    o.add(insertedRows);
    o.add(deletedRows);
    o.add(oldValueOfChangedRows);
    o.add(newValueOfChangedRows);
    return o;

}

public static void strip(String pdfFile, String pdfFileOut) throws Exception {

     PDDocument document = PDDocument.load(pdfFile);


        System.out.println("page coutn -> " + document.getNumberOfPages());
        PDDocumentCatalog catalog = document.getDocumentCatalog();
        for (Object pageObj :  catalog.getAllPages()) {
            PDPage page = (PDPage) pageObj;
            PDResources resources = page.findResources();
            resources.getImages().clear();
        }

        document.save(pdfFileOut);

}

private static String changeString(String s){
    if (s != null && s.contains("<")){
         int i = s.indexOf("<");
         int j = s.indexOf(">");
         String s1 = s.substring(0, i);
         String s2 = s.substring(j+1,s.length());
         s = s1 + s2;
         s = changeString(s);
    }
    return s;
}
private  static List<String> fileToLines(String filename) {
    List<String> lines = new LinkedList<String>();
    String line = "";
    try {
            BufferedReader in = new BufferedReader(new FileReader(filename));
            while ((line = in.readLine()) != null) {
                    if (!(line.contains("Name:")) && !(line.contains("Title:")))
                        lines.add(line);
            }
    } catch (IOException e) {
            e.printStackTrace();
    }
    return lines;
 }

我无法获得100%正确的不匹配。有人能帮忙吗?

也许检查内容的md5总和就已经足够了?按照设计,没有两个PDF是平等创建的,即使运行相同的代码也是如此。因此,使用md5内容总和的建议是错误的。看,我必须比较两个PDF-通用PDF比较不容易。请事先确定应发现哪些差异,哪些不应。例如,是否应报告或忽略不同的元数据,例如创建日期或作者?是否应报告或忽略代表相同数据但生成方式不同的条形码,例如使用条形码字体的条形码、使用条形码图像的条形码?是否只应通过将文字与位图进行比较来直观地比较文字?或者,它提取的文本是否也要进行比较?等等。pp。我必须忽略文档中使用的签名图像,不同的条形码,因为它们是不同的,因此我想在比较时忽略这些内容。另外,如果我打开由上述代码生成的文本文件,它包含一些加密的文本不确定这是什么,它实际上是什么。我也不想把它拿来比较。PDFbox的Document.isEncrypted函数返回null。