输出的pdf未填充iTextsharp和C#.net中的内容,使用零字节创建

时间:2014-04-05 04:40:13

标签: c# itextsharp

我正在使用iTextSharp和C#.net替换pdf文档中的特定单词,而我正在调试获取正确的值,但输出的pdf得到零字节(空),它没有填充内容。

ReplacePDFText("Mumbai",StringComparison.CurrentCultureIgnoreCase,Application.StartupPath + "\\test.pdf","D:\\test_words_replaced.pdf"); //Do Everything

public void ReplacePDFText(string strSearch, StringComparison scCase, string strSource, string strDest)
    {

        PdfStamper psStamp = null; //PDF Stamper Object
        PdfContentByte pcbContent = null; //Read PDF Content

        if (File.Exists(strSource)) //Check If File Exists
        {

            PdfReader pdfFileReader = new PdfReader(strSource); //Read Our File

            psStamp = new PdfStamper(pdfFileReader, new FileStream(strDest, FileMode.Create)); //Read Underlying Content of PDF File

            pbProgress.Value = 0; //Set Progressbar Minimum Value
            pbProgress.Maximum = pdfFileReader.NumberOfPages; //Set Progressbar Maximum Value

            for (int intCurrPage = 1; intCurrPage <= pdfFileReader.NumberOfPages; intCurrPage++) //Loop Through All Pages
            {

                LocTextExtractionStrategy lteStrategy = new LocTextExtractionStrategy(); //Read PDF File Content Blocks

                pcbContent = psStamp.GetUnderContent(intCurrPage); //Look At Current Block

                //Determine Spacing of Block To See If It Matches Our Search String
                lteStrategy.UndercontentCharacterSpacing = pcbContent.CharacterSpacing;
                lteStrategy.UndercontentHorizontalScaling = pcbContent.HorizontalScaling;

                //Trigger The Block Reading Process
                string currentText = PdfTextExtractor.GetTextFromPage(pdfFileReader, intCurrPage, lteStrategy);

                //Determine Match(es)
                List<iTextSharp.text.Rectangle> lstMatches = lteStrategy.GetTextLocations(strSearch, scCase);

                PdfLayer pdLayer = default(PdfLayer); //Create New Layer
                pdLayer = new PdfLayer("Overrite", psStamp.Writer); //Enable Overwriting Capabilities

                //Set Fill Colour Of Replacing Layer
                pcbContent.SetColorFill(BaseColor.BLACK);

                foreach (iTextSharp.text.Rectangle rctRect in lstMatches) //Loop Through Each Match
                {

                    pcbContent.Rectangle(rctRect.Left, rctRect.Bottom, rctRect.Width, rctRect.Height); //Create New Rectangle For Replacing Layer

                    pcbContent.Fill(); //Fill With Colour Specified

                    pcbContent.BeginLayer(pdLayer); //Create Layer

                    pcbContent.SetColorFill(BaseColor.BLACK); //Fill aLyer

                    pcbContent.Fill(); //Fill Underlying Content

                    PdfGState pgState = default(PdfGState); //Create GState Object
                    pgState = new PdfGState();

                    pcbContent.SetGState(pgState); //Set Current State

                    pcbContent.SetColorFill(BaseColor.WHITE); //Fill Letters

                    pcbContent.BeginText(); //Start Text Replace Procedure

                    pcbContent.SetTextMatrix(rctRect.Left, rctRect.Bottom); //Get Text Location

                    //Set New Font And Size
                    pcbContent.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 9);

                    pcbContent.ShowText("AMAZING!!!!"); //Replacing Text

                    pcbContent.EndText(); //Stop Text Replace Procedure

                    pcbContent.EndLayer(); //Stop Layer replace rocedure

                }                   
                pbProgress.Value++; //Increase Progressbar Value

                pdfFileReader.Close(); //Close File                 
            }

            //psStamp.Close(); //Close Stamp Object             
        }

        }

1 个答案:

答案 0 :(得分:0)

您只是写信给您的控制台:

Console.WriteLine(ExtractTextFromPdf(@"C:\temp\MyPdf.pdf");

您没有将PDF保存到磁盘,因此您不能指望在pdf文件中看到任何更改。您的代码应将修改后的文本保存到磁盘:

var editedText = ExtractTextFromPdf(@"C:\temp\MyPdf.pdf");
Console.WriteLine(editedText);
SaveTextToPdf(editedText, @"C:\temp\MyPdf1.pdf");