tdf#160714 use crop box for bounds of embedded PDF object
If there is no crop box, fallback to the media box just to be safe. Change-Id: I29f99a43e550cf09a1534c0aa01ffd6a55536fb7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166544 Tested-by: Jenkins Reviewed-by: Patrick Luby <guibomacdev@gmail.com>
This commit is contained in:
parent
e835642a93
commit
4b31f87e91
2 changed files with 15 additions and 5 deletions
|
@ -45,6 +45,7 @@
|
|||
#include <docsh.hxx>
|
||||
|
||||
#include <vcl/filter/PDFiumLibrary.hxx>
|
||||
#include <vcl/pdfread.hxx>
|
||||
#include <comphelper/propertyvalue.hxx>
|
||||
#include <cmath>
|
||||
|
||||
|
@ -4627,7 +4628,10 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest2, testRexportMediaBoxOrigin)
|
|||
= { // Rotation by $\theta$ $cos(\theta), sin(\theta), -sin(\theta), cos(\theta)$
|
||||
0, -1, 1, 0,
|
||||
// Translate x,y
|
||||
-aOrigin[1] - aSize[1] / 2 + aSize[0] / 2, aOrigin[0] + aSize[0] / 2 + aSize[1] / 2
|
||||
-aOrigin[1] - aSize[1] / vcl::PDF_INSERT_MAGIC_SCALE_FACTOR / 2
|
||||
+ aSize[0] / vcl::PDF_INSERT_MAGIC_SCALE_FACTOR / 2,
|
||||
aOrigin[0] + aSize[0] / vcl::PDF_INSERT_MAGIC_SCALE_FACTOR / 2
|
||||
+ aSize[1] / vcl::PDF_INSERT_MAGIC_SCALE_FACTOR / 2
|
||||
};
|
||||
|
||||
for (sal_Int32 nIdx = 0; nIdx < 6; ++nIdx)
|
||||
|
|
|
@ -9124,9 +9124,15 @@ void PDFWriterImpl::writeReferenceXObject(const ReferenceXObjectEmit& rEmit)
|
|||
}
|
||||
|
||||
double aOrigin[2] = { 0.0, 0.0 };
|
||||
if (auto* pArray = dynamic_cast<filter::PDFArrayElement*>(pPage->Lookup("MediaBox"_ostr)))
|
||||
|
||||
// tdf#160714 use crop box for bounds of embedded PDF object
|
||||
// If there is no crop box, fallback to the media box just to be safe.
|
||||
auto* pBoundsArray = dynamic_cast<filter::PDFArrayElement*>(pPage->Lookup("CropBox"_ostr));
|
||||
if (!pBoundsArray)
|
||||
pBoundsArray = dynamic_cast<filter::PDFArrayElement*>(pPage->Lookup("MediaBox"_ostr));
|
||||
if (pBoundsArray)
|
||||
{
|
||||
const auto& rElements = pArray->GetElements();
|
||||
const auto& rElements = pBoundsArray->GetElements();
|
||||
if (rElements.size() >= 4)
|
||||
{
|
||||
// get x1, y1 of the rectangle.
|
||||
|
@ -9239,9 +9245,9 @@ void PDFWriterImpl::writeReferenceXObject(const ReferenceXObjectEmit& rEmit)
|
|||
// Now transform the object: rotate around the center and make sure that the rotation
|
||||
// doesn't affect the aspect ratio.
|
||||
basegfx::B2DHomMatrix aMat;
|
||||
aMat.translate(-0.5 * aBBox.getWidth() - aOrigin[0], -0.5 * aBBox.getHeight() - aOrigin[1]);
|
||||
aMat.translate((-0.5 * aBBox.getWidth() / fMagicScaleFactor) - aOrigin[0], (-0.5 * aBBox.getHeight() / fMagicScaleFactor) - aOrigin[1]);
|
||||
aMat.rotate(basegfx::deg2rad(nAngle));
|
||||
aMat.translate(0.5 * nWidth, 0.5 * nHeight);
|
||||
aMat.translate(0.5 * nWidth / fMagicScaleFactor, 0.5 * nHeight / fMagicScaleFactor);
|
||||
|
||||
aLine.append(" /Matrix [ ");
|
||||
aLine.append(aMat.a());
|
||||
|
|
Loading…
Reference in a new issue