一次PDF文件的处理(二)

主要是对 《一次PDF文件的处理(一)》进行详细的代码说明:

显示PDF

这个比较简单 。使用 private DevExpress.XtraPdfViewer.PdfViewer

pdfViewer1.LoadDocument(@"美文晨读.pdf");

读取PDF的内容

使用PdfDataRecognizer

page.Rect = new RectangleF((float)CropBox.Left, (float)CropBox.Top, (float)CropBox.Width, (float)CropBox.Height);

PdfPageData pdata = PdfDataRecognizer.Recognize(pdfpage, false, false);

foreach (PdfWord w in pdata.Words)

{

foreach (PdfCharacter c in w.Characters)

{

if (c.UnicodeData == "")

continue;

PDFWord ow = new PDFWord();

ow.Text = c.UnicodeData;

ow.TextRect.Rect = new RectangleF((float)c.Rectangle.Left, (float)(c.Rectangle.Top), (float)c.Rectangle.Width, (float)c.Rectangle.Height);

page.Words.Add(ow);

}

}

预览PDF时显示调试信息

使用PdfViewer的Paint事件

public void paint_debug_info(PaintEventArgs e, int PageNumber)

{

PDFPage page = _document.GetPage(PageNumber);

if (page == null)

return;

PointF pt1 = _viewer.GetClientPoint(new PdfDocumentPosition(PageNumber, new PdfPoint(page.Rect.Left, page.Rect.Top)));

PointF pt2 = _viewer.GetClientPoint(new PdfDocumentPosition(PageNumber, new PdfPoint(page.Rect.Right, page.Rect.Top - page.Rect.Height)));

e.Graphics.DrawRectangle(Pens.Blue, pt1.X, pt1.Y, pt2.X - pt1.X, pt2.Y - pt1.Y);

foreach (PDFWord w in page.Words)

{

if (w.Text == "")

continue;

PdfDocumentPosition pp1 = new PdfDocumentPosition(PageNumber, new PdfPoint(w.TextRect.Rect.Left, w.TextRect.Rect.Top));

PdfDocumentPosition pp2 = new PdfDocumentPosition(PageNumber, new PdfPoint(w.TextRect.Rect.Right, w.TextRect.Rect.Top - w.TextRect.Rect.Height));

pt1 = _viewer.GetClientPoint(pp1);

pt2 = _viewer.GetClientPoint(pp2);

if (_show_line)

{

ExtractPdfPageHTML(_viewer, curr_pagenum);

}

if ((pt1.Y > 0) || (pt2.Y > 0))

{

if (_show_pt)

{

Rectangle r = new Rectangle((int) pt1.X, (int)pt1.Y, (int)pt2.X- (int)pt1.X, (int)pt2.Y - (int)pt1.Y);

e.Graphics.DrawRectangle(Pens.Blue, r);

//e.Graphics.DrawLine(Pens.Blue, pt1, pt2);

}

if (_show_txt)

e.Graphics.DrawString(w.Text, drawFont, drawBrush, pt1);

if (_show_line)

{

if (w.PinYinWord.Count > 0)

{

foreach (PDFWord w2 in w.PinYinWord)

{

PdfDocumentPosition pp1_2 = new PdfDocumentPosition(PageNumber, new PdfPoint(w2.TextRect.Rect.Left, w2.TextRect.Rect.Top));

PdfDocumentPosition pp2_2 = new PdfDocumentPosition(PageNumber, new PdfPoint(w2.TextRect.Rect.Right, w2.TextRect.Rect.Top - w2.TextRect.Rect.Height));

PointF pt1_2 = _viewer.GetClientPoint(pp1_2);

PointF pt2_2 = _viewer.GetClientPoint(pp2_2);

e.Graphics.DrawLine(Pens.Blue, (pt1.X+pt2.X)/2, (pt1.Y + pt2.Y) / 2, (pt1_2.X + pt2_2.X) / 2, (pt1_2.Y + pt2_2.Y) / 2);

}

}

}

}

}

}

计算汉字和拼音的位置

for (int i=0;i < lm.Lines.Count;i++)

{

Line line = lm.Linesi;

if (line.item_w_AVG < lm.line_item_w_AVG)

{

if (i < lm.Lines.Count - 1)

{

Line line2 = lm.Linesi + 1;

if ((line2.Rect.Top + line2.Rect.Height) > (line.Rect.Top - line2.Rect.Height))

{

foreach (PDFWord w2 in line2.Words)

{

w2.PinYin = "";

w2.PinYinWord.Clear();

}

foreach (PDFWord w in line.Words)

{

float d_min = 0;

float i_min = -1;

float x = w.TextRect.Rect.X + w.TextRect.Rect.Width / 2;

float y = w.TextRect.Rect.Y - w.TextRect.Rect.Height / 2;

PDFWord w_txt = null;

foreach (PDFWord w2 in line2.Words)

{

float x2 = w2.TextRect.Rect.X + w2.TextRect.Rect.Width / 2;

float y2 = w2.TextRect.Rect.Y - w2.TextRect.Rect.Height / 2;

float d = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);

if (w_txt== null)

{

d_min = d;

w_txt = w2;

}

else if (d < d_min) {

d_min = d;

w_txt = w2;

}

}

if (w_txt != null)

{

w_txt.PinYin = w_txt.PinYin + w.Text;

w_txt.PinYinWord.Add(w);

}

}

}

}

}

else

{

if (line.Rect.Left > lm.line_x_MIN + lm.line_item_w_AVG)

sb.AppendLine(@"<br /> &nbsp; &nbsp;");

foreach (PDFWord w2 in line.Words)

{

if (w2.PinYin=="")

sb.AppendLine(@" <span class=""char-group""><span class=""pinyin"">&nbsp;</span><span class=""hanzi"">" + w2.Text + @"</span></span>");

else

sb.AppendLine(@" <span class=""char-group""><span class=""pinyin"">"+w2.PinYin+@"</span><span class=""hanzi"">"+w2.Text+@"</span></span>");

}

}

}

相关推荐
麻花地2 小时前
MinerU 文档解析全指南:从 magic-pdf 到 3.4.5,PDF→Markdown 开源利器深度实战
pdf·开源
2601_967760783 小时前
PDF 转图片再转回总翻车?2026 国内免费实测
pdf
zhlx28353 小时前
小初高教材 PDF 批量获取|中小学电子课本下载器,支持批量下载带书签 PDF 教材[Windows]
pdf
张某布响丸辣3 小时前
Node 16 下用 pdfjs + @napi-rs/canvas 把中文 PDF 渲染成图片
pdf·node·字体映射
weixin_4935036712 小时前
Vue3 前端生成 PDF:会员证书与活动签到表的三种打印方案与踩坑记录
前端·pdf·状态模式
、如果16 小时前
PDF图片文字提取零依赖方案:pymupdf+AI视觉实战
人工智能·数据分析·pdf·图片提取·文字提取·skills
geovindu16 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
SamChan9018 小时前
PDF翻译后的格式完整性校验:用Python自动比对译文与原文档的表格与段落结构
开发语言·python·ai·pdf·机器翻译
web打印社区19 小时前
浏览器静默打印?先别装第三个库了
前端·vue.js·chrome·electron·pdf
软件黑马王子20 小时前
20.Resources资源加载:基本实现
开发语言·前端框架·c#