16#include <fpdf_annot.h>
20#include <fpdf_signature.h>
21#include <fpdf_formfill.h>
23#include <osl/endian.h>
34 "PDFPageObjectType::Unknown value mismatch");
36 "PDFPageObjectType::Text value mismatch");
38 "PDFPageObjectType::Path value mismatch");
40 "PDFPageObjectType::Image value mismatch");
42 "PDFPageObjectType::Shading value mismatch");
44 "PDFPageObjectType::Form value mismatch");
47 "PDFSegmentType::Unknown value mismatch");
49 "PDFSegmentType::Lineto value mismatch");
51 "PDFSegmentType::Bezierto value mismatch");
53 "PDFSegmentType::Moveto value mismatch");
56 "PDFBitmapType::Unknown value mismatch");
58 "PDFBitmapType::Gray value mismatch");
60 "PDFBitmapType::BGR value mismatch");
62 "PDFBitmapType::BGRx value mismatch");
64 "PDFBitmapType::BGRA value mismatch");
67 "PDFObjectType::Unknown value mismatch");
69 "PDFObjectType::Boolean value mismatch");
71 "PDFObjectType::Number value mismatch");
73 "PDFObjectType::String value mismatch");
75 "PDFObjectType::Name value mismatch");
77 "PDFObjectType::Array value mismatch");
79 "PDFObjectType::Dictionary value mismatch");
81 "PDFObjectType::Stream value mismatch");
83 "PDFObjectType::Nullobj value mismatch");
85 "PDFObjectType::Reference value mismatch");
88 "PDFTextRenderMode::Unknown value mismatch");
90 "PDFTextRenderMode::Fill value mismatch");
92 "PDFTextRenderMode::Stroke value mismatch");
94 == FPDF_TEXTRENDERMODE_FILL_STROKE,
95 "PDFTextRenderMode::FillStroke value mismatch");
97 == FPDF_TEXTRENDERMODE_INVISIBLE,
98 "PDFTextRenderMode::Invisible value mismatch");
100 == FPDF_TEXTRENDERMODE_FILL_CLIP,
101 "PDFTextRenderMode::FillClip value mismatch");
103 == FPDF_TEXTRENDERMODE_STROKE_CLIP,
104 "PDFTextRenderMode::StrokeClip value mismatch");
106 == FPDF_TEXTRENDERMODE_FILL_STROKE_CLIP,
107 "PDFTextRenderMode::FillStrokeClip value mismatch");
109 "PDFTextRenderMode::Clip value mismatch");
112 "PDFFillMode::None value mismatch");
114 "PDFFillMode::Alternate value mismatch");
116 "PDFFillMode::Winding value mismatch");
119 "PDFFindFlags::MatchCase value mismatch");
121 "PDFFindFlags::MatchWholeWord value mismatch");
123 "PDFFindFlags::Consecutive value mismatch");
126 "PDFErrorType::Success value mismatch");
128 "PDFErrorType::Unknown value mismatch");
130 "PDFErrorType::File value mismatch");
132 "PDFErrorType::Format value mismatch");
134 "PDFErrorType::Password value mismatch");
136 "PDFErrorType::Security value mismatch");
138 "PDFErrorType::Page value mismatch");
143struct CompatibleWriter :
public FPDF_FILEWRITE
153int CompatibleWriterCallback(FPDF_FILEWRITE* pFileWrite,
const void* pData,
unsigned long nSize)
155 auto pImpl =
static_cast<CompatibleWriter*
>(pFileWrite);
165class PDFiumBitmapImpl final :
public PDFiumBitmap
170 PDFiumBitmapImpl(
const PDFiumBitmapImpl&) =
delete;
171 PDFiumBitmapImpl& operator=(
const PDFiumBitmapImpl&) =
delete;
174 PDFiumBitmapImpl(FPDF_BITMAP pBitmap);
175 ~PDFiumBitmapImpl()
override;
176 FPDF_BITMAP getPointer() {
return mpBitmap; }
178 void fillRect(
int left,
int top,
int width,
int height, sal_uInt32 nColor)
override;
179 void renderPageBitmap(PDFiumDocument* pDoc, PDFiumPage* pPage,
int nStartX,
int nStartY,
180 int nSizeX,
int nSizeY)
override;
182 int getStride()
override;
183 int getWidth()
override;
184 int getHeight()
override;
188class PDFiumPathSegmentImpl final :
public PDFiumPathSegment
193 PDFiumPathSegmentImpl(
const PDFiumPathSegmentImpl&) =
delete;
194 PDFiumPathSegmentImpl& operator=(
const PDFiumPathSegmentImpl&) =
delete;
197 PDFiumPathSegmentImpl(FPDF_PATHSEGMENT pPathSegment);
200 bool isClosed()
const override;
204class PDFiumAnnotationImpl final :
public PDFiumAnnotation
209 PDFiumAnnotationImpl(
const PDFiumAnnotationImpl&) =
delete;
210 PDFiumAnnotationImpl& operator=(
const PDFiumAnnotationImpl&) =
delete;
213 PDFiumAnnotationImpl(FPDF_ANNOTATION pAnnotation);
214 ~PDFiumAnnotationImpl();
219 bool hasKey(OString
const& rKey)
override;
221 OUString
getString(OString
const& rKey)
override;
222 std::unique_ptr<PDFiumAnnotation> getLinked(OString
const& rKey)
override;
223 int getObjectCount()
override;
224 std::unique_ptr<PDFiumPageObject> getObject(
int nIndex)
override;
225 std::vector<std::vector<basegfx::B2DPoint>> getInkStrokes()
override;
226 std::vector<basegfx::B2DPoint> getVertices()
override;
228 Color getInteriorColor()
override;
229 float getBorderWidth()
override;
231 size_t getAttachmentPointsCount()
override;
232 std::vector<basegfx::B2DPoint> getAttachmentPoints(
size_t nIndex)
override;
233 std::vector<basegfx::B2DPoint> getLineGeometry()
override;
236class PDFiumPageObjectImpl final :
public PDFiumPageObject
241 PDFiumPageObjectImpl(
const PDFiumPageObjectImpl&) =
delete;
242 PDFiumPageObjectImpl& operator=(
const PDFiumPageObjectImpl&) =
delete;
245 PDFiumPageObjectImpl(FPDF_PAGEOBJECT pPageObject);
248 OUString getText(std::unique_ptr<PDFiumTextPage>
const& pTextPage)
override;
250 int getFormObjectCount()
override;
251 std::unique_ptr<PDFiumPageObject> getFormObject(
int nIndex)
override;
255 double getFontSize()
override;
256 OUString getFontName()
override;
258 Color getFillColor()
override;
259 Color getStrokeColor()
override;
260 double getStrokeWidth()
override;
262 int getPathSegmentCount()
override;
263 std::unique_ptr<PDFiumPathSegment> getPathSegment(
int index)
override;
264 Size getImageSize(PDFiumPage& rPage)
override;
265 std::unique_ptr<PDFiumBitmap> getImageBitmap()
override;
266 bool getDrawMode(
PDFFillMode& eFillMode,
bool& bStroke)
override;
269class PDFiumSearchHandleImpl final :
public PDFiumSearchHandle
274 PDFiumSearchHandleImpl(
const PDFiumSearchHandleImpl&) =
delete;
275 PDFiumSearchHandleImpl& operator=(
const PDFiumSearchHandleImpl&) =
delete;
278 PDFiumSearchHandleImpl(FPDF_SCHHANDLE pSearchHandle);
279 ~PDFiumSearchHandleImpl();
281 bool findNext()
override;
282 bool findPrev()
override;
283 int getSearchResultIndex()
override;
284 int getSearchCount()
override;
287class PDFiumTextPageImpl final :
public PDFiumTextPage
292 PDFiumTextPageImpl(
const PDFiumTextPageImpl&) =
delete;
293 PDFiumTextPageImpl& operator=(
const PDFiumTextPageImpl&) =
delete;
296 PDFiumTextPageImpl(FPDF_TEXTPAGE pTextPage);
297 ~PDFiumTextPageImpl();
299 FPDF_TEXTPAGE getPointer() {
return mpTextPage; }
301 int countChars()
override;
302 unsigned int getUnicode(
int index)
override;
303 std::unique_ptr<PDFiumSearchHandle> findStart(
const OUString& rFindWhat,
PDFFindFlags nFlags,
304 sal_Int32 nStartIndex)
override;
310class PDFiumSignatureImpl final :
public PDFiumSignature
314 PDFiumSignatureImpl(
const PDFiumSignatureImpl&) =
delete;
315 PDFiumSignatureImpl& operator=(
const PDFiumSignatureImpl&) =
delete;
318 PDFiumSignatureImpl(FPDF_SIGNATURE pSignature);
320 std::vector<int> getByteRange()
override;
321 int getDocMDPPermission()
override;
322 std::vector<unsigned char> getContents()
override;
323 OString getSubFilter()
override;
324 OUString getReason()
override;
325 css::util::DateTime getTime()
override;
328class PDFiumPageImpl final :
public PDFiumPage
334 PDFiumPageImpl(
const PDFiumPageImpl&) =
delete;
335 PDFiumPageImpl& operator=(
const PDFiumPageImpl&) =
delete;
338 PDFiumPageImpl(FPDF_PAGE pPage)
343 ~PDFiumPageImpl()
override
349 FPDF_PAGE getPointer() {
return mpPage; }
351 int getObjectCount()
override;
352 std::unique_ptr<PDFiumPageObject> getObject(
int nIndex)
override;
354 int getAnnotationCount()
override;
355 int getAnnotationIndex(std::unique_ptr<PDFiumAnnotation>
const& rAnnotation)
override;
357 std::unique_ptr<PDFiumAnnotation> getAnnotation(
int nIndex)
override;
359 std::unique_ptr<PDFiumTextPage> getTextPage()
override;
363 double getWidth()
override;
364 double getHeight()
override;
366 bool hasTransparency()
override;
368 bool hasLinks()
override;
372class PDFiumFormHandle final
377 PDFiumFormHandle(
const PDFiumFormHandle&) =
delete;
378 PDFiumFormHandle& operator=(
const PDFiumFormHandle&) =
delete;
381 PDFiumFormHandle(FPDF_FORMHANDLE pHandle);
383 FPDF_FORMHANDLE getPointer();
386class PDFiumDocumentImpl :
public PDFiumDocument
394 PDFiumDocumentImpl(
const PDFiumDocumentImpl&) =
delete;
395 PDFiumDocumentImpl& operator=(
const PDFiumDocumentImpl&) =
delete;
398 PDFiumDocumentImpl(FPDF_DOCUMENT pPdfDocument);
399 ~PDFiumDocumentImpl()
override;
400 FPDF_FORMHANDLE getFormHandlePointer();
405 int getSignatureCount()
override;
406 int getFileVersion()
override;
407 bool saveWithVersion(
SvMemoryStream& rStream,
int nFileVersion)
override;
409 std::unique_ptr<PDFiumPage> openPage(
int nIndex)
override;
410 std::unique_ptr<PDFiumSignature> getSignature(
int nIndex)
override;
411 std::vector<unsigned int> getTrailerEnds()
override;
414class PDFiumImpl :
public PDFium
417 PDFiumImpl(
const PDFiumImpl&) =
delete;
418 PDFiumImpl& operator=(
const PDFiumImpl&) =
delete;
424 ~PDFiumImpl()
override;
426 const OUString& getLastError()
const override {
return maLastError; }
428 std::unique_ptr<PDFiumDocument> openDocument(
const void* pData,
int nSize,
429 const OString& rPassword)
override;
431 std::unique_ptr<PDFiumBitmap> createBitmap(
int nWidth,
int nHeight,
int nAlpha)
override;
435PDFiumImpl::PDFiumImpl()
437 FPDF_LIBRARY_CONFIG aConfig;
439 aConfig.m_pUserFontPaths =
nullptr;
440 aConfig.m_pIsolate =
nullptr;
441 aConfig.m_v8EmbedderSlot = 0;
442 FPDF_InitLibraryWithConfig(&aConfig);
445PDFiumImpl::~PDFiumImpl() { FPDF_DestroyLibrary(); }
447std::unique_ptr<PDFiumDocument> PDFiumImpl::openDocument(
const void* pData,
int nSize,
448 const OString& rPassword)
451 std::unique_ptr<PDFiumDocument> pPDFiumDocument;
453 FPDF_BYTESTRING pPassword =
nullptr;
454 if (!rPassword.isEmpty())
456 pPassword = rPassword.getStr();
458 FPDF_DOCUMENT pDocument = FPDF_LoadMemDocument(pData, nSize, pPassword);
462 switch (FPDF_GetLastError())
464 case FPDF_ERR_SUCCESS:
467 case FPDF_ERR_UNKNOWN:
473 case FPDF_ERR_FORMAT:
476 case FPDF_ERR_PASSWORD:
477 maLastError =
"Incorrect password or password is required";
479 case FPDF_ERR_SECURITY:
491 pPDFiumDocument = std::make_unique<PDFiumDocumentImpl>(pDocument);
494 return pPDFiumDocument;
502std::unique_ptr<PDFiumBitmap> PDFiumImpl::createBitmap(
int nWidth,
int nHeight,
int nAlpha)
504 std::unique_ptr<PDFiumBitmap> pPDFiumBitmap;
505 FPDF_BITMAP pPdfBitmap = FPDFBitmap_Create(nWidth, nHeight, nAlpha);
512 pPDFiumBitmap = std::make_unique<PDFiumBitmapImpl>(pPdfBitmap);
514 return pPDFiumBitmap;
517PDFiumSignatureImpl::PDFiumSignatureImpl(FPDF_SIGNATURE pSignature)
522std::vector<int> PDFiumSignatureImpl::getByteRange()
524 int nByteRangeLen = FPDFSignatureObj_GetByteRange(
mpSignature,
nullptr, 0);
525 std::vector<int> aByteRange(nByteRangeLen);
526 if (nByteRangeLen <= 0)
531 FPDFSignatureObj_GetByteRange(
mpSignature, aByteRange.data(), aByteRange.size());
535int PDFiumSignatureImpl::getDocMDPPermission()
537 return FPDFSignatureObj_GetDocMDPPermission(
mpSignature);
540std::vector<unsigned char> PDFiumSignatureImpl::getContents()
542 int nContentsLen = FPDFSignatureObj_GetContents(
mpSignature,
nullptr, 0);
543 std::vector<unsigned char> aContents(nContentsLen);
544 if (aContents.empty())
549 FPDFSignatureObj_GetContents(
mpSignature, aContents.data(), aContents.size());
553OString PDFiumSignatureImpl::getSubFilter()
555 int nSubFilterLen = FPDFSignatureObj_GetSubFilter(
mpSignature,
nullptr, 0);
556 std::vector<char> aSubFilterBuf(nSubFilterLen);
557 FPDFSignatureObj_GetSubFilter(
mpSignature, aSubFilterBuf.data(), aSubFilterBuf.size());
559 OString aSubFilter(aSubFilterBuf.data(), aSubFilterBuf.size() - 1);
563OUString PDFiumSignatureImpl::getReason()
565 int nReasonLen = FPDFSignatureObj_GetReason(
mpSignature,
nullptr, 0);
569 std::vector<char16_t> aReasonBuf(nReasonLen);
570 FPDFSignatureObj_GetReason(
mpSignature, aReasonBuf.data(), aReasonBuf.size());
571 aRet = OUString(aReasonBuf.data(), aReasonBuf.size() - 1);
577util::DateTime PDFiumSignatureImpl::getTime()
580 int nTimeLen = FPDFSignatureObj_GetTime(
mpSignature,
nullptr, 0);
587 std::vector<char> aTimeBuf(nTimeLen);
588 FPDFSignatureObj_GetTime(
mpSignature, aTimeBuf.data(), aTimeBuf.size());
589 OString aM(aTimeBuf.data(), aTimeBuf.size() - 1);
590 if (aM.startsWith(
"D:") && aM.getLength() >= 16)
602PDFiumDocumentImpl::PDFiumDocumentImpl(FPDF_DOCUMENT pPdfDocument)
611PDFiumDocumentImpl::~PDFiumDocumentImpl()
618FPDF_FORMHANDLE PDFiumDocumentImpl::getFormHandlePointer() {
return m_pFormHandle->getPointer(); }
620std::unique_ptr<PDFiumPage> PDFiumDocumentImpl::openPage(
int nIndex)
622 std::unique_ptr<PDFiumPage> pPDFiumPage;
626 pPDFiumPage = std::make_unique<PDFiumPageImpl>(pPage);
631std::unique_ptr<PDFiumSignature> PDFiumDocumentImpl::getSignature(
int nIndex)
633 std::unique_ptr<PDFiumSignature> pPDFiumSignature;
634 FPDF_SIGNATURE pSignature = FPDF_GetSignatureObject(
mpPdfDocument, nIndex);
637 pPDFiumSignature = std::make_unique<PDFiumSignatureImpl>(pSignature);
639 return pPDFiumSignature;
642std::vector<unsigned int> PDFiumDocumentImpl::getTrailerEnds()
644 int nNumTrailers = FPDF_GetTrailerEnds(
mpPdfDocument,
nullptr, 0);
645 std::vector<unsigned int> aTrailerEnds(nNumTrailers);
646 FPDF_GetTrailerEnds(
mpPdfDocument, aTrailerEnds.data(), aTrailerEnds.size());
654 if (FPDF_GetPageSizeByIndexF(
mpPdfDocument, nIndex, &aPDFSize))
661int PDFiumDocumentImpl::getPageCount() {
return FPDF_GetPageCount(
mpPdfDocument); }
663int PDFiumDocumentImpl::getSignatureCount() {
return FPDF_GetSignatureCount(
mpPdfDocument); }
665int PDFiumDocumentImpl::getFileVersion()
667 int nFileVersion = 0;
672bool PDFiumDocumentImpl::saveWithVersion(
SvMemoryStream& rStream,
int nFileVersion)
674 CompatibleWriter aWriter(rStream);
676 aWriter.WriteBlock = &CompatibleWriterCallback;
677 if (!FPDF_SaveWithVersion(
mpPdfDocument, &aWriter, 0, nFileVersion))
685int PDFiumPageImpl::getObjectCount() {
return FPDFPage_CountObjects(
mpPage); }
687std::unique_ptr<PDFiumPageObject> PDFiumPageImpl::getObject(
int nIndex)
689 std::unique_ptr<PDFiumPageObject> pPDFiumPageObject;
690 FPDF_PAGEOBJECT pPageObject = FPDFPage_GetObject(
mpPage, nIndex);
693 pPDFiumPageObject = std::make_unique<PDFiumPageObjectImpl>(pPageObject);
695 return pPDFiumPageObject;
698int PDFiumPageImpl::getAnnotationCount() {
return FPDFPage_GetAnnotCount(
mpPage); }
700int PDFiumPageImpl::getAnnotationIndex(std::unique_ptr<PDFiumAnnotation>
const& rAnnotation)
702 auto pAnnotation =
static_cast<PDFiumAnnotationImpl*
>(rAnnotation.get());
703 return FPDFPage_GetAnnotIndex(
mpPage, pAnnotation->getPointer());
706std::unique_ptr<PDFiumAnnotation> PDFiumPageImpl::getAnnotation(
int nIndex)
708 std::unique_ptr<PDFiumAnnotation> pPDFiumAnnotation;
709 FPDF_ANNOTATION pAnnotation = FPDFPage_GetAnnot(
mpPage, nIndex);
712 pPDFiumAnnotation = std::make_unique<PDFiumAnnotationImpl>(pAnnotation);
714 return pPDFiumAnnotation;
717std::unique_ptr<PDFiumTextPage> PDFiumPageImpl::getTextPage()
719 std::unique_ptr<PDFiumTextPage> pPDFiumTextPage;
720 FPDF_TEXTPAGE pTextPage = FPDFText_LoadPage(
mpPage);
723 pPDFiumTextPage = std::make_unique<PDFiumTextPageImpl>(pTextPage);
725 return pPDFiumTextPage;
728bool PDFiumPageImpl::hasLinks()
733 FPDF_LINK pLinkAnnot =
nullptr;
734 return FPDFLink_Enumerate(
mpPage, &nStartPos, &pLinkAnnot);
737PDFiumPageObjectImpl::PDFiumPageObjectImpl(FPDF_PAGEOBJECT pPageObject)
742OUString PDFiumPageObjectImpl::getText(std::unique_ptr<PDFiumTextPage>
const& rTextPage)
744 OUString sReturnText;
746 auto pTextPage =
static_cast<PDFiumTextPageImpl*
>(rTextPage.get());
747 int nBytes = FPDFTextObj_GetText(
mpPageObject, pTextPage->getPointer(),
nullptr, 0);
748 assert(nBytes % 2 == 0);
751 std::unique_ptr<sal_Unicode[]> pText(
new sal_Unicode[nBytes]);
753 int nActualBytes = FPDFTextObj_GetText(
mpPageObject, pTextPage->getPointer(),
754 reinterpret_cast<FPDF_WCHAR*
>(pText.get()), nBytes * 2);
755 assert(nActualBytes % 2 == 0);
757 if (nActualBytes > 1)
759#if defined OSL_BIGENDIAN
761 for (
int i = 0;
i != nActualBytes; ++
i)
763 pText[
i] = OSL_SWAPWORD(pText[i]);
766 sReturnText = OUString(pText.get());
777int PDFiumPageObjectImpl::getFormObjectCount() {
return FPDFFormObj_CountObjects(
mpPageObject); }
779std::unique_ptr<PDFiumPageObject> PDFiumPageObjectImpl::getFormObject(
int nIndex)
781 std::unique_ptr<PDFiumPageObject> pPDFiumFormObject;
782 FPDF_PAGEOBJECT pFormObject = FPDFFormObj_GetObject(
mpPageObject, nIndex);
785 pPDFiumFormObject = std::make_unique<PDFiumPageObjectImpl>(pFormObject);
787 return pPDFiumFormObject;
808 if (FPDFPageObj_GetBounds(
mpPageObject, &left, &bottom, &right, &top))
812 return aB2DRectangle;
815double PDFiumPageObjectImpl::getFontSize()
822OUString PDFiumPageObjectImpl::getFontName()
825 const int nFontName = 80 + 1;
826 std::unique_ptr<char[]> pFontName(
new char[nFontName]);
827 FPDF_FONT pFontObject = FPDFTextObj_GetFont(
mpPageObject);
828 int nFontNameChars = FPDFFont_GetFontName(pFontObject, pFontName.get(), nFontName);
829 if (nFontName >= nFontNameChars)
831 sFontName = OUString::createFromAscii(pFontName.get());
841Color PDFiumPageObjectImpl::getFillColor()
844 unsigned int nR, nG, nB, nA;
845 if (FPDFPageObj_GetFillColor(
mpPageObject, &nR, &nG, &nB, &nA))
847 aColor =
Color(ColorAlpha, nA, nR, nG, nB);
852Color PDFiumPageObjectImpl::getStrokeColor()
855 unsigned int nR, nG, nB, nA;
856 if (FPDFPageObj_GetStrokeColor(
mpPageObject, &nR, &nG, &nB, &nA))
858 aColor =
Color(ColorAlpha, nA, nR, nG, nB);
863double PDFiumPageObjectImpl::getStrokeWidth()
870int PDFiumPageObjectImpl::getPathSegmentCount() {
return FPDFPath_CountSegments(
mpPageObject); }
872std::unique_ptr<PDFiumPathSegment> PDFiumPageObjectImpl::getPathSegment(
int index)
874 std::unique_ptr<PDFiumPathSegment> pPDFiumPathSegment;
875 FPDF_PATHSEGMENT pPathSegment = FPDFPath_GetPathSegment(
mpPageObject, index);
878 pPDFiumPathSegment = std::make_unique<PDFiumPathSegmentImpl>(pPathSegment);
880 return pPDFiumPathSegment;
883Size PDFiumPageObjectImpl::getImageSize(PDFiumPage& rPage)
885 FPDF_IMAGEOBJ_METADATA aMeta;
886 auto& rPageImpl =
static_cast<PDFiumPageImpl&
>(rPage);
887 FPDFImageObj_GetImageMetadata(
mpPageObject, rPageImpl.getPointer(), &aMeta);
888 return Size(aMeta.width, aMeta.height);
891std::unique_ptr<PDFiumBitmap> PDFiumPageObjectImpl::getImageBitmap()
893 std::unique_ptr<PDFiumBitmap> pPDFiumBitmap;
894 FPDF_BITMAP pBitmap = FPDFImageObj_GetBitmap(
mpPageObject);
897 pPDFiumBitmap = std::make_unique<PDFiumBitmapImpl>(pBitmap);
899 return pPDFiumBitmap;
902bool PDFiumPageObjectImpl::getDrawMode(
PDFFillMode& rFillMode,
bool& rStroke)
904 auto nFillMode =
static_cast<int>(rFillMode);
905 auto bStroke =
static_cast<FPDF_BOOL
>(rStroke);
906 bool bRet = FPDFPath_GetDrawMode(
mpPageObject, &nFillMode, &bStroke);
908 rStroke =
static_cast<bool>(bStroke);
914 size_t nPageWidth = getWidth();
915 size_t nPageHeight = getHeight();
916 auto pPdfBitmap = std::make_unique<PDFiumBitmapImpl>(
917 FPDFBitmap_Create(nPageWidth, nPageHeight, 1));
929 FPDF_RenderPageBitmap(pPdfBitmap->getPointer(),
mpPage, 0, 0,
930 nPageWidth, nPageHeight,
935 const auto pPdfBuffer
936 =
static_cast<ConstScanline>(FPDFBitmap_GetBuffer(pPdfBitmap->getPointer()));
937 const int nStride = FPDFBitmap_GetStride(pPdfBitmap->getPointer());
938 for (
size_t nRow = 0; nRow < nPageHeight; ++nRow)
944 return aBitmap.GetChecksum();
947double PDFiumPageImpl::getWidth() {
return FPDF_GetPageWidth(
mpPage); }
949double PDFiumPageImpl::getHeight() {
return FPDF_GetPageHeight(
mpPage); }
951bool PDFiumPageImpl::hasTransparency() {
return FPDFPage_HasTransparency(
mpPage); }
953PDFiumPathSegmentImpl::PDFiumPathSegmentImpl(FPDF_PATHSEGMENT pPathSegment)
967bool PDFiumPathSegmentImpl::isClosed()
const {
return FPDFPathSegment_GetClose(
mpPathSegment); }
974PDFiumFormHandle::PDFiumFormHandle(FPDF_FORMHANDLE pHandle)
979PDFiumFormHandle::~PDFiumFormHandle() { FPDFDOC_ExitFormFillEnvironment(
mpHandle); }
981FPDF_FORMHANDLE PDFiumFormHandle::getPointer() {
return mpHandle; }
983PDFiumBitmapImpl::PDFiumBitmapImpl(FPDF_BITMAP pBitmap)
988PDFiumBitmapImpl::~PDFiumBitmapImpl()
996void PDFiumBitmapImpl::fillRect(
int left,
int top,
int width,
int height, sal_uInt32 nColor)
998 FPDFBitmap_FillRect(
mpBitmap, left, top, width, height, nColor);
1001void PDFiumBitmapImpl::renderPageBitmap(PDFiumDocument* pDoc, PDFiumPage* pPage,
int nStartX,
1002 int nStartY,
int nSizeX,
int nSizeY)
1004 auto pPageImpl =
static_cast<PDFiumPageImpl*
>(pPage);
1005 FPDF_RenderPageBitmap(
mpBitmap, pPageImpl->getPointer(), nStartX, nStartY, nSizeX, nSizeY,
1009 auto pDocImpl =
static_cast<PDFiumDocumentImpl*
>(pDoc);
1010 FPDF_FFLDraw(pDocImpl->getFormHandlePointer(),
mpBitmap, pPageImpl->getPointer(), nStartX,
1011 nStartY, nSizeX, nSizeY, 0, 0);
1019int PDFiumBitmapImpl::getStride() {
return FPDFBitmap_GetStride(
mpBitmap); }
1021int PDFiumBitmapImpl::getWidth() {
return FPDFBitmap_GetWidth(
mpBitmap); }
1023int PDFiumBitmapImpl::getHeight() {
return FPDFBitmap_GetHeight(
mpBitmap); }
1030PDFiumAnnotationImpl::PDFiumAnnotationImpl(FPDF_ANNOTATION pAnnotation)
1035PDFiumAnnotationImpl::~PDFiumAnnotationImpl()
1054 return aB2DRectangle;
1060 unsigned int nR, nG, nB, nA;
1061 if (FPDFAnnot_GetColor(
mpAnnotation, FPDFANNOT_COLORTYPE_Color, &nR, &nG, &nB, &nA))
1063 aColor =
Color(ColorAlpha, nA, nR, nG, nB);
1068Color PDFiumAnnotationImpl::getInteriorColor()
1071 unsigned int nR, nG, nB, nA;
1072 if (FPDFAnnot_GetColor(
mpAnnotation, FPDFANNOT_COLORTYPE_InteriorColor, &nR, &nG, &nB, &nA))
1074 aColor =
Color(ColorAlpha, nA, nR, nG, nB);
1079size_t PDFiumAnnotationImpl::getAttachmentPointsCount()
1084std::vector<basegfx::B2DPoint> PDFiumAnnotationImpl::getAttachmentPoints(
size_t nIndex)
1086 std::vector<basegfx::B2DPoint> aQuads;
1088 FS_QUADPOINTSF aQuadpoints;
1089 if (FPDFAnnot_GetAttachmentPoints(
mpAnnotation, nIndex, &aQuadpoints))
1091 aQuads.emplace_back(aQuadpoints.x1, aQuadpoints.y1);
1092 aQuads.emplace_back(aQuadpoints.x2, aQuadpoints.y2);
1093 aQuads.emplace_back(aQuadpoints.x3, aQuadpoints.y3);
1094 aQuads.emplace_back(aQuadpoints.x4, aQuadpoints.y4);
1099std::vector<basegfx::B2DPoint> PDFiumAnnotationImpl::getLineGeometry()
1101 std::vector<basegfx::B2DPoint> aLine;
1106 aLine.emplace_back(aStart.x, aStart.y);
1107 aLine.emplace_back(aEnd.x, aEnd.y);
1114bool getBorderProperties(FPDF_ANNOTATION
mpAnnotation,
float& rHorizontalCornerRadius,
1115 float& rVerticalCornerRadius,
float& rBorderWidth)
1117 float fHoriRadius = 0.0f;
1118 float fVertRadius = 0.0f;
1119 float fWidth = 0.0f;
1121 if (!FPDFAnnot_GetBorder(
mpAnnotation, &fHoriRadius, &fVertRadius, &fWidth))
1124 rHorizontalCornerRadius = fHoriRadius;
1125 rVerticalCornerRadius = fVertRadius;
1126 rBorderWidth = fWidth;
1131float PDFiumAnnotationImpl::getBorderWidth()
1133 float fHorizontalCornerRadius;
1134 float fVerticalCornerRadius;
1137 if (!getBorderProperties(
mpAnnotation, fHorizontalCornerRadius, fVerticalCornerRadius,
1140 return fBorderWidth;
1145 float fHorizontalCornerRadius;
1146 float fVerticalCornerRadius;
1149 if (!getBorderProperties(
mpAnnotation, fHorizontalCornerRadius, fVerticalCornerRadius,
1155bool PDFiumAnnotationImpl::hasKey(OString
const& rKey)
1160PDFObjectType PDFiumAnnotationImpl::getValueType(OString
const& rKey)
1165OUString PDFiumAnnotationImpl::getString(OString
const& rKey)
1168 unsigned long nSize = FPDFAnnot_GetStringValue(
mpAnnotation, rKey.getStr(),
nullptr, 0);
1169 assert(nSize % 2 == 0);
1173 std::unique_ptr<sal_Unicode[]> pText(
new sal_Unicode[nSize]);
1174 unsigned long nStringSize = FPDFAnnot_GetStringValue(
1175 mpAnnotation, rKey.getStr(),
reinterpret_cast<FPDF_WCHAR*
>(pText.get()), nSize * 2);
1176 assert(nStringSize % 2 == 0);
1178 if (nStringSize > 0)
1180#if defined OSL_BIGENDIAN
1182 for (
unsigned long i = 0;
i != nStringSize; ++
i)
1184 pText[
i] = OSL_SWAPWORD(pText[i]);
1187 rString = OUString(pText.get());
1193std::vector<std::vector<basegfx::B2DPoint>> PDFiumAnnotationImpl::getInkStrokes()
1195 std::vector<std::vector<basegfx::B2DPoint>> aB2DPointList;
1196 int nInkStrokes = FPDFAnnot_GetInkListCount(
mpAnnotation);
1197 for (
int i = 0;
i < nInkStrokes;
i++)
1199 std::vector<basegfx::B2DPoint> aB2DPoints;
1200 int nPoints = FPDFAnnot_GetInkListPath(
mpAnnotation, i,
nullptr, 0);
1203 std::vector<FS_POINTF> aPoints(nPoints);
1204 if (FPDFAnnot_GetInkListPath(
mpAnnotation, i, aPoints.data(), aPoints.size()))
1206 for (
auto const& rPoint : aPoints)
1208 aB2DPoints.emplace_back(rPoint.x, rPoint.y);
1210 aB2DPointList.push_back(aB2DPoints);
1214 return aB2DPointList;
1217std::vector<basegfx::B2DPoint> PDFiumAnnotationImpl::getVertices()
1219 std::vector<basegfx::B2DPoint> aB2DPoints;
1220 int nPoints = FPDFAnnot_GetVertices(
mpAnnotation,
nullptr, 0);
1223 std::vector<FS_POINTF> aPoints(nPoints);
1224 if (FPDFAnnot_GetVertices(
mpAnnotation, aPoints.data(), aPoints.size()))
1226 for (
auto const& rPoint : aPoints)
1227 aB2DPoints.emplace_back(rPoint.x, rPoint.y);
1233std::unique_ptr<PDFiumAnnotation> PDFiumAnnotationImpl::getLinked(OString
const& rKey)
1235 std::unique_ptr<PDFiumAnnotation> pPDFiumAnnotation;
1236 FPDF_ANNOTATION pAnnotation = FPDFAnnot_GetLinkedAnnot(
mpAnnotation, rKey.getStr());
1239 pPDFiumAnnotation = std::make_unique<PDFiumAnnotationImpl>(pAnnotation);
1241 return pPDFiumAnnotation;
1244int PDFiumAnnotationImpl::getObjectCount() {
return FPDFAnnot_GetObjectCount(
mpAnnotation); }
1246std::unique_ptr<PDFiumPageObject> PDFiumAnnotationImpl::getObject(
int nIndex)
1248 std::unique_ptr<PDFiumPageObject> pPDFiumPageObject;
1249 FPDF_PAGEOBJECT pPageObject = FPDFAnnot_GetObject(
mpAnnotation, nIndex);
1252 pPDFiumPageObject = std::make_unique<PDFiumPageObjectImpl>(pPageObject);
1254 return pPDFiumPageObject;
1257PDFiumTextPageImpl::PDFiumTextPageImpl(FPDF_TEXTPAGE pTextPage)
1262PDFiumTextPageImpl::~PDFiumTextPageImpl()
1268int PDFiumTextPageImpl::countChars() {
return FPDFText_CountChars(
mpTextPage); }
1277 if (FPDFText_GetCharBox(
mpTextPage, nIndex, &left, &right, &bottom, &top))
1290unsigned int PDFiumTextPageImpl::getUnicode(
int index)
1292 return FPDFText_GetUnicode(
mpTextPage, index);
1295std::unique_ptr<PDFiumSearchHandle>
1296PDFiumTextPageImpl::findStart(
const OUString& rFindWhat,
PDFFindFlags nFlags, sal_Int32 nStartIndex)
1298 FPDF_WIDESTRING pFindWhat =
reinterpret_cast<FPDF_WIDESTRING
>(rFindWhat.getStr());
1299 return std::make_unique<vcl::pdf::PDFiumSearchHandleImpl>(
1300 FPDFText_FindStart(
mpTextPage, pFindWhat,
static_cast<sal_uInt32
>(nFlags), nStartIndex));
1303PDFiumSearchHandleImpl::PDFiumSearchHandleImpl(FPDF_SCHHANDLE pSearchHandle)
1308PDFiumSearchHandleImpl::~PDFiumSearchHandleImpl()
1314bool PDFiumSearchHandleImpl::findNext() {
return FPDFText_FindNext(
mpSearchHandle); }
1316bool PDFiumSearchHandleImpl::findPrev() {
return FPDFText_FindPrev(
mpSearchHandle); }
1318int PDFiumSearchHandleImpl::getSearchResultIndex()
1323int PDFiumSearchHandleImpl::getSearchCount() {
return FPDFText_GetSchCount(
mpSearchHandle); }
1325std::shared_ptr<PDFium>& PDFiumLibrary::get()
1327 static std::shared_ptr<PDFium> pInstance = std::make_shared<PDFiumImpl>();
FPDF_DOCUMENT mpPdfDocument
FPDF_ANNOTATION mpAnnotation
FPDF_SIGNATURE mpSignature
FPDF_PAGEOBJECT mpPageObject
FPDF_PATHSEGMENT mpPathSegment
std::unique_ptr< PDFiumFormHandle > m_pFormHandle
FPDF_SCHHANDLE mpSearchHandle
FPDF_FORMFILLINFO m_aFormCallbacks
const sal_uInt8 * ConstScanline
constexpr auto convertPointToMm100(N n)
static BitmapColor getColor(const BitmapReadAccess *pReadAcc, tools::Long nZ)
sal_uInt64 BitmapChecksum
std::size_t WriteBytes(const void *pData, std::size_t nSize)
static B2DHomMatrix abcdef(double da, double db, double dc, double dd, double de, double df)
This template handles BitmapAccess the RAII way.
constexpr ::Color COL_TRANSPARENT(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
OUString getString(const Any &_rAny)
sal_Int32 toInt32(std::u16string_view str, sal_Int16 radix=10)
sal_Int32 getPageCount(const uno::Reference< frame::XModel > &xModel)
void fillRect(const ::cppcanvas::CanvasSharedPtr &rCanvas, const ::basegfx::B2DRectangle &rRect, ::cppcanvas::IntSRGBA aFillColor)
bool getType(BSTR name, Type &type)