This Delphi sample code shows you how to extract text and images from one PDF and insert it into a new PDF at the same locations.
---------------------------- var FH: Integer; PR: Integer; SL: TStringList; Data: string; Font: string; Color: string; Size: string; X1, Y1, X2, Y2, X3, Y3, X4, Y4: string; Text: string; X: Integer; IL: Integer; TextBlockLeft: Double; TextBlockTop: Double; PageNum: Integer; ImageData: string; ImageLeft, ImageTop, ImageWidth, ImageHeight: Double;
...
// Open the file in direct access mode and store the file handle FH := QP.DAOpenFile('Xpod1228090001.pdf', '');
// Loop through all the pages for PageNum := 1 to QP.DAGetPageCount(FH) do begin // Start a new document QP.NewDocument;
// Specify that images should be compressed QP.CompressImages(1);
// Get a page reference to the current page PR := QP.DAFindPage(FH, PageNum);
// Create a string list to hold the text data SL := TStringList.Create; try
// Extract the text from the current page SL.Text := QP.DAExtractPageText(FH, PR, 4);
// Add each block of text to the new documen for X := 0 to SL.Count - 1 do begin Data := SL[X];
Font := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Font) + 1); Color := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Color) + 1); Size := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Size) + 1);
X1 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(X1) + 1); Y1 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Y1) + 1); X2 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(X2) + 1); Y2 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Y2) + 1); X3 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(X3) + 1); Y3 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Y3) + 1); X4 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(X4) + 1); Y4 := Copy(Data, 1, Pos(',', Data) - 1); Delete(Data, 1, Length(Y4) + 1);
Text := Copy(Data, 2, Length(Data) - 2);
// Replace the utf-8 encoded TM symbol with the // PDF WinAnsi character code if Pos(#226#132#162, Text) > 0 then Text := StringReplace(Text, #226#132#162, #153, [rfReplaceAll]);
// Set the text size QP.SetTextSize(StrToFloat(Size));
// Draw the text, shift up by the font's "descent" value QP.DrawText(StrToFloat(X1), StrToFloat(Y1) - QP.GetTextDescent, Text); end; finally SL.Free; end;
// Find all the images on the page IL := QP.DAGetPageImageList(FH, PR);
// Loop through all the images for X := 1 to QP.DAGetImageListCount(FH, IL) do begin
// Read the image data ImageData := QP.DAGetImageDataToString(FH, IL, X);
// Add the image data to the new document QP.AddImageFromString(ImageData, 0);
// Determine the location and size of the image on the page ImageLeft := QP.DAGetImageDblProperty(FH, IL, X, 501); ImageTop := QP.DAGetImageDblProperty(FH, IL, X, 502); ImageWidth := QP.DAGetImageDblProperty(FH, IL, X, 503) - QP.DAGetImageDblProperty(FH, IL, X, 501); ImageHeight := QP.DAGetImageDblProperty(FH, IL, X, 502) - QP.DAGetImageDblProperty(FH, IL, X, 508);
// Draw the image onto the new document's page QP.DrawImage(ImageLeft, ImageTop, ImageWidth, ImageHeight);
end; // End image loop
// Compress the page description commands QP.CompressContent;
// Save the file QP.SaveToFile('XPod-' + IntToStr(PageNum) + '.pdf');
// Remove the document QP.RemoveDocument(QP.SelectedDocument);
end; // End page loop
|