2013-07-03 39 views
0

我必須替換<<>>之間的字符串。但是我無法這樣做。替換PDF文件中的數據

public void doIt(String inputFile, String outputFile) throws IOException, COSVisitorException 
{ 

    PDDocument doc = null; 
    try 
    { 
     doc = PDDocument.load(inputFile); 
     List pages = doc.getDocumentCatalog().getAllPages(); 
     for(int i=0; i<pages.size(); i++) 
     { 
      PDPage page = (PDPage)pages.get(i); 
      PDStream contents = page.getContents(); 
      PDFStreamParser parser = new PDFStreamParser(contents.getStream()); 
      parser.parse(); 
      List tokens = parser.getTokens(); 
      for(int j=0; j<tokens.size(); j++) 
      { 
       Object next = tokens.get(j); 
       if(next instanceof PDFOperator) 
       { 

        PDFOperator op = (PDFOperator)next; 
        if(op.getOperation().equals("Tj")) 

        { 
         Scanner in = new Scanner(System.in); 
         COSString previous = (COSString)tokens.get(j-1); 
         String string = previous.getString(); 
         if(string.startsWith("<<") && string.endsWith(">>")) 
         { 
         System.out.println(string); 
         System.out.println("enter the word to be replaced"); 
         String string2=in.nextLine(); 
         string = string.replaceAll(string, string2); 
         previous.reset(); 
         previous.append(string.getBytes()); 
         } 
        }  
        else if(op.getOperation().equals("TJ")) 
        { 
         COSArray previous = (COSArray)tokens.get(j-1); 
         for(int k=0; k<previous.size(); k++) 
         { 
          Scanner in = new Scanner(System.in); 
          Object arrElement = previous.getObject(k); 
          if(arrElement instanceof COSString) 
          { 
           COSString cosString = (COSString)arrElement; 
           String string = cosString.getString(); 
           if(string.startsWith("<<") && string.endsWith(">>")) 
           { 
            System.out.println(string); 
            System.out.println("enter the word to be replaced"); 
            String string2=in.nextLine(); 
            string = string.replaceAll(string, string2); 
            cosString.reset(); 
            cosString.append(string.getBytes()); 
           } 
          } 
         } 
        } 
       } 
      } 
      PDStream updatedStream = new PDStream(doc); 
      OutputStream out = updatedStream.createOutputStream(); 
      ContentStreamWriter tokenWriter = new ContentStreamWriter(out); 
      tokenWriter.writeTokens(tokens); 
      page.setContents(updatedStream); 
     } 
     doc.save(outputFile); 
     System.out.println("Done!! Now You can Open."); 
    } 
    finally 
    { 
     if(doc != null) 
     { 
      doc.close(); 
     } 
    } 
} 
+1

問題必須證明對所解決問題的最小理解。告訴我們你試圖去做什麼,爲什麼它沒有工作,以及它應該如何工作。 –

+1

基本上是[佔位符的PDF操作]的副本(http://stackoverflow.com/questions/17444459/pdf-manipulation-with-placeholders)。 – mkl

回答

2

請閱讀chapter 6 of my book的介紹。您假設PDF是一種用於編輯文本的格式。 PDF不是專爲文字處理而設計的。

當然:也許你在問我如何創建一個靜態表單,如我在本書6.3.5節中所解釋的,但我懷疑AcroForm技術的靜態特性是否能滿足您的需求。一個純粹的XFA表單(動態PDF)可以解決你的問題,但是解釋XFA並不是在SO的答案範圍內可以完成的。 XFA規範長達數百頁。正如鄧肯瓊斯的評論所指出的那樣,你應該先做一些前期工作。