diff options
-rw-r--r-- | include/vcl/pdfread.hxx | 18 | ||||
-rw-r--r-- | sd/source/filter/pdf/sdpdffilter.cxx | 17 | ||||
-rw-r--r-- | vcl/source/filter/ipdf/pdfread.cxx | 13 |
3 files changed, 15 insertions, 33 deletions
diff --git a/include/vcl/pdfread.hxx b/include/vcl/pdfread.hxx index b56e8139447d..ba0eb1ca85be 100644 --- a/include/vcl/pdfread.hxx +++ b/include/vcl/pdfread.hxx @@ -14,19 +14,10 @@ #include <tools/gen.hxx> #include <tools/stream.hxx> -namespace com -{ -namespace sun -{ -namespace star -{ -namespace uno +namespace com::sun::star::uno { template <typename> class Sequence; } -} -} -} class Bitmap; class Graphic; @@ -40,13 +31,10 @@ VCL_DLLPUBLIC size_t RenderPDFBitmaps(const void* pBuffer, int nSize, std::vecto /// Imports a PDF stream into rGraphic as VectorGraphicData. VCL_DLLPUBLIC bool ImportPDF(SvStream& rStream, Graphic& rGraphic); -/// Import PDF as Graphic images (1 per page), all unloaded. -/// Since Graphic is unloaded, we need to return the page size (in pixels) separately. -/// Does not set rPdfData if no conversion is done. +/// Import PDF as Graphic images (1 per page), but not loaded yet. /// Returns the number of pages read. VCL_DLLPUBLIC size_t ImportPDFUnloaded(const OUString& rURL, - std::vector<std::pair<Graphic, Size>>& rGraphics, - double fResolutionDPI = 96.); + std::vector<std::pair<Graphic, Size>>& rGraphics); } #endif // INCLUDED_VCL_SOURCE_FILTER_IPDF_PDFREAD_HXX diff --git a/sd/source/filter/pdf/sdpdffilter.cxx b/sd/source/filter/pdf/sdpdffilter.cxx index 22df932e7ee8..55d21f4057b8 100644 --- a/sd/source/filter/pdf/sdpdffilter.cxx +++ b/sd/source/filter/pdf/sdpdffilter.cxx @@ -41,11 +41,8 @@ bool SdPdfFilter::Import() const OUString aFileName( mrMedium.GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::NONE)); - // Rendering resolution. - const double dResolutionDPI = 96.0; - std::vector<std::pair<Graphic, Size>> aGraphics; - if (vcl::ImportPDFUnloaded(aFileName, aGraphics, dResolutionDPI) == 0) + if (vcl::ImportPDFUnloaded(aFileName, aGraphics) == 0) return false; // Add as many pages as we need up-front. @@ -58,26 +55,20 @@ bool SdPdfFilter::Import() for (const std::pair<Graphic, Size>& aPair : aGraphics) { const Graphic& rGraphic = aPair.first; - const Size& aSize = aPair.second; + const Size& aSizeHMM = aPair.second; const sal_Int32 nPageNumber = rGraphic.getPageNumber(); assert(nPageNumber >= 0 && o3tl::make_unsigned(nPageNumber) < aGraphics.size()); // Create the page and insert the Graphic. SdPage* pPage = mrDocument.GetSdPage(nPageNumber, PageKind::Standard); - Size aGraphicSize(OutputDevice::LogicToLogic(aSize, rGraphic.GetPrefMapMode(), - MapMode(MapUnit::Map100thMM))); - - // Resize to original size based on 72 dpi to preserve page size. - aGraphicSize = Size(aGraphicSize.Width() * 72.0 / dResolutionDPI, - aGraphicSize.Height() * 72.0 / dResolutionDPI); // Make the page size match the rendered image. - pPage->SetSize(aGraphicSize); + pPage->SetSize(aSizeHMM); Point aPosition(0, 0); SdrGrafObj* pSdrGrafObj = new SdrGrafObj(pPage->getSdrModelFromSdrPage(), rGraphic, - tools::Rectangle(aPosition, aGraphicSize)); + tools::Rectangle(aPosition, aSizeHMM)); pPage->InsertObject(pSdrGrafObj); } diff --git a/vcl/source/filter/ipdf/pdfread.cxx b/vcl/source/filter/ipdf/pdfread.cxx index b85a79d86e4a..8a90b0ab93ca 100644 --- a/vcl/source/filter/ipdf/pdfread.cxx +++ b/vcl/source/filter/ipdf/pdfread.cxx @@ -234,8 +234,7 @@ bool ImportPDF(SvStream& rStream, Graphic& rGraphic) return true; } -size_t ImportPDFUnloaded(const OUString& rURL, std::vector<std::pair<Graphic, Size>>& rGraphics, - const double fResolutionDPI) +size_t ImportPDFUnloaded(const OUString& rURL, std::vector<std::pair<Graphic, Size>>& rGraphics) { #if HAVE_FEATURE_PDFIUM std::unique_ptr<SvStream> xStream( @@ -279,9 +278,13 @@ size_t ImportPDFUnloaded(const OUString& rURL, std::vector<std::pair<Graphic, Si if (FPDF_GetPageSizeByIndex(pPdfDocument, nPageIndex, &fPageWidth, &fPageHeight) == 0) continue; - // Returned unit is points, convert that to pixel. - const size_t nPageWidth = pointToPixel(fPageWidth, fResolutionDPI); - const size_t nPageHeight = pointToPixel(fPageHeight, fResolutionDPI); + // Returned unit is points, convert that to 100th mm (hmm). + // 1 pt = 20 twips, 1 twip = 1.7638888888888889 hmm + // TODO: use some conversion class for that + constexpr double pointToHMMconversionRatio = 20.0 * 1.7638888888888889; + + long nPageWidth = fPageWidth * pointToHMMconversionRatio; + long nPageHeight = fPageHeight * pointToHMMconversionRatio; auto aVectorGraphicDataPtr = std::make_shared<VectorGraphicData>( aPdfDataArray, OUString(), VectorGraphicDataType::Pdf, nPageIndex); |