2020-06-15 13:50:18 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
2020-12-28 17:56:40 +01:00
|
|
|
#include <string_view>
|
|
|
|
|
2020-06-15 13:50:18 +02:00
|
|
|
#include <cppunit/TestAssert.h>
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
|
|
|
|
#include <unotest/bootstrapfixturebase.hxx>
|
|
|
|
#include <unotest/directories.hxx>
|
2020-06-18 13:50:15 +02:00
|
|
|
#include <unotools/datetime.hxx>
|
|
|
|
|
|
|
|
#include <com/sun/star/util/DateTime.hpp>
|
2020-06-15 13:50:18 +02:00
|
|
|
|
|
|
|
#include <vcl/graph.hxx>
|
|
|
|
#include <vcl/graphicfilter.hxx>
|
|
|
|
#include <tools/stream.hxx>
|
|
|
|
|
|
|
|
#include <vcl/filter/PDFiumLibrary.hxx>
|
2021-05-05 11:18:30 +02:00
|
|
|
#include <vcl/pdfread.hxx>
|
|
|
|
#include <vcl/BitmapReadAccess.hxx>
|
2020-06-15 13:50:18 +02:00
|
|
|
|
|
|
|
class PDFiumLibraryTest : public test::BootstrapFixtureBase
|
|
|
|
{
|
2024-06-13 14:53:51 +09:00
|
|
|
protected:
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString getFullUrl(std::u16string_view sFileName)
|
2020-06-15 13:50:18 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
return m_directories.getURLFromSrc(u"/vcl/qa/cppunit/data/") + sFileName;
|
2020-06-15 13:50:18 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testDocument)
|
2020-06-15 13:50:18 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString aURL = getFullUrl(u"Pangram.pdf");
|
2020-06-15 13:50:18 +02:00
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
2020-12-29 10:42:17 +09:00
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
2020-06-15 13:50:18 +02:00
|
|
|
|
2020-12-28 10:03:18 +09:00
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
2020-06-15 13:50:18 +02:00
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
|
|
|
CPPUNIT_ASSERT(pPdfium);
|
tdf#127236 vcl: fix missing encryption of PDF images during export
Regression from commit 78e25558e86188314b9b72048b8ddca18697cb86
(tdf#106059 PDF export: create a reference XObject for JPG images with
PDF data, 2017-02-23), once a PDF image was inserted to a document, an
encrypted PDF export lost those images.
The reason for this is that we started to preserve PDF images as vector
data with the above commit, but this means we copied over PDF objects
from PDF images to the export result as-is, so encryption was not
performed for them.
Fix this by separating the write of the PDF object headers, stream
content and object footer and then calling
checkAndEnableStreamEncryption() / disableStreamEncryption() for each
object, even if it's not something our PDF export created but comes from
a PDF image.
Note that when existing PDF files are signed, PDF objects are also
copied into a vcl::filter::PDFDocument, but such PDF images are never
encrypted, so it's fine to have stub implementations in
vcl::filter::PDFDocument.
Change-Id: I2f74b9f51cd35b4319221532ca890e197bab9cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137242
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2022-07-20 08:16:57 +02:00
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
2020-06-15 13:50:18 +02:00
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto aSize = pDocument->getPageSize(0);
|
2022-09-08 11:12:27 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(612.0, aSize.getWidth());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(792.0, aSize.getHeight());
|
2020-06-28 10:12:17 +02:00
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testPages)
|
2020-06-28 10:12:17 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString aURL = getFullUrl(u"Pangram.pdf");
|
2020-06-28 10:12:17 +02:00
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
2020-12-29 10:42:17 +09:00
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
2020-06-28 10:12:17 +02:00
|
|
|
|
2020-12-28 10:03:18 +09:00
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
2020-06-28 10:12:17 +02:00
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
tdf#127236 vcl: fix missing encryption of PDF images during export
Regression from commit 78e25558e86188314b9b72048b8ddca18697cb86
(tdf#106059 PDF export: create a reference XObject for JPG images with
PDF data, 2017-02-23), once a PDF image was inserted to a document, an
encrypted PDF export lost those images.
The reason for this is that we started to preserve PDF images as vector
data with the above commit, but this means we copied over PDF objects
from PDF images to the export result as-is, so encryption was not
performed for them.
Fix this by separating the write of the PDF object headers, stream
content and object footer and then calling
checkAndEnableStreamEncryption() / disableStreamEncryption() for each
object, even if it's not something our PDF export created but comes from
a PDF image.
Note that when existing PDF files are signed, PDF objects are also
copied into a vcl::filter::PDFDocument, but such PDF images are never
encrypted, so it's fine to have stub implementations in
vcl::filter::PDFDocument.
Change-Id: I2f74b9f51cd35b4319221532ca890e197bab9cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137242
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2022-07-20 08:16:57 +02:00
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
2020-06-28 10:12:17 +02:00
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
2020-06-15 13:50:18 +02:00
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testPageObjects)
|
2020-06-15 13:50:18 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString aURL = getFullUrl(u"Pangram.pdf");
|
2020-06-15 13:50:18 +02:00
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
2020-12-29 10:42:17 +09:00
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
2020-06-15 13:50:18 +02:00
|
|
|
|
2020-12-28 10:03:18 +09:00
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
2020-06-15 13:50:18 +02:00
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
tdf#127236 vcl: fix missing encryption of PDF images during export
Regression from commit 78e25558e86188314b9b72048b8ddca18697cb86
(tdf#106059 PDF export: create a reference XObject for JPG images with
PDF data, 2017-02-23), once a PDF image was inserted to a document, an
encrypted PDF export lost those images.
The reason for this is that we started to preserve PDF images as vector
data with the above commit, but this means we copied over PDF objects
from PDF images to the export result as-is, so encryption was not
performed for them.
Fix this by separating the write of the PDF object headers, stream
content and object footer and then calling
checkAndEnableStreamEncryption() / disableStreamEncryption() for each
object, even if it's not something our PDF export created but comes from
a PDF image.
Note that when existing PDF files are signed, PDF objects are also
copied into a vcl::filter::PDFDocument, but such PDF images are never
encrypted, so it's fine to have stub implementations in
vcl::filter::PDFDocument.
Change-Id: I2f74b9f51cd35b4319221532ca890e197bab9cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137242
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2022-07-20 08:16:57 +02:00
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
2020-06-15 13:50:18 +02:00
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
2020-06-28 10:12:17 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(12, pPage->getObjectCount());
|
|
|
|
|
|
|
|
auto pPageObject = pPage->getObject(0);
|
|
|
|
auto pTextPage = pPage->getTextPage();
|
|
|
|
|
2020-11-10 21:12:29 +01:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Text, pPageObject->getType());
|
2020-06-28 13:46:41 +02:00
|
|
|
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"The quick, brown fox jumps over a lazy dog. DJs flock by when "
|
|
|
|
"MTV ax quiz prog. Junk MTV quiz "_ustr,
|
2020-06-28 10:12:17 +02:00
|
|
|
pPageObject->getText(pTextPage));
|
2020-06-28 13:46:41 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(12.0, pPageObject->getFontSize());
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Liberation Serif"_ustr, pPageObject->getFontName());
|
2021-01-07 22:19:59 +01:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFTextRenderMode::Fill, pPageObject->getTextRenderMode());
|
2020-06-28 13:46:41 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(COL_BLACK, pPageObject->getFillColor());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(COL_BLACK, pPageObject->getStrokeColor());
|
|
|
|
|
2021-07-13 20:28:17 +02:00
|
|
|
basegfx::B2DHomMatrix aMatrix = pPageObject->getMatrix();
|
|
|
|
// Ignore translation, ensure there is no rotate/scale.
|
|
|
|
aMatrix.set(0, 2, 0);
|
|
|
|
aMatrix.set(1, 2, 0);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, aMatrix.isIdentity());
|
2020-06-28 13:46:41 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(057.01, pPageObject->getBounds().getMinX(), 1E-2);
|
|
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(721.51, pPageObject->getBounds().getMinY(), 1E-2);
|
|
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(539.48, pPageObject->getBounds().getMaxX(), 1E-2);
|
|
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(732.54, pPageObject->getBounds().getMaxY(), 1E-2);
|
2020-06-15 13:50:18 +02:00
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testAnnotationsMadeInEvince)
|
2020-06-15 14:44:19 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString aURL = getFullUrl(u"PangramWithAnnotations.pdf");
|
2020-06-15 14:44:19 +02:00
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
2020-12-29 10:42:17 +09:00
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
2020-06-15 14:44:19 +02:00
|
|
|
|
2020-12-28 10:03:18 +09:00
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
tdf#127236 vcl: fix missing encryption of PDF images during export
Regression from commit 78e25558e86188314b9b72048b8ddca18697cb86
(tdf#106059 PDF export: create a reference XObject for JPG images with
PDF data, 2017-02-23), once a PDF image was inserted to a document, an
encrypted PDF export lost those images.
The reason for this is that we started to preserve PDF images as vector
data with the above commit, but this means we copied over PDF objects
from PDF images to the export result as-is, so encryption was not
performed for them.
Fix this by separating the write of the PDF object headers, stream
content and object footer and then calling
checkAndEnableStreamEncryption() / disableStreamEncryption() for each
object, even if it's not something our PDF export created but comes from
a PDF image.
Note that when existing PDF files are signed, PDF objects are also
copied into a vcl::filter::PDFDocument, but such PDF images are never
encrypted, so it's fine to have stub implementations in
vcl::filter::PDFDocument.
Change-Id: I2f74b9f51cd35b4319221532ca890e197bab9cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137242
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2022-07-20 08:16:57 +02:00
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
2020-06-15 14:44:19 +02:00
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(2, pPage->getAnnotationCount());
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(0);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text, pAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
OUString aPopupString = pAnnotation->getString(vcl::pdf::constDictionaryKeyTitle);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"quikee"_ustr, aPopupString);
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Annotation test"_ustr, aContentsString);
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, pAnnotation->hasKey(vcl::pdf::constDictionaryKeyPopup));
|
|
|
|
auto pPopupAnnotation = pAnnotation->getLinked(vcl::pdf::constDictionaryKeyPopup);
|
|
|
|
CPPUNIT_ASSERT(pPopupAnnotation);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationIndex(pPopupAnnotation));
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, pPopupAnnotation->getSubType());
|
2020-06-18 13:50:15 +02:00
|
|
|
|
|
|
|
OUString sDateTimeString
|
|
|
|
= pAnnotation->getString(vcl::pdf::constDictionaryKeyModificationDate);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"D:20200612201322+02'00"_ustr, sDateTimeString);
|
2020-06-15 14:44:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(1);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, pAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testAnnotationsMadeInAcrobat)
|
2020-06-15 14:44:19 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString aURL = getFullUrl(u"PangramAcrobatAnnotations.pdf");
|
2020-06-15 14:44:19 +02:00
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
2020-12-29 10:42:17 +09:00
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
2020-06-15 14:44:19 +02:00
|
|
|
|
2020-12-28 10:03:18 +09:00
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
tdf#127236 vcl: fix missing encryption of PDF images during export
Regression from commit 78e25558e86188314b9b72048b8ddca18697cb86
(tdf#106059 PDF export: create a reference XObject for JPG images with
PDF data, 2017-02-23), once a PDF image was inserted to a document, an
encrypted PDF export lost those images.
The reason for this is that we started to preserve PDF images as vector
data with the above commit, but this means we copied over PDF objects
from PDF images to the export result as-is, so encryption was not
performed for them.
Fix this by separating the write of the PDF object headers, stream
content and object footer and then calling
checkAndEnableStreamEncryption() / disableStreamEncryption() for each
object, even if it's not something our PDF export created but comes from
a PDF image.
Note that when existing PDF files are signed, PDF objects are also
copied into a vcl::filter::PDFDocument, but such PDF images are never
encrypted, so it's fine to have stub implementations in
vcl::filter::PDFDocument.
Change-Id: I2f74b9f51cd35b4319221532ca890e197bab9cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137242
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2022-07-20 08:16:57 +02:00
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
2020-06-15 14:44:19 +02:00
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(4, pPage->getAnnotationCount());
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(0);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text, pAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
OUString aPopupString = pAnnotation->getString(vcl::pdf::constDictionaryKeyTitle);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"quikee"_ustr, aPopupString);
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"YEEEY"_ustr, aContentsString);
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, pAnnotation->hasKey(vcl::pdf::constDictionaryKeyPopup));
|
|
|
|
auto pPopupAnnotation = pAnnotation->getLinked(vcl::pdf::constDictionaryKeyPopup);
|
|
|
|
CPPUNIT_ASSERT(pPopupAnnotation);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationIndex(pPopupAnnotation));
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, pPopupAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(1);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, pAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(2);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text, pAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
OUString aPopupString = pAnnotation->getString(vcl::pdf::constDictionaryKeyTitle);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"quikee"_ustr, aPopupString);
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Note"_ustr, aContentsString);
|
2020-06-15 14:44:19 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, pAnnotation->hasKey(vcl::pdf::constDictionaryKeyPopup));
|
|
|
|
auto pPopupAnnotation = pAnnotation->getLinked(vcl::pdf::constDictionaryKeyPopup);
|
|
|
|
CPPUNIT_ASSERT(pPopupAnnotation);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(3, pPage->getAnnotationIndex(pPopupAnnotation));
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, pPopupAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(3);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-08-31 07:53:55 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup, pAnnotation->getSubType());
|
2020-06-15 14:44:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testFormFields)
|
2021-05-05 11:18:30 +02:00
|
|
|
{
|
|
|
|
// Given a document with a form field that looks like plain text:
|
|
|
|
OUString aURL = getFullUrl(u"form-fields.pdf");
|
|
|
|
SvFileStream aFileStream(aURL, StreamMode::READ);
|
|
|
|
SvMemoryStream aMemory;
|
|
|
|
aMemory.WriteStream(aFileStream);
|
|
|
|
aMemory.Seek(0);
|
|
|
|
|
|
|
|
// When rendering its first (and only) page to a bitmap:
|
|
|
|
std::vector<BitmapEx> aBitmaps;
|
|
|
|
int nRet = vcl::RenderPDFBitmaps(aMemory.GetData(), aMemory.GetSize(), aBitmaps);
|
|
|
|
CPPUNIT_ASSERT(nRet);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aBitmaps.size());
|
|
|
|
|
|
|
|
// Then make sure the bitmap contains that text:
|
|
|
|
Bitmap aBitmap = aBitmaps[0].GetBitmap();
|
|
|
|
BitmapReadAccess aAccess(aBitmap);
|
|
|
|
Size aSize = aBitmap.GetSizePixel();
|
|
|
|
std::set<sal_uInt32> aColors;
|
|
|
|
for (tools::Long y = 0; y < aSize.Height(); ++y)
|
|
|
|
{
|
|
|
|
for (tools::Long x = 0; x < aSize.Width(); ++x)
|
|
|
|
{
|
|
|
|
aColors.insert(static_cast<sal_uInt32>(aAccess.GetPixel(y, x)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Without the accompanying fix in place, this test would have failed with:
|
|
|
|
// - Expected greater than: 1
|
|
|
|
// - Actual : 1
|
|
|
|
// i.e. at least black text and white background is expected (possibly more, due to
|
|
|
|
// anti-aliasing), but nothing was rendered.
|
|
|
|
CPPUNIT_ASSERT_GREATER(static_cast<size_t>(1), aColors.size());
|
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testAnnotationsDifferentTypes)
|
2020-09-03 20:15:36 +02:00
|
|
|
{
|
2020-12-28 17:56:40 +01:00
|
|
|
OUString aURL = getFullUrl(u"PangramWithMultipleTypeOfAnnotations.pdf");
|
2020-09-03 20:15:36 +02:00
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
2020-12-29 10:42:17 +09:00
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
2020-09-03 20:15:36 +02:00
|
|
|
|
2020-12-28 10:03:18 +09:00
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
2020-09-03 20:15:36 +02:00
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
tdf#127236 vcl: fix missing encryption of PDF images during export
Regression from commit 78e25558e86188314b9b72048b8ddca18697cb86
(tdf#106059 PDF export: create a reference XObject for JPG images with
PDF data, 2017-02-23), once a PDF image was inserted to a document, an
encrypted PDF export lost those images.
The reason for this is that we started to preserve PDF images as vector
data with the above commit, but this means we copied over PDF objects
from PDF images to the export result as-is, so encryption was not
performed for them.
Fix this by separating the write of the PDF object headers, stream
content and object footer and then calling
checkAndEnableStreamEncryption() / disableStreamEncryption() for each
object, even if it's not something our PDF export created but comes from
a PDF image.
Note that when existing PDF files are signed, PDF objects are also
copied into a vcl::filter::PDFDocument, but such PDF images are never
encrypted, so it's fine to have stub implementations in
vcl::filter::PDFDocument.
Change-Id: I2f74b9f51cd35b4319221532ca890e197bab9cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137242
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2022-07-20 08:16:57 +02:00
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
2020-09-03 20:15:36 +02:00
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
|
|
|
|
2020-09-29 11:49:58 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(6, pPage->getAnnotationCount());
|
2020-09-03 20:15:36 +02:00
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(0);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::FreeText, pAnnotation->getSubType());
|
2020-09-29 11:49:58 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pAnnotation->getObjectCount());
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Inline Note"_ustr, aContentsString);
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aLineGeometry = pAnnotation->getLineGeometry();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, aLineGeometry.empty());
|
2020-09-03 20:15:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(1);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-09-29 11:49:58 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Ink, pAnnotation->getSubType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pAnnotation->getObjectCount());
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Freehand Text"_ustr, aContentsString);
|
2020-10-03 11:02:34 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(size_t(1), pAnnotation->getInkStrokes().size());
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aInkStrokes = pAnnotation->getInkStrokes();
|
2020-10-03 11:02:34 +02:00
|
|
|
auto const& aPoints = aInkStrokes[0];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(size_t(74), aPoints.size());
|
2020-10-14 22:54:38 +02:00
|
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0f, pAnnotation->getBorderWidth(), 1E-2);
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aLineGeometry = pAnnotation->getLineGeometry();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, aLineGeometry.empty());
|
2020-09-29 11:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(2);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
2020-09-03 20:15:36 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Line, pAnnotation->getSubType());
|
2020-09-29 11:49:58 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pAnnotation->getObjectCount());
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Line Text"_ustr, aContentsString);
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aLineGeometry = pAnnotation->getLineGeometry();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, aLineGeometry.empty());
|
2020-09-29 11:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(3);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Polygon, pAnnotation->getSubType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pAnnotation->getObjectCount());
|
2023-11-19 13:22:44 +01:00
|
|
|
CPPUNIT_ASSERT_EQUAL(true, pAnnotation->hasKey("Vertices"_ostr));
|
2020-09-29 11:49:58 +02:00
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Polygon Text"_ustr, aContentsString);
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aVertices = pAnnotation->getVertices();
|
2020-10-03 11:02:34 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(size_t(3), aVertices.size());
|
2020-10-14 22:54:38 +02:00
|
|
|
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0f, pAnnotation->getBorderWidth(), 1E-2);
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aLineGeometry = pAnnotation->getLineGeometry();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, aLineGeometry.empty());
|
2020-09-29 11:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(4);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Circle, pAnnotation->getSubType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pAnnotation->getObjectCount());
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Ellipse Text"_ustr, aContentsString);
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aLineGeometry = pAnnotation->getLineGeometry();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, aLineGeometry.empty());
|
2020-09-29 11:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pAnnotation = pPage->getAnnotation(5);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Square, pAnnotation->getSubType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pAnnotation->getObjectCount());
|
|
|
|
OUString aContentsString = pAnnotation->getString(vcl::pdf::constDictionaryKeyContents);
|
2024-05-10 13:19:35 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Rectangle Text"_ustr, aContentsString);
|
2020-10-15 09:07:31 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(Color(0xFF, 0xE0, 0x00), pAnnotation->getColor());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, pAnnotation->hasKey(vcl::pdf::constDictionaryKeyInteriorColor));
|
2024-11-12 21:03:31 +02:00
|
|
|
auto const aLineGeometry = pAnnotation->getLineGeometry();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, aLineGeometry.empty());
|
2020-09-03 20:15:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-13 20:53:56 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testAnnotationsFreeText)
|
|
|
|
{
|
|
|
|
OUString aURL = getFullUrl(u"Annotations_Adobe_FreeText.pdf");
|
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
|
|
|
|
std::vector<vcl::PDFGraphicResult> aResults;
|
|
|
|
CPPUNIT_ASSERT_EQUAL(size_t(1), vcl::ImportPDFUnloaded(aURL, aResults));
|
|
|
|
|
|
|
|
vcl::PDFGraphicResult& rResult = aResults[0];
|
|
|
|
|
|
|
|
Graphic aGraphic = rResult.GetGraphic();
|
|
|
|
aGraphic.makeAvailable();
|
|
|
|
|
|
|
|
OUString aDefaultStyle;
|
|
|
|
OUString aRichContent;
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
|
|
|
|
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationCount());
|
|
|
|
|
|
|
|
auto pAnnotation = pPage->getAnnotation(0);
|
|
|
|
CPPUNIT_ASSERT(pAnnotation);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::FreeText, pAnnotation->getSubType());
|
|
|
|
|
|
|
|
aDefaultStyle = pAnnotation->getString(vcl::pdf::constDictionaryKey_DefaultStyle);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, aDefaultStyle.isEmpty());
|
|
|
|
|
|
|
|
aRichContent = pAnnotation->getString(vcl::pdf::constDictionaryKey_RichContent);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, aRichContent.isEmpty());
|
|
|
|
}
|
|
|
|
|
|
|
|
auto const& rAnnotations = rResult.GetAnnotations();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(size_t(1), rAnnotations.size());
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::FreeText, rAnnotations[0].meSubType);
|
|
|
|
|
|
|
|
auto* pMarker
|
|
|
|
= static_cast<vcl::pdf::PDFAnnotationMarkerFreeText*>(rAnnotations[0].mpMarker.get());
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(aDefaultStyle, pMarker->maDefaultStyle);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(aRichContent, pMarker->maRichContent);
|
|
|
|
}
|
|
|
|
|
2024-06-13 14:53:51 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testTools)
|
2020-06-18 13:50:15 +02:00
|
|
|
{
|
2022-09-20 14:50:10 +02:00
|
|
|
OUString sConverted = vcl::pdf::convertPdfDateToISO8601(u"D:20200612201322+02'00");
|
2020-06-18 13:50:15 +02:00
|
|
|
|
|
|
|
css::util::DateTime aDateTime;
|
|
|
|
CPPUNIT_ASSERT(utl::ISO8601parseDateTime(sConverted, aDateTime));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_Int16(2020), aDateTime.Year);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), aDateTime.Month);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_uInt16(12), aDateTime.Day);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_uInt16(20), aDateTime.Hours);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_uInt16(13), aDateTime.Minutes);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_uInt16(22), aDateTime.Seconds);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aDateTime.NanoSeconds);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, bool(aDateTime.IsUTC));
|
|
|
|
}
|
|
|
|
|
2025-01-10 23:26:03 +09:00
|
|
|
CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testStructureTree)
|
|
|
|
{
|
|
|
|
OUString aURL = getFullUrl(u"StructureTreeExampleDocument.pdf");
|
|
|
|
SvFileStream aStream(aURL, StreamMode::READ);
|
|
|
|
GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
|
|
|
|
Graphic aGraphic = rGraphicFilter.ImportUnloadedGraphic(aStream);
|
|
|
|
auto pVectorGraphicData = aGraphic.getVectorGraphicData();
|
|
|
|
CPPUNIT_ASSERT(pVectorGraphicData);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
|
|
|
|
auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer();
|
|
|
|
|
|
|
|
auto pPdfium = vcl::pdf::PDFiumLibrary::get();
|
|
|
|
CPPUNIT_ASSERT(pPdfium);
|
|
|
|
|
|
|
|
auto pDocument
|
|
|
|
= pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString());
|
|
|
|
CPPUNIT_ASSERT(pDocument);
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount());
|
|
|
|
|
|
|
|
auto pPage = pDocument->openPage(0);
|
|
|
|
CPPUNIT_ASSERT(pPage);
|
|
|
|
|
|
|
|
auto pTree = pPage->getStructureTree();
|
|
|
|
CPPUNIT_ASSERT(pTree);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pTree->getNumberOfChildren());
|
|
|
|
|
|
|
|
// Check the structure
|
|
|
|
{
|
|
|
|
auto pChildDocument = pTree->getChild(0);
|
|
|
|
CPPUNIT_ASSERT(pChildDocument);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(5, pChildDocument->getNumberOfChildren());
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u""_ustr, pChildDocument->getAltText());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u""_ustr, pChildDocument->getActualText());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u""_ustr, pChildDocument->getID());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u""_ustr, pChildDocument->getLang());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u""_ustr, pChildDocument->getTitle());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Document"_ustr, pChildDocument->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"StructElem"_ustr, pChildDocument->getObjectType());
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pThis = pChildDocument->getChild(0);
|
|
|
|
CPPUNIT_ASSERT(pThis);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pThis->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pThis->getNumberOfChildren());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, pThis->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pThis = pChildDocument->getChild(1);
|
|
|
|
CPPUNIT_ASSERT(pThis);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"H1"_ustr, pThis->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(2, pThis->getNumberOfChildren());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pThis->getChildMarkedContentID(0));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(2, pThis->getChildMarkedContentID(1));
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pThis = pChildDocument->getChild(2);
|
|
|
|
CPPUNIT_ASSERT(pThis);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pThis->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(13, pThis->getNumberOfChildren());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(3, pThis->getChildMarkedContentID(0));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Code"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(4, pChild->getChildMarkedContentID(0));
|
|
|
|
|
|
|
|
// Check getParent
|
|
|
|
auto pThis2 = pChild->getParent();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pThis2->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(13, pThis2->getNumberOfChildren());
|
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT_EQUAL(5, pThis->getChildMarkedContentID(2));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(6, pThis->getChildMarkedContentID(3));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(4);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Span"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(7, pChild->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT_EQUAL(8, pThis->getChildMarkedContentID(5));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(9, pThis->getChildMarkedContentID(6));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(7);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Span"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(10, pChild->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT_EQUAL(11, pThis->getChildMarkedContentID(8));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(12, pThis->getChildMarkedContentID(9));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(10);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Span"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(13, pChild->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT_EQUAL(14, pThis->getChildMarkedContentID(11));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(12);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Span"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(15, pChild->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pThis = pChildDocument->getChild(3);
|
|
|
|
CPPUNIT_ASSERT(pThis);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pThis->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(4, pThis->getNumberOfChildren());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(16, pThis->getChildMarkedContentID(0));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Quote"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(17, pChild->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT_EQUAL(18, pThis->getChildMarkedContentID(2));
|
|
|
|
{
|
|
|
|
auto pChild = pThis->getChild(3);
|
|
|
|
// Rectangle
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Div"_ustr, pChild->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"Only Text! - The Alt Text!"_ustr, pChild->getAltText());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(20, pChild->getChildMarkedContentID(0));
|
|
|
|
{
|
|
|
|
// Text in rectangle
|
|
|
|
auto pRectangleElement = pChild->getChild(1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pRectangleElement->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(21, pRectangleElement->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pThis = pChildDocument->getChild(4);
|
|
|
|
CPPUNIT_ASSERT(pThis);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pThis->getType());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, pThis->getNumberOfChildren());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(19, pThis->getChildMarkedContentID(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
auto pThis = pChildDocument->getChild(5);
|
|
|
|
CPPUNIT_ASSERT(!pThis);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-15 13:50:18 +02:00
|
|
|
CPPUNIT_PLUGIN_IMPLEMENT();
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|