summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshod Nakashian <ashod.nakashian@collabora.co.uk>2018-05-24 23:01:15 -0400
committerJan Holesovsky <kendy@collabora.com>2018-06-06 12:49:23 +0200
commita08c0c5f44d4a9149a3737175e3ff56a9fa5dc17 (patch)
treedd2e7aeea54ea9fb0e1977c9e393f1c465238109
parentdaca240109325b424ea2090c1939f5959fa746aa (diff)
pdf: preserve the original page dimensions on import
Also allow for rendering PDFs to images at custom resolution, instead of hard-coded (old hard-coded value of 96 dpi is now default arguments). Change-Id: Ia5b52f72d6ce7130a2debc7c6f86504aa041bdc8 Reviewed-on: https://gerrit.libreoffice.org/54786 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
-rw-r--r--include/vcl/pdfread.hxx10
-rw-r--r--sd/source/filter/pdf/sdpdffilter.cxx13
-rw-r--r--vcl/source/filter/ipdf/pdfread.cxx41
3 files changed, 46 insertions, 18 deletions
diff --git a/include/vcl/pdfread.hxx b/include/vcl/pdfread.hxx
index 1ffabf5ce0d4..0e1b546daa36 100644
--- a/include/vcl/pdfread.hxx
+++ b/include/vcl/pdfread.hxx
@@ -34,11 +34,15 @@ namespace vcl
VCL_DLLPUBLIC bool ImportPDF(SvStream& rStream, Bitmap& rBitmap, size_t nPageIndex,
css::uno::Sequence<sal_Int8>& rPdfData,
sal_uInt64 nPos = STREAM_SEEK_TO_BEGIN,
- sal_uInt64 nSize = STREAM_SEEK_TO_END);
-VCL_DLLPUBLIC bool ImportPDF(SvStream& rStream, Graphic& rGraphic);
+ sal_uInt64 nSize = STREAM_SEEK_TO_END,
+ const double fResolutionDPI = 96.);
+
+VCL_DLLPUBLIC bool ImportPDF(SvStream& rStream, Graphic& rGraphic,
+ const double fResolutionDPI = 96.);
VCL_DLLPUBLIC size_t ImportPDF(const OUString& rURL, std::vector<Bitmap>& rBitmaps,
- css::uno::Sequence<sal_Int8>& rPdfData);
+ css::uno::Sequence<sal_Int8>& rPdfData,
+ const double fResolutionDPI = 96.);
}
#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 a52a6aea3353..ad00ae0ba0ba 100644
--- a/sd/source/filter/pdf/sdpdffilter.cxx
+++ b/sd/source/filter/pdf/sdpdffilter.cxx
@@ -100,9 +100,12 @@ bool SdPdfFilter::Import()
const OUString aFileName(
mrMedium.GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::NONE));
+ // Rendering resolution.
+ const double dResolutionDPI = 96.;
+
uno::Sequence<sal_Int8> aPdfData;
std::vector<Bitmap> aBitmaps;
- if (vcl::ImportPDF(aFileName, aBitmaps, aPdfData) == 0)
+ if (vcl::ImportPDF(aFileName, aBitmaps, aPdfData, dResolutionDPI) == 0)
return false;
// Prepare the link with the PDF stream.
@@ -129,8 +132,12 @@ bool SdPdfFilter::Import()
// Create the page and insert the Graphic.
SdPage* pPage = mrDocument.GetSdPage(nPageNumber++, PageKind::Standard);
- const Size aGrfSize(OutputDevice::LogicToLogic(
- aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)));
+ Size aGrfSize(OutputDevice::LogicToLogic(aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(),
+ MapMode(MapUnit::Map100thMM)));
+
+ // Resize to original size based on 72 dpi to preserve page size.
+ aGrfSize = Size(aGrfSize.Width() * 72. / dResolutionDPI,
+ aGrfSize.Height() * 72. / dResolutionDPI);
// Make the page size match the rendered image.
pPage->SetSize(aGrfSize);
diff --git a/vcl/source/filter/ipdf/pdfread.cxx b/vcl/source/filter/ipdf/pdfread.cxx
index b5fa067a324a..fc6ea985193a 100644
--- a/vcl/source/filter/ipdf/pdfread.cxx
+++ b/vcl/source/filter/ipdf/pdfread.cxx
@@ -53,11 +53,15 @@ int CompatibleWriter::WriteBlockCallback(FPDF_FILEWRITE* pFileWrite, const void*
}
/// Convert to inch, then assume 96 DPI.
-double pointToPixel(double fPoint) { return fPoint / 72 * 96; }
+inline double pointToPixel(const double fPoint, const double fResolutionDPI)
+{
+ return fPoint * fResolutionDPI / 72.;
+}
/// Does PDF to bitmap conversion using pdfium.
size_t generatePreview(SvStream& rStream, std::vector<Bitmap>& rBitmaps, sal_uInt64 nPos,
- sal_uInt64 nSize, const size_t nFirstPage, int nPages)
+ sal_uInt64 nSize, const size_t nFirstPage = 0, int nPages = 1,
+ const double fResolutionDPI = 96.)
{
FPDF_LIBRARY_CONFIG aConfig;
aConfig.version = 2;
@@ -89,8 +93,8 @@ size_t generatePreview(SvStream& rStream, std::vector<Bitmap>& rBitmaps, sal_uIn
break;
// Returned unit is points, convert that to pixel.
- const size_t nPageWidth = pointToPixel(FPDF_GetPageWidth(pPdfPage));
- const size_t nPageHeight = pointToPixel(FPDF_GetPageHeight(pPdfPage));
+ const size_t nPageWidth = pointToPixel(FPDF_GetPageWidth(pPdfPage), fResolutionDPI);
+ const size_t nPageHeight = pointToPixel(FPDF_GetPageHeight(pPdfPage), fResolutionDPI);
FPDF_BITMAP pPdfBitmap = FPDFBitmap_Create(nPageWidth, nPageHeight, /*alpha=*/1);
if (!pPdfBitmap)
break;
@@ -192,9 +196,18 @@ bool getCompatibleStream(SvStream& rInStream, SvStream& rOutStream, sal_uInt64 n
return rOutStream.good();
}
#else
-size_t generatePreview(SvStream&, std::vector<Bitmap>&, sal_uInt64, sal_uInt64, size_t, int)
+size_t generatePreview(SvStream&, std::vector<Bitmap>&, sal_uInt64 nPos, sal_uInt64 nSize,
+ size_t nFirstPage = 0, int nLastPage = 0, const double fResolutionDPI = 96.)
{
- return 0;
+ (void)rStream;
+ (void)rBitmap;
+ (void)nPos;
+ (void)nSize;
+ (void)nFirstPage;
+ (void)nLastPage;
+ (void)fResolutionDPI;
+
+ return false;
}
bool getCompatibleStream(SvStream& rInStream, SvStream& rOutStream, sal_uInt64 nPos,
@@ -210,11 +223,13 @@ bool getCompatibleStream(SvStream& rInStream, SvStream& rOutStream, sal_uInt64 n
namespace vcl
{
bool ImportPDF(SvStream& rStream, Bitmap& rBitmap, size_t nPageIndex,
- css::uno::Sequence<sal_Int8>& rPdfData, sal_uInt64 nPos, sal_uInt64 nSize)
+ css::uno::Sequence<sal_Int8>& rPdfData, sal_uInt64 nPos, sal_uInt64 nSize,
+ const double fResolutionDPI)
{
// Get the preview of the first page.
std::vector<Bitmap> aBitmaps;
- if (generatePreview(rStream, aBitmaps, nPos, nSize, nPageIndex, 1) != 1 || aBitmaps.empty())
+ if (generatePreview(rStream, aBitmaps, nPos, nSize, nPageIndex, 1, fResolutionDPI) != 1
+ || aBitmaps.empty())
return false;
rBitmap = aBitmaps[0];
@@ -232,11 +247,11 @@ bool ImportPDF(SvStream& rStream, Bitmap& rBitmap, size_t nPageIndex,
return true;
}
-bool ImportPDF(SvStream& rStream, Graphic& rGraphic)
+bool ImportPDF(SvStream& rStream, Graphic& rGraphic, const double fResolutionDPI)
{
uno::Sequence<sal_Int8> aPdfData;
Bitmap aBitmap;
- const bool bRet = ImportPDF(rStream, aBitmap, 0, aPdfData);
+ const bool bRet = ImportPDF(rStream, aBitmap, 0, aPdfData, fResolutionDPI);
rGraphic = aBitmap;
rGraphic.setPdfData(std::make_shared<css::uno::Sequence<sal_Int8>>(aPdfData));
rGraphic.setPageNumber(0); // We currently import only the first page.
@@ -244,12 +259,14 @@ bool ImportPDF(SvStream& rStream, Graphic& rGraphic)
}
size_t ImportPDF(const OUString& rURL, std::vector<Bitmap>& rBitmaps,
- css::uno::Sequence<sal_Int8>& rPdfData)
+ css::uno::Sequence<sal_Int8>& rPdfData, const double fResolutionDPI)
{
std::unique_ptr<SvStream> xStream(
::utl::UcbStreamHelper::CreateStream(rURL, StreamMode::READ | StreamMode::SHARE_DENYNONE));
- if (generatePreview(*xStream, rBitmaps, STREAM_SEEK_TO_BEGIN, STREAM_SEEK_TO_END, 0, -1) == 0)
+ if (generatePreview(*xStream, rBitmaps, STREAM_SEEK_TO_BEGIN, STREAM_SEEK_TO_END, 0, -1,
+ fResolutionDPI)
+ == 0)
return 0;
// Save the original PDF stream for later use.