| 
        
          | 
              
                | Author |  Topic  |  |  
                | Ken
 
 
                USA2 Posts
 | 
                    
                      |  Posted - Aug 09 2011 :  11:22:14     
 |  
                      | SaveToPDF, File Size 
 ImageEn 3.1.2, D XE
 
 I have TIFFs that I convert to PDFs. The resulting PDFs are normally about 30KB to 60 KB. However, sometimes I need to add text to the image before converting it to a PDF. Those PDFs are enormous - about 20 MB to 60 MB. I need to be able to produce smaller PDFs when I have to add text. Here's my relevant code:
 
 
 if StampText <> '' then
 StampImageWithSpecialText(MyImage, StampText);
 
 MyImage.IO.Params.PDF_Compression:= ioPDF_G4FAX; // G4Fax compression
 MyImage.IO.SaveToPDF;
 
 procedure StampImageWithSpecialText(MyImage : TImageENVect; StampText : string);
 procedure IETextOut(Canvas: TCanvas; x,y:integer; angle:integer; const Text: String);
 var
 LogFont : TLogFont;
 begin
 with Canvas do
 begin
 GetObject(Font.Handle, SizeOf(TLogFont), @LogFont);
 LogFont.lfEscapement := angle*10;
 LogFont.lfQuality:=3;
 Font.Handle := CreateFontIndirect(LogFont);
 TextOut(x, y, Text);
 end;
 end;
 begin
 MyImage.LayersAdd; // add a new layer
 MyImage.Proc.Fill(CreateRGB(255,255,255));
 MyImage.Bitmap.Canvas.Font.Name := 'Arial';
 MyImage.Bitmap.Canvas.Font.Size := 24;
 MyImage.Bitmap.Canvas.Font.Size := trunc(24 * (MyImage.Bitmap.width/2544));
 MyImage.Bitmap.Canvas.Font.Color := clBlack;
 IETextOut(MyImage.Bitmap.Canvas, trunc(300 * (MyImage.Bitmap.width/2544)), 0, 0, StampText); // draw text on second layer
 MyImage.Proc.Rotate(180);
 IETextOut(MyImage.Bitmap.Canvas, trunc(300 * (MyImage.Bitmap.width/2544)), 0, 0, StampText);
 MyImage.Proc.SetTransparentColors(CreateRGB(255, 255, 255), CreateRGB(255,255, 255), 0); // remove the white, making it as transparent
 MyImage.LayersMergeAll;
 end;
 
 
 --------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
 
 
 I figured out a workaround. I just save to a TIF and load from the TIF, right before SaveToPDF.
 
 if (StampText <> '') then
 begin
 StampImageWithSpecialText(MyImage, StampText);
 MyImage.IO.SaveToFile(FileName + '.tif');
 MyImage.IO.LoadFromFile(FileName + '.tif');
 end;
 
 MyImage.IO.Params.PDF_Compression:= ioPDF_G4FAX; // G4Fax compression
 MyImage.IO.SaveToPDF;
 
 Still, there has to be a better solution. Or, SaveToPDF has a bug, or needs more documentation.
 
 --------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
 After further testing, I have determined that adding SaveToFile and LoadFromFile just slows the processing down too much when the pdf has too many pages. So I'd still appreciate some other ideas.
 
 Thanks,
 George
 
 
 
 
 
 
 |  |  
                | fab
     
 
                1310 Posts | 
                    
                      |  Posted - Aug 09 2011 :  14:06:20     
 |  
                      | The method LayersMergeAll converts implicitly the image to RGB (24 bit), so the compression method ioPDF_G4FAX is no more applicable. You should re-convert back the image to black/white executing:
 
 ...
 MyImage.LayersMergeAll;
 MyImage.Proc.ConvertToBWThreshold();   // other ways available
 ...
 |  
                      |  |  |  
                | George
 
 
                USA1 Posts
 | 
                    
                      |  Posted - Aug 11 2011 :  10:54:47     
 |  
                      | I am taking over from Ken here. 
 I added MyImage.Proc.ConvertToBWThreshold() after LayersMergeAll, and I removed the SaveToFile/LoadFromFile.
 
 It works, but it isn't any faster. I can generate a 38 page pdf without calling StampImageWithSpecialText in about 5 seconds. It still takes about 22 seconds to generate the same 38 page pdf with calling StampImageWithSpecialText.
 
 Is there anything else I can do?
 
 Thanks,
 George
 |  
                      |  |  |  
                | fab
     
 
                1310 Posts | 
                    
                      |  Posted - Aug 11 2011 :  14:50:51     
 |  
                      | >Is there anything else I can do? 
 You could write directly over the main bitmap, instead of using layers.
 
 |  
                      |  |  |  
                |  |  Topic  |  |  |  |