-3

我需要在 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
        {

        }
    }
4

1 回答 1

2

你一个接一个地做出错误的假设。

  1. 您假设 PDF 中存在“线条”的概念。这是错误的。在文本状态中,不同的文本片段被绘制在页面上的绝对位置。对于每个“显示文本”运算符,iText 将返回一个TextRenderInfo对象,其中包含已绘制的文本部分及其坐标。一行可以包含多个文本片段。文本片段可能包含空格,甚至可能为空。
  2. 您假设 PDF 中的所有文本都保持其自然阅读顺序。对于 PDF/UA(UA 代表 Universal Accessibility),这应该是正确的,但对于您可以在野外找到的大多数 PDF,它肯定不是正确的。这就是 iText 提供基于位置的文本提取的原因(参见iText in Action, Second Edition的 p521 )。如 p516 中所述,文本“Hello World”可以在 PDF 中存储为“ld”、“Wor”、“llo”、“He”。将对所有文本片段进行排序,LocationTextExtractionStrategy并在必要时重新构建单词。例如:它将“He”和“llo”连接到“Hello”,因为“He”片段和“llo”片段之间没有足够的空间。然而,由于未知的原因(可能是无知),你'SimpleTextExtractionStrategy
  3. 您完全忽略了所有图形状态运算符,以及定义字体的文本状态运算符等...
  4. 您假设 PDF 是一种文字处理格式。这在许多层面上都是错误的,您的代码也是如此。请阅读我的书第 6 章的介绍。

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

于 2013-04-12T10:38:36.263 回答