From 0bee7b0aaaebb82f80fcd39d9038fb352e03f7f1 Mon Sep 17 00:00:00 2001 From: Kulikova Svetlana Date: Fri, 29 Oct 2021 13:41:08 +0300 Subject: [PATCH] pdf text link --- PdfReader/PdfReader.cpp | 51 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/PdfReader/PdfReader.cpp b/PdfReader/PdfReader.cpp index 5f76956877..b98b7da910 100644 --- a/PdfReader/PdfReader.cpp +++ b/PdfReader/PdfReader.cpp @@ -56,6 +56,7 @@ #include "lib/xpdf/TextOutputDev.h" #include "lib/goo/GList.h" #include "../DesktopEditor/common/StringExt.h" +#include #endif namespace PdfReader @@ -623,7 +624,56 @@ return 0; nPageIndex++; NSWasm::CData oRes; oRes.SkipLen(); + double height = m_pInternal->m_pPDFDocument->getPageCropHeight(nPageIndex); + struct _link + { + std::string link; + double x; + double y; + double w; + double h; + }; + std::vector<_link> arrLinks; + + // Текст-ссылка + TextOutputControl textOutControl; + textOutControl.mode = textOutReadingOrder; + TextOutputDev* pTextOut = new TextOutputDev(NULL, &textOutControl, gFalse); + m_pInternal->m_pPDFDocument->displayPage(pTextOut, nPageIndex, 72, 72, 0, gFalse, gTrue, gFalse); + m_pInternal->m_pPDFDocument->processLinks(pTextOut, nPageIndex); + TextWordList* pWordList = pTextOut->makeWordList(); + for (int i = 0; i < pWordList->getLength(); i++) + { + TextWord* pWord = pWordList->get(i); + if (!pWord) + continue; + GString* sLink = pWord->getText(); + if (!sLink) + continue; + std::string link(sLink->getCString(), sLink->getLength()); + size_t find = link.find("http"); + if (find != std::string::npos) + { + link.erase(0, find); + double x1, y1, x2, y2; + pWord->getBBox(&x1, &y1, &x2, &y2); + arrLinks.push_back({link, x1, y1, x2 - x1, y2 - y1}); + } + } + RELEASEOBJECT(pTextOut); + for (_link& l : arrLinks) + { + oRes.WriteString((BYTE*)l.link.c_str(), l.link.length()); + // Верхний левый угол + oRes.AddDouble(0.0); + oRes.AddDouble(l.x); + oRes.AddDouble(l.y); + oRes.AddDouble(l.w); + oRes.AddDouble(l.h); + } + + // Гиперссылка Links* pLinks = m_pInternal->m_pPDFDocument->getLinks(nPageIndex); if (!pLinks) return NULL; @@ -638,7 +688,6 @@ return 0; GString* str = NULL; double x1 = 0.0, y1 = 0.0, x2 = 0.0, y2 = 0.0, dy = 0.0; pLink->getRect(&x1, &y1, &x2, &y2); - double height = m_pInternal->m_pPDFDocument->getPageCropHeight(nPageIndex); y1 = height - y1; y2 = height - y2;