繁体   English   中英

使用PDFsharp和MigraDoc写入和读取PDF

[英]Using PDFsharp and MigraDoc to write to and then read from a PDF

我正在尝试为我们的PDF生成例程编写验证代码,并且很难使PDFsharp从使用MigraDoc创建的文件中提取文本。 ExtractText代码适用于其他PDF,但不适用于我使用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();

结果如下:

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

我希望看到:

segment [0] =“ ABCDEF”
segment [1] =“ abcdef”

我在这里使用ExtractText代码: C#使用PdfSharp从PDF中提取文本

对于使用MigraDoc生成的PDF(除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这将导致不同的编码,并且文本提取可能会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM