使用PDFsharp和MigraDoc写入并从PDF读取

问题描述:

我正在尝试为我们的PDF生成例程编写验证码,而且我很难让PDFsharp从使用MigraDoc创建的文件中提取文本。 ExtractText代码可与其他PDF一起使用,但不能与我通过MigraDoc生成的PDF一起使用(请参阅下面的代码)。使用PDFsharp和MigraDoc写入并从PDF读取

关于我在做什么的错误提示?

//Create the Doc 
var doc = new MigraDoc.DocumentObjectModel.Document(); 
doc.Info.Title = "VerifyReadWrite"; 
var section = doc.AddSection(); 
section.AddParagraph("ABCDEF abcdef"); 

//Render the PDF 
var renderer = new PdfDocumentRenderer(true); 
var pdf = new PdfDocument(); 
renderer.PdfDocument = pdf; 
renderer.Document = doc; 
renderer.RenderDocument(); 
var msOut = new MemoryStream(); 
pdf.Save(msOut, true); 
var pdfBytes = msOut.ToArray(); 

//Read the PDF into PdfSharp 
var ms = new MemoryStream(pdfBytes); 
var pdfRead = PdfSharp.Pdf.IO.PdfReader.Open(ms, PdfDocumentOpenMode.ReadOnly); 
var segments = pdfRead.Pages[0].ExtractText().ToList(); 

结果如下所示:

段[0] = “\ 0 $ \ 0%\ 0 & \ 0' \ 0(\ 0)”
段[1] =“\ 0D \ 0E \ 0F \ 0G \ 0H \ 0I”

我希望看到:

段[0] = “ABCDEF”
段[1] = “ABCDEF”

我正在使用ExtractText代码: C# Extract text from PDF using PdfSharp

对于除MigraDoc生成的PDF以外的所有PDF都很适用。

public static IEnumerable<string> ExtractText(this PdfPage page) 
    { 
     var content = ContentReader.ReadContent(page); 
     var text = content.ExtractText(); 
     return text.Select(x => x.Trim()); 
    } 

    public static IEnumerable<string> ExtractText(this CObject cObject) 
    { 
     if (cObject is COperator) 
     { 
      var cOperator = (COperator) cObject; 
      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 
     { 
      var sequence = cObject as CSequence; 
      if (sequence != null) 
      { 
       var cSequence = sequence; 
       foreach (var element in cSequence) 
        foreach (var txt in ExtractText(element)) 
         yield return txt; 
      } 
      else if (cObject is CString) 
      { 
       var cString = (CString) cObject; 
       yield return cString.Value; 
      } 
     } 
    } 

看来用于提取文本的代码不支持所有情况。

尝试new PdfDocumentRenderer(false)(而不是'true')。 AFAIK这将导致不同的编码和文本提取可能工作。

+0

谢谢!我发现这个:“如果所有文本都使用真正的Unicode编码,如果为false,则使用WinAnsi编码。”这里: http://www.nudoq.org/#!/Packages/PDFsharp-MigraDoc-GDI/MigraDoc.Rendering/PdfDocumentRenderer/ctor谢谢你的回答。 – WendellJ