2015-11-19 72 views
0

This问题已存在,但未使用PDFsharp提供答案,但iTextPDF提供。PDFsharp:使用PDFsharp替换字符串

现在回到问题,我知道一种读取和提取字符串的方法。但是我无法替换文本。

我的代码:

 var content = ContentReader.ReadContent(page);  
     var text = content.ExtractText(); 
     text = text.Replace("Replace This", "With This"); 
     XFont font = new XFont("Times New Roman", 11, XFontStyle.BoldItalic); 

     gfx.DrawString(text, font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Left); 

     // Save the document... 
     const string filename = "New Doc.pdf"; 
     document.Save(filename); 
    } 

    public static IEnumerable<string> ExtractText(this CObject cObject) 
    { 
     if (cObject is COperator) 
     { 
      var cOperator = cObject as COperator; 
      if (cOperator.OpCode.Name== OpCodeName.Tj.ToString() || 
       cOperator.OpCode.Name == OpCodeName.TJ.ToString()) 
      { 
       foreach (var cOperand in cOperator.Operands) 
        foreach (var txt in ExtractText(cOperand)) 
         yield return txt; 
      } 
     } 
     else if (cObject is CSequence) 
     { 
      var cSequence = cObject as CSequence; 
      foreach (var element in cSequence) 
       foreach (var txt in ExtractText(element)) 
        yield return txt; 
     } 
     else if (cObject is CString) 
     { 
      var cString = cObject as CString; 
      yield return cString.Value; 
     } 
    } 

这是一个示例代码和这个人会忽略图形和图像。最后只在输出文件中写入文本。有没有办法可以替换文字而不用触摸内容中的图形和图像?

回答

1

该示例似乎是一种错误的方法:它仅返回文本,但忽略图形,图像甚至文本位置和文本属性。

您可以尝试在内容中查找文本说明(TJ,Tj),并用新指令(也包括TJ或Tj)替换它们而不触及流中的任何其他内容。如果新文本的长度不同,这种简单的方法会导致重叠的文本或大的空白。

PDFsharp不是用来解析内容流的。您必须编写自己的代码来提取文本,您必须编写自己的代码来修改文本(或使用基于PDFsharp构建的第三方库)。

回答你的问题:是的,有一种方法(如上所述),但是你必须编写大量的代码才能实现这个目标(或者找到适合第三方编写的代码)。

+0

谢谢你的回应。我知道这是错误的:)这就是我在Q.中发布的内容 – Enthusiastic

+0

任何对PDFSharp构建的第三方库的引用?如果你知道这是免费许可 – Enthusiastic

+1

我不知道这样的代码是否存在。 PDFsharp不是为文本提取而设计的,它不是为文本操作而设计的。我知道有使用PDFsharp构建的文本提取代码。 –