Community
DWF
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Write W2D problem with multi-page DWF

0 REPLIES 0
Reply
Message 1 of 1
reterVision
728 Views, 0 Replies

Write W2D problem with multi-page DWF

Hi,

 

I've met a problem when I trying to write w2d into multi-page DWF files. 

 

Every time when I called DWFToolkit::DWF6PackageWriter::write(), the program just paused and never wake up again. But everything goeswell when I run the same program with one-page DWF.

 

Any suggestiones were appreciated, thank you!

 

Here is my code:

 

DWFToolkit::DWFManifest::SectionIterator* piSections = rManifestIn.getSections();
if (piSections)
{
DWFToolkit::DWFSection* pSection = NULL;
for (; piSections->valid(); piSections->next())
{
pSection = piSections->get();
pSection->readDescriptor();

if (pSection->type() == _DWF_FORMAT_EPLOT_TYPE_WIDE_STRING) // 2D Model handler.
{
// Add WT_Text.
for (DWFToolkit::DWFResourceContainer::ResourceIterator* pResources =
pSection->findResourcesByRole(DWFXML::kzRole_Graphics2d);
pResources && pResources->valid();
pResources->next())
{
if(pResources && pResources->valid())
{
DWFToolkit::DWFGraphicResource* w2dGraphics = (DWFToolkit::DWFGraphicResource*) pResources->get();
WT_Result res = WT_Result::Success;

// assumes above call to valid will return false if get()
// would return null
g_pDWFInputStream = pResources->get()->getInputStream();

WT_File inputStream;
inputStream.set_stream_open_action (&DWFInputStreamOpen);
inputStream.set_stream_close_action(&DWFInputStreamClose);
inputStream.set_stream_read_action (&DWFInputStreamRead);
inputStream.set_stream_seek_action (&DWFInputStreamSeek);
inputStream.set_stream_end_seek_action (&DWFInputStreamEndSeek);

// Open file to insert new object.
inputStream.set_file_mode(WT_File::File_Read);
inputStream.open();

// Create temporary w2d file.
WT_File pOutput;
pOutput.set_filename("temp.w2d");
pOutput.set_file_mode (WT_File::File_Write);
pOutput.open();
pOutput.heuristics().set_allow_binary_data(inputStream.heuristics().allow_binary_data());
pOutput.heuristics().set_allow_data_compression(inputStream.heuristics().allow_data_compression());
pOutput.heuristics().set_target_version(inputStream.heuristics().target_version());

double viewHeight=0.0f, viewWidth=0.0f;

while(res == WT_Result::Success)
{
res = inputStream.process_next_object();
if(res == WT_Result::Success)
{
const WT_Object* pObj = inputStream.current_object();
if(pObj)
{
switch (pObj->object_id())
{
case WT_Object::DWF_Header_ID:
case WT_Object::End_Of_DWF_ID:
// do nothing
break;

case WT_Object::View_ID:
{
WT_View *viewObj = (WT_View *) pObj;
WT_Logical_Box viewBox = viewObj->view();

viewHeight = viewBox.maxpt().m_y - viewBox.minpt().m_y;
viewWidth = viewBox.maxpt().m_x - viewBox.minpt().m_x;
}

default:
pObj->serialize(pOutput);
break;
}
}
}
}

// Close file stream.
inputStream.close();

// Open temporary file for writing new WT_Text.
WT_W2D_Class_Factory cf;
int x=viewWidth-viewWidth/10, y=viewHeight*2/3;

//Create text with overscoring, underscoring, and a bounding box
char contentASCii[255];
wcstombs(contentASCii, comment, wcslen(comment)+1);

// Set font property.
pOutput.desired_rendition().color().set(pOutput.desired_rendition().color_map().map(0));
pOutput.desired_rendition().font().font_name().set("Times New Roman");
pOutput.desired_rendition().font().height() = (WT_Integer32)(2.0 * 70);
pOutput.desired_rendition().font().width_scale() = 822;

// Font rotation.
const double degree = (int)(65636/360);
pOutput.desired_rendition().font().rotation().set((int)(degree * 45.0f));

WT_Text watermarkText = WT_Text(WT_Logical_Point(x+700, y-200), contentASCii);
//Serialize it.
WD_CHECK(watermarkText.serialize(pOutput));

// Add temporary w2d to resources.
pOutput.close();

//
// define the resource - this must be allocated on the heap
//
DWFToolkit::DWFGraphicResource* p2Dgfx =
DWFCORE_ALLOC_OBJECT(DWFToolkit::DWFGraphicResource(
w2dGraphics->title(), // title
DWFXML::kzRole_Graphics2d, // role
DWFMIME::kzMIMEType_W2D, // MIME type
w2dGraphics->author(), // author
w2dGraphics->description(), // description
w2dGraphics->creationTime(), // creation time
w2dGraphics->modificationTime())); // modification time
if (p2Dgfx == NULL)
{
_DWFCORE_THROW( DWFMemoryException, L"Failed to allocate resource" );
}

p2Dgfx->configureGraphic(
w2dGraphics->transform(),//(const double*)anTransform,
w2dGraphics->extents(),
w2dGraphics->clip()
);
//pSection->removeResource(*w2dGraphics, true);

DWFFile oW2DFilename(L"temp.w2d");
DWFStreamFileDescriptor* pW2DFile = DWFCORE_ALLOC_OBJECT(DWFStreamFileDescriptor(oW2DFilename, L"rb"));
DWFFileInputStream* pW2DFilestream = DWFCORE_ALLOC_OBJECT(DWFFileInputStream);

pW2DFile->open();
pW2DFilestream->attach(pW2DFile, true);
p2Dgfx->setInputStream(pW2DFilestream);
pSection->addResource(p2Dgfx, true);

// Add image to page
DWFToolkit::DWFImageResource* pImage =
DWFCORE_ALLOC_OBJECT(DWFToolkit::DWFImageResource(L"Watermark",
DWFXML::kzRole_RasterOverlay,
DWFMIME::kzMIMEType_JPG));
if (pImage == NULL)
{
_DWFCORE_THROW( DWFMemoryException, L"Failed to allocate resource" );
}

double anTransform2[4][4] = {
0.02, 0, 0, 0,
0, 0.02, 0, 0,
0, 0, 0.02, 0,
750, 400, 0, 1
};
double anExtents2[4] = {0, 0, 0, 0};
pImage->configureGraphic((const double*)anTransform2,
(const double*)anExtents2, NULL, true, 0, 0);

DWFFile oImageFilename(image_filename);
DWFStreamFileDescriptor* pImageFile = DWFCORE_ALLOC_OBJECT(DWFStreamFileDescriptor(oImageFilename, L"rb"));
DWFFileInputStream* pImageFilestream = DWFCORE_ALLOC_OBJECT(DWFFileInputStream);
pImageFile->open();
pImageFilestream->attach(pImageFile, true);
pImage->setInputStream(pImageFilestream);

// Add image resource into file.
pSection->addResource(pImage, true, true, true, NULL);
pResources->next();
}
}
}
oWriter.addSection(pSection);
}

DWFCORE_FREE_OBJECT(piSections);
}

oWriter.write();

0 REPLIES 0

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

”Boost

 

”Tips

 

”Services