diff options
author | Ashod Nakashian <ashod.nakashian@collabora.co.uk> | 2018-04-09 09:08:02 -0400 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2018-06-07 10:45:22 +0200 |
commit | ddbecd021e1a9722362f401084acad2bdc6a0da1 (patch) | |
tree | 332f9710eefdb3d9190b4727b7f783561fe5909e | |
parent | d9dbfe5bada618538d89827f442088275685a2c1 (diff) |
svx: refactor PDF text importing
Change-Id: Ibe8d794c1d457936c9272bb664a5478d78654dd4
-rw-r--r-- | svx/source/svdraw/svdpdf.cxx | 120 | ||||
-rw-r--r-- | svx/source/svdraw/svdpdf.hxx | 1 |
2 files changed, 60 insertions, 61 deletions
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx index 602e630563e8..b90d8c700143 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -236,67 +236,8 @@ void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pAc switch (nPageObjectType) { case FPDF_PAGEOBJ_TEXT: - { - SAL_WARN("sd.filter", "Got page object TEXT"); - float left; - float bottom; - float right; - float top; - if (!FPDFPageObj_GetBounds(pPageObject, &left, &bottom, &right, &top)) - { - SAL_WARN("sd.filter", "FAILED to get TEXT bounds"); - } - - SAL_WARN("sd.filter", "Got TEXT bounds left: " << left << ", right: " << right - << ", top: " << top - << ", bottom: " << bottom); - Rectangle aRect = PointsToLogic(left, right, top, bottom); - - double dFontScale = 1.0; - geometry::Matrix2D aMatrix; - FPDFTextObj_GetMatrix(pPageObject, &aMatrix.m00, &aMatrix.m01, &aMatrix.m10, - &aMatrix.m11); - if (aMatrix.m00 != aMatrix.m11 || aMatrix.m00 <= 0) - { - SAL_WARN("sd.filter", "Bogus font scale matrix (" - << aMatrix.m00 << ',' << aMatrix.m11 - << "), will use heuristic height of " - << aRect.GetHeight() << "."); - dFontScale = aRect.GetHeight(); - } - else - dFontScale = aMatrix.m00; - - double dFontSize = FPDFTextObj_GetFontSize(pPageObject); - SAL_WARN("sd.filter", "Got Font Size: " << dFontSize); - dFontSize *= dFontScale; - SAL_WARN("sd.filter", "Got Font Size Scaled: " << dFontSize); - dFontSize = lcl_PointToPixel(dFontSize); - SAL_WARN("sd.filter", "Got Font Pixel Size: " << dFontSize); - dFontSize = lcl_ToLogic(dFontSize); - SAL_WARN("sd.filter", "Got Font Logic Size: " << dFontSize); - vcl::Font aFnt = mpVD->GetFont(); - aFnt.SetFontSize(Size(dFontSize, dFontSize)); - mpVD->SetFont(aFnt); - - const int nChars = FPDFTextObj_CountChars(pPageObject); - std::unique_ptr<sal_Unicode[]> pText( - new sal_Unicode[nChars + 1]); // + terminating null - - unsigned short* pShortText = reinterpret_cast<unsigned short*>(pText.get()); - const int nActualChars - = FPDFTextObj_GetText(pPageObject, 0, nChars, pShortText); - OUString sText(pText.get(), nActualChars); - - // for (int nChar = 0; nChar < nChars; ++nChar) - // pText[nChar] = static_cast<sal_Unicode>(FPDFTextObj_GetUnicode(pPageObject, nChar)); - // OUString sText(pText.get(), nChars); - SAL_WARN("sd.filter", "Got Text #" << nPageObjectIndex + 1 << " (" << nChars - << "): [" << sText << "]."); - - ImportText(aRect.TopLeft(), sText); - } - break; + ImportText(pPageObject); + break; case FPDF_PAGEOBJ_PATH: SAL_WARN("sd.filter", "Got page object PATH"); break; @@ -1073,6 +1014,63 @@ void ImpSdrPdfImport::checkClip() } bool ImpSdrPdfImport::isClip() const { return !maClip.getB2DRange().isEmpty(); } + +void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject) +{ + SAL_WARN("sd.filter", "Got page object TEXT"); + float left; + float bottom; + float right; + float top; + if (!FPDFPageObj_GetBounds(pPageObject, &left, &bottom, &right, &top)) + { + SAL_WARN("sd.filter", "FAILED to get TEXT bounds"); + } + + SAL_WARN("sd.filter", "Got TEXT bounds left: " << left << ", right: " << right + << ", top: " << top << ", bottom: " << bottom); + tools::Rectangle aRect = PointsToLogic(left, right, top, bottom); + + double dFontScale = 1.0; + geometry::Matrix2D aMatrix; + FPDFTextObj_GetMatrix(pPageObject, &aMatrix.m00, &aMatrix.m01, &aMatrix.m10, &aMatrix.m11); + if (aMatrix.m00 != aMatrix.m11 || aMatrix.m00 <= 0) + { + SAL_WARN("sd.filter", "Bogus font scale matrix (" << aMatrix.m00 << ',' << aMatrix.m11 + << "), will use heuristic height of " + << aRect.GetHeight() << "."); + dFontScale = aRect.GetHeight(); + } + else + dFontScale = aMatrix.m00; + + double dFontSize = FPDFTextObj_GetFontSize(pPageObject); + SAL_WARN("sd.filter", "Got Font Size: " << dFontSize); + dFontSize *= dFontScale; + SAL_WARN("sd.filter", "Got Font Size Scaled: " << dFontSize); + dFontSize = lcl_PointToPixel(dFontSize); + SAL_WARN("sd.filter", "Got Font Pixel Size: " << dFontSize); + dFontSize = lcl_ToLogic(dFontSize); + SAL_WARN("sd.filter", "Got Font Logic Size: " << dFontSize); + vcl::Font aFnt = mpVD->GetFont(); + aFnt.SetFontSize(Size(dFontSize, dFontSize)); + mpVD->SetFont(aFnt); + + const int nChars = FPDFTextObj_CountChars(pPageObject); + std::unique_ptr<sal_Unicode[]> pText(new sal_Unicode[nChars + 1]); // + terminating null + + unsigned short* pShortText = reinterpret_cast<unsigned short*>(pText.get()); + const int nActualChars = FPDFTextObj_GetText(pPageObject, 0, nChars, pShortText); + OUString sText(pText.get(), nActualChars); + + // for (int nChar = 0; nChar < nChars; ++nChar) + // pText[nChar] = static_cast<sal_Unicode>(FPDFTextObj_GetUnicode(pPageObject, nChar)); + // OUString sText(pText.get(), nChars); + SAL_WARN("sd.filter", "Got Text (" << nChars << "): [" << sText << "]."); + + ImportText(aRect.TopLeft(), sText); +} + void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr) { // calc text box size, add 5% to make it fit safely diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx index 0c462c6fc135..7d458b978c01 100644 --- a/svx/source/svdraw/svdpdf.hxx +++ b/svx/source/svdraw/svdpdf.hxx @@ -103,6 +103,7 @@ class ImpSdrPdfImport final void ImportImage(FPDF_PAGEOBJECT pPageObject); void SetupPageScale(const double dPageWidth, const double dPageHeight); + void ImportText(FPDF_PAGEOBJECT pPageObject); void ImportText(const Point& rPos, const OUString& rStr); void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false); void InsertObj(SdrObject* pObj, bool bScale = true); |