如何更新PDF文件?

时间:2013-04-12 10:02:29

标签: asp.net c#-4.0 pdf itextsharp

我需要在ASP.NET的PDF文档中使用从用户下拉列表中选择的新单词替换单词。我正在使用iTextSharp,但创建的新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 个答案:

答案 0 :(得分:2)

你正在做出一个错误的假设。

  1. 您认为PDF中存在“线”的概念。这是错的。在文本状态中,页面上的绝对位置绘制了不同的文本片段。对于每个“show text”运算符,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
  5. 的介绍

    所有这些错误的假设几乎让我想对你的问题投反对票。冒着被自己投票给这个答案的风险,我必须告诉你,你不应该试着“做同样的事情”。你问的是非常复杂的东西,在许多情况下甚至是不可能的!