Hi!
Ich versuch jetzt schon seit geraumer Zeit PDF (via wpviewpdf) in ein WPRichText Dokument einzufügen.
Dabei habe ich ein fix fertiges Dokument, das ein Tag besitz (ala --PDF|PDFFilename.pdf---) und an diese
Stelle sollte es eingefügt werden mit. Ich dachte ich könnte das einfach mit Sections hinbekommen aber so ganz
funktioniert es nicht (also Section einfügen, pdf Bilder einfügen, "alte" Section wieder restaurieren, damit das Dokument
einfach weiter geht)
Zunächst habe ich versucht ein lokales Wprichtext objekt zu generieren, die Bilder des pdf's als PNG zu exportieren
und ins richtext objekt per Imagetextobjekt wieder einzufügen. Hat nicht so gut geklappt :( (keine Bilder wurden übernommen)
Zur Zeit habe ich folgenden Ansatz (davor wurde per Finder Objekt der Tag gefunden und gelöscht)
origSectionID := fRichText.ActiveParagraph.SectionID;
if fRichText.IsEmpty
then
fRichText.CheckHasBody
else
fRichText.InputString(#12);
fRichText.FormatOptions := [wpDisableSpeedReformat];
props := fRichText.HeaderFooter.AddSectionProps;
props.Assign(fRichText.Header);
dataBlock := fRichText.HeaderFooter.Append( wpHeader, wpraOnAllPages );
dataBlock.Clear(True); // clear header
dataBlock := fRichText.HeaderFooter.Append( wpFooter, wpraOnAllPages );
dataBlock.Clear(True);
props.Select := [wpsec_PageSize, wpsec_Margins, wpsec_SelectHeaderFooter];
fRichText.ActiveParagraph.SectionID := props.SectionID;
include(fRichText.ActiveParagraph.prop, paprNewSection);
// same page size but without margins
props.SetPageWH(fRichText.Header.PageWidth, fRichText.Header.PageHeight);
fRichtext.ActiveParagraph.ASet(WPAT_CharFontSize, 100); // font size = 1
fRichText.ReformatAll;
defParheight := fRichtext.ActiveParagraph.HeightTotal;
// ##########################################
// #### Load pdf - convert to png images and insert them in the report
with WPViewPDF do
try
LoadFromFile( pdfFileName );
for i := 0 to PageCount - 1 do
begin
// width and height properties seems to be in 72dpi
origWidthTW := MulDiv( PageWidth[i], 1440, 72 );
origHeightTW := MulDiv( PageHeight[i], 1440, 72 );
pngFileName := FindUnusedFileName( GetTempDir + idealPng );
try
// 0 resolution is then default
WritePNG(pngFileName ,i , 0, wp24FullColor );
// ################################################
// #### Insert graphic
img := TPngImage.Create;
img.LoadFromFile(pngFileName);
if (img.Width > 0) and (img.Height > 0)
then
ratio := img.Width/img.Height
else
begin
img.Free;
continue;
end;
memGra := TMemImage.Create;
memGra.InitGraphic(img);
img.Free;
origWidthTW := Min(origWidthTW, fRichText.ActivePar.TextAreaWidth);
with props do
origHeightTW := Min(origHeightTW, PageHeight - TopMargin - BottomMargin - 2*defParheight);
// use the original width/height or stretch the image to the maximum on the page
wpimg := TWPOImage.CreateImage(fRichText.Memo.RTFData, memGra);
wpimg.WidthTW := origWidthTW;
wpimg.HeightTW := origHeightTW;
// adjust width height for proportional scaling
if Round(wpimg.WidthTW) > Round(wpimg.HeightTW*ratio)
then
wpImg.WidthTW := Round(wpimg.HeightTW*ratio)
else if Round( wpImg.HeightTW ) > Round(wpimg.WidthTW/ratio)
then
wpImg.HeightTW := Round(wpimg.WidthTW/ratio);
fRichText.TextObjects.Insert(wpimg);
memGra.Free;
finally
DeleteFile(pngFileName);
end;
end;
fRichText.ReformatAll;
fRichText.Finder.Next('--PDFEND---');
aPos := fRichText.Finder.Position;
fRichText.SetSelPosLen(aPos, Length('--PDFEND---'));
fRichText.SelText := '';
par := fRichText.ActiveParagraph;
// restore old format
props := fRichText.HeaderFooter.AddSectionProps;
props.Select := [wpsec_PageSize, wpsec_Margins];
props.Assign(fRichText.Header);
// todo: this should reference to header footer 1
dataBlock := fRichText.HeaderFooter.Append( wpHeader, wpraOnAllPages );
dataBlock.UsedForSectionID := origSectionID; // props.SectionID;
dataBlock.RtfText.Assign(fRichText.HeaderFooter[0].RtfText);
dataBlock := fRichText.HeaderFooter.Append( wpFooter, wpraOnAllPages );
dataBlock.UsedForSectionID := origSectionID; //props.SectionID;
dataBlock.RtfText.Assign(fRichText.HeaderFooter[1].RtfText);
par.SectionID := props.SectionID;
include(fRichText.ActiveParagraph.prop, paprNewSection);
fRichText.ReformatAll(True);
finally
Free;
end;
Alles anzeigen
Ich benutze wptools 6.
Der Code funktioniert etwas (hat aber noch Macken :( ) . Problematisch ist aber eher, dass viele leere Seiten dadurch erzeugt werden und auch manchmal der Header nicht übernommen wird.
Irgendwo hab ich also noch einen Denkfehler :( . Löschen der leeren Seiten funktioniert auch nicht besonders, da ich glaube, dass die Sektionen manchmal wieder gelöscht
werden.