Kaydet (Commit) 91b96323 authored tarafından Muhammet Kara's avatar Muhammet Kara Kaydeden (comit) Andras Timar

Redaction: Handle multiple Writer pages

 * Creates one GDIMetaFile from each Writer page * Inserts them as Shapes into the newly created Draw doc
 * Has some 'magic' numbers needs to be figured out
 * Tried with a 100-page Writer doc, seems okay
 * Seems slow, might need to be optimized
   * Seems like getDocumentSizeInPixels() and getDocumentSizeIn100mm()
     are consuming most of the cycles. Will look into this at the end.

Change-Id: Ic6046af0c12e26185edf59862e55b17117495922
Reviewed-on: https://gerrit.libreoffice.org/65847
Tested-by: Jenkins
Reviewed-by: 's avatarMuhammet Kara <muhammet.kara@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/69769Reviewed-by: 's avatarAndras Timar <andras.timar@collabora.com>
Tested-by: 's avatarAndras Timar <andras.timar@collabora.com>
üst 5ceee417
...@@ -542,28 +542,36 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq) ...@@ -542,28 +542,36 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
if(!xCursor.is()) if(!xCursor.is())
return; return;
xCursor->jumpToLastPage();
sal_Int16 nPages = xCursor->getPage();
uno::Reference< lang::XComponent > xSourceDoc( xModel ); uno::Reference< lang::XComponent > xSourceDoc( xModel );
DocumentToGraphicRenderer aRenderer(xSourceDoc, /*bSelectionOnly=*/false); DocumentToGraphicRenderer aRenderer(xSourceDoc, /*bSelectionOnly=*/false);
// Only take the first page for now std::vector< GDIMetaFile > aMetaFiles;
sal_Int16 nPage = 1;
::Size aDocumentSizePixel = aRenderer.getDocumentSizeInPixels(nPage);
::Point aLogicPos;
::Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage, &aLogicPos);
// FIXME: This is a temporary hack. Need to figure out a proper way to derive this scale factor.
::Size aTargetSize(aDocumentSizePixel.Width() * 1.23, aDocumentSizePixel.Height() * 1.23);
Graphic aGraphic = aRenderer.renderToGraphic(nPage, aDocumentSizePixel, aTargetSize, COL_TRANSPARENT); for (sal_Int32 nPage = 1; nPage <= nPages; ++nPage)
auto& rGDIMetaFile = const_cast<GDIMetaFile&>(aGraphic.GetGDIMetaFile()); {
::Size aDocumentSizePixel = aRenderer.getDocumentSizeInPixels(nPage);
// Set preferred map unit and size on the metafile, so the Shape size ::Point aLogicPos;
// will be correct in MM. ::Size aLogic = aRenderer.getDocumentSizeIn100mm(nPage, &aLogicPos);
MapMode aMapMode; // FIXME: This is a temporary hack. Need to figure out a proper way to derive this scale factor.
aMapMode.SetMapUnit(MapUnit::Map100thMM); ::Size aTargetSize(aDocumentSizePixel.Width() * 1.23, aDocumentSizePixel.Height() * 1.23);
aMapMode.SetOrigin(::Point(-aLogicPos.getX(), -aLogicPos.getY()));
rGDIMetaFile.SetPrefMapMode(aMapMode); Graphic aGraphic = aRenderer.renderToGraphic(nPage, aDocumentSizePixel, aTargetSize, COL_TRANSPARENT);
rGDIMetaFile.SetPrefSize(aLogic); auto& rGDIMetaFile = const_cast<GDIMetaFile&>(aGraphic.GetGDIMetaFile());
// Set preferred map unit and size on the metafile, so the Shape size
// will be correct in MM.
MapMode aMapMode;
aMapMode.SetMapUnit(MapUnit::Map100thMM);
// FIXME: This is a temporary hack. Need to figure out a proper way to derive these magic numbers.
aMapMode.SetOrigin(::Point(-(aLogicPos.getX() - 512) * 1.53, -((aLogicPos.getY() - 501)* 1.53 + (nPage-1)*740 )));
rGDIMetaFile.SetPrefMapMode(aMapMode);
rGDIMetaFile.SetPrefSize(aLogic);
aMetaFiles.push_back(rGDIMetaFile);
}
// Create an empty Draw component. // Create an empty Draw component.
uno::Reference<frame::XDesktop2> xDesktop = css::frame::Desktop::create(comphelper::getProcessComponentContext()); uno::Reference<frame::XDesktop2> xDesktop = css::frame::Desktop::create(comphelper::getProcessComponentContext());
...@@ -573,21 +581,31 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq) ...@@ -573,21 +581,31 @@ void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
// Access the draw pages // Access the draw pages
uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xComponent, uno::UNO_QUERY); uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xComponent, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages(); uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( 0 ), uno::UNO_QUERY_THROW ); uno::Reference<css::lang::XMultiServiceFactory> xFactory(xComponent, uno::UNO_QUERY);
uno::Reference<graphic::XGraphic> xGraph = aGraphic.GetXGraphic(); for (sal_Int32 nPage = 0; nPage < nPages; ++nPage)
{
GDIMetaFile rGDIMetaFile = aMetaFiles[nPage];
Graphic aGraphic(rGDIMetaFile);
// Create and insert the shape uno::Reference<graphic::XGraphic> xGraph = aGraphic.GetXGraphic();
uno::Reference<css::lang::XMultiServiceFactory> xFactory(xComponent, uno::UNO_QUERY); uno::Reference< drawing::XDrawPage > xPage = xDrawPages->insertNewByIndex(nPage);
uno::Reference<drawing::XShape> xShape(
xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY); // Create and insert the shape
uno::Reference<beans::XPropertySet> xShapeProperySet(xShape, uno::UNO_QUERY); uno::Reference<drawing::XShape> xShape(
xShapeProperySet->setPropertyValue("Graphic", uno::Any( xGraph )); xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xShapeProperySet(xShape, uno::UNO_QUERY);
xShapeProperySet->setPropertyValue("Graphic", uno::Any( xGraph ));
// Set size and position // Set size and position
xShape->setSize(awt::Size(rGDIMetaFile.GetPrefSize().Width(),rGDIMetaFile.GetPrefSize().Height()) ); xShape->setSize(awt::Size(rGDIMetaFile.GetPrefSize().Width(),rGDIMetaFile.GetPrefSize().Height()) );
xPage->add(xShape); xPage->add(xShape);
}
// Remove the extra page at the beginning
uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( 0 ), uno::UNO_QUERY_THROW );
xDrawPages->remove( xPage );
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment