iTextSharp替换现有PDF中的文本而不会失去形成

Kev*_*aul 8 c# pdf itextsharp

我一直在网上搜索2周,并为我的问题找到了一些有趣的解决方案,但似乎没有什么能给我答案.

我的目标是做下面的事情:

我想在静态PDF文件中找到一个文本,并将该文本替换为另一个文本.我想保留内容的设计.这真的很难吗?

我找到了办法,但我丢失了整个信息:

 using (PdfReader reader = new PdfReader(path))
        {

            StringBuilder text = new StringBuilder();
            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                text.Append(PdfTextExtractor.GetTextFromPage(reader, i));
                text.Replace(txt_SuchenNach.Text, txt_ErsetzenMit.Text);
            }

            return text.ToString();
        }
Run Code Online (Sandbox Code Playgroud)

我的第二次尝试更好,但需要我可以更改内部文本的字段:

 string fileNameExisting =path;
        string fileNameNew = @"C:\TEST.pdf";

        using (FileStream existingFileStream = new FileStream(fileNameExisting, FileMode.Open))
        using (FileStream newFileStream = new FileStream(fileNameNew, FileMode.Create))
        {
            // PDF öffnen
            PdfReader pdfReader = new PdfReader(existingFileStream);


            PdfStamper stamper = new PdfStamper(pdfReader, newFileStream);

            var form = stamper.AcroFields;
            var fieldKeys = form.Fields.Keys;
            foreach (string fieldKey in fieldKeys)
            {                    
                var value = pdfReader.AcroFields.GetField(fieldKey);
                form.SetField(fieldKey, value.Replace(txt_SuchenNach.Text, txt_ErsetzenMit.Text));
            }

            // Textfeld unbearbeitbar machen (sieht aus wie normaler text)
            stamper.FormFlattening = true;

            stamper.Close();
            pdfReader.Close();
        }
Run Code Online (Sandbox Code Playgroud)

这样可以保留其余文本的格式,并且只会更改我的搜索文本.我需要一个不在Textfield中的文本解决方案.

感谢您的所有答案和帮助.

Eug*_*ene 5

一般问题是文本对象可能使用嵌入字体,并将特定字形分配给特定字母。即,如果您有一个包含“abcdef”等文本的文本对象,则嵌入字体可能仅包含这些(“abcdef”字母)的字形,但不包含其他字母的字形。因此,如果将“abcdef”替换为“xyz”,则 PDF 将不会显示这些“xyz”,因为没有可用于显示这些字母的字形。

所以我会考虑以下工作流程:

  • 但愿如此。我也喜欢@Jongware 的评论,因为它们清楚地解释了为什么 OP 试图使用 PDF 来做它应该做的事情。我想在 PDF 中用另一个字符串替换一个字符串,并保留所有样式并进行文本重排,这是一个听起来像“我想在收音机上看电视”的问题,以及诸如“我讨厌用叉子吃汤”之类的评论。 (2认同)