2013-04-12 107 views
-4

我需要在ASP.NET的PDF文檔中用用戶的下拉列表中選擇的新單詞替換單詞。我正在使用iTextSharp,但創建的新PDF全部失真,因爲我無法在解壓縮時提取PDF的格式/樣式信息。另外,有沒有一種方法可以逐行閱讀pdf?請幫忙..如何更新PDF文件?

protected void Page_Load(object sender, EventArgs e) 
    { 
     String s = DropDownList1.SelectedValue; 
     Response.Write(s); 
     ListFieldNames(s); 
    } 
    private void CreatePDF(string text) 
    { 
     string outFileName = @"z:\TEMP\PDF\Test_abc.pdf"; 
     Document doc = new Document(); 
     doc.SetMargins(30f, 30f, 30f, 30f); 
     PdfWriter.GetInstance(doc, new FileStream(outFileName, FileMode.Create)); 
     doc.Open(); 
     BaseFont bfTimes = BaseFont.CreateFont(BaseFont.COURIER, BaseFont.CP1252, false); 
     Font times = new Font(bfTimes, 12, Font.BOLDITALIC); 
     //Chunk ch = new Chunk(text,times); 
     Paragraph para = new Paragraph(text,times); 

     //para.SpacingAfter = 9f; 
     para.Alignment = Element.ALIGN_CENTER; 
     //para.IndentationLeft = 100; 
     doc.Add(para); 


     //doc.Add(new Paragraph(text,times)); 
     doc.Close(); 
     Response.Redirect(@"z:\TEMP\PDF\Test_abc.pdf",false); 




    } 

    private void ListFieldNames(string s) 
    { 
     ArrayList arrCheck = new ArrayList(); 
     try 
     { 
      string pdfTemplate = @"z:\TEMP\PDF\abc.pdf"; 
      //string dest = @"z:\TEMP\PDF\Test_abc.pdf"; 

      PdfReader pdfReader = new PdfReader(pdfTemplate); 
      string pdfText = string.Empty; 
      string extracttext = ""; 
      for (int page = 1; page <= pdfReader.NumberOfPages; page++) 
      { 

       ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy(); 
       PdfReader reader = new PdfReader((string)pdfTemplate); 
       extracttext = PdfTextExtractor.GetTextFromPage(reader, page, its); 
       extracttext = Encoding.Unicode.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.Unicode, Encoding.Default.GetBytes(extracttext))); 
       pdfText = pdfText + extracttext; 

       pdfText = pdfText.Replace("[xyz]", s); 
       pdfReader.Close(); 
      } 

      CreatePDF(pdfText); 
     } 
     catch (Exception ex) 
     { 

     } 
     finally 
     { 

     } 
    } 
+1

iText解析器類不是用於重建PDF,而是僅用於(純文本)文本和圖像提取以及提取它們的位置和維度。此外請注意PDF不是可編輯的格式; *用一個新單詞替換一個單詞,*因此,不是一個簡單的工具,但(對於通用的解決方案)是一項艱鉅的任務。話雖如此,如果您的任務僅限於特殊類型的PDF,請張貼樣本以供檢查,也許您的文檔是以簡單地完成任務的方式構建的。 – mkl

+0

單詞替換工作正常。但是,由這段代碼創建的新PDF沒有實際的所有樣式信息。有什麼方法可以提取PDF的樣式信息以及文本...? – tk2013

+1

你在提取的純文本上做文字替換。很好,如果這就是你想要的。否則完全不相關。 – mkl

回答

2

你在做出一個錯誤的假設。

  1. 您認爲「行」的概念存在於PDF中。這是錯誤的。在文本狀態下,頁面上的絕對位置會繪製不同的文本片段。對於每個「顯示文本」操作符,iText將返回一個TextRenderInfo對象,其中包含繪製的文本部分及其座標。一行可以包含多個文本片段。文本片段可能包含空白,甚至可能爲空。
  2. 您認爲PDF中的所有文本都保持其自然閱讀順序。對於PDF/UA(UA代表通用可訪問性),這應該是正確的,但對於您可以在野外找到的大多數PDF而言肯定不是這樣。這就是iText提供基於位置的文本提取的原因(請參閱iText in Action, Second Edition的p521)。正如p516所解釋的那樣,文本「Hello World」可以作爲「ld」,「Wor」,「llo」,「He」存儲在PDF中。 LocationTextExtractionStrategy將訂購所有文本片段,必要時重新構建單詞。例如:它會將「He」和「llo」連接到「Hello」,因爲「He」片段和「llo」片段之間沒有足夠的空間。但是,由於未知的原因(可能是無知),您正在使用不根據其位置排序文本的SimpleTextExtractionStrategy
  3. 您完全忽略了所有的圖形狀態操作符,以及定義字體等的文本狀態操作符...
  4. 您認爲PDF是一種Word處理格式。這在許多層面上都是錯誤的,就像你的代碼一樣。請閱讀chapter 6 of my book的介紹。

所有這些錯誤的假設幾乎讓我想投下你的問題。我可能會爲了這個答案而被拒絕,但我必須告訴你,你不應該試圖「做同樣的事情」。你問的東西非常複雜,在很多情況下甚至是不可能的!

+0

其實單詞替換工作正常。但是,由這段代碼創建的新PDF沒有實際的所有樣式信息。有什麼方法可以提取PDF的樣式信息以及文本...? – tk2013

+0

正如我在答案的第3點中所解釋的,您忽略了所有圖形狀態和文本狀態操作符。當我說你犯了太多錯誤的假設時,如果你不相信我,就開始閱讀ISO-32000-1。 –