我必须将流(由包含pdf的blob存储接收到)转换为pdf页面才能使用
public static class PdfSharpExtensions
{
public static IEnumerable<string> ExtractText(this PdfPage page)
{
var content = ContentReader.ReadContent(page);
var text = content.ExtractText();
return text;
}
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;
}
}
}
[对this question here的回答。有办法吗?
据我所知,您需要从流中创建PDF,然后使用PDF读取内容。
因此,首先我们需要从MemoryStream创建PDF,但是等一下我们只有一个Stream,因此我们需要像这样将其转换为MemoryStream:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[16*1024];
int read;
while((read = input.Read (buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
// Create MemoryStream
var ms = new MemoryStream();
CopyStream(streamFromDatabase, ms);
// Create PDF from MemoryStream
var pdf = PdfReader.Open(ms);
现在我们可以像这样从中读取文本:
var sb = new StringBuilder();
foreach (var page in pdf.Pages)
{
sb.Append(page.ExtractText());
}