<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="RSS_xslt_style.asp" version="1.0" ?>
<rss version="2.0" xmlns:WebWizForums="http://syndication.webwiz.co.uk/rss_namespace/">
 <channel>
  <title>Debenu Quick PDF Library - PDF SDK Community Forum : Delphi DDE to Acrobat</title>
  <link>http://www.quickpdf.org/forum/</link>
  <description><![CDATA[This is an XML content feed of; Debenu Quick PDF Library - PDF SDK Community Forum : Sample Code : Delphi DDE to Acrobat]]></description>
  <copyright>Copyright (c) 2006-2013 Web Wiz Forums - All Rights Reserved.</copyright>
  <pubDate>Fri, 08 May 2026 06:06:36 +0000</pubDate>
  <lastBuildDate>Wed, 20 Dec 2006 18:02:49 +0000</lastBuildDate>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Web Wiz Forums 11.01</generator>
  <ttl>360</ttl>
  <WebWizForums:feedURL>www.quickpdf.org/forum/RSS_post_feed.asp?TID=585</WebWizForums:feedURL>
  <image>
   <title><![CDATA[Debenu Quick PDF Library - PDF SDK Community Forum]]></title>
   <url>http://www.quickpdf.org/forum/forum_images/QPDF_Forum_Title.png</url>
   <link>http://www.quickpdf.org/forum/</link>
  </image>
  <item>
   <title><![CDATA[Delphi DDE to Acrobat : The Unit below is an attempt to...]]></title>
   <link>http://www.quickpdf.org/forum/delphi-dde-to-acrobat_topic585_post2636.html#2636</link>
   <description>
    <![CDATA[<strong>Author:</strong> <a href="http://www.quickpdf.org/forum/member_profile.asp?PF=118">hbarclay</a><br /><strong>Subject:</strong> 585<br /><strong>Posted:</strong> 20 Dec 06 at 6:02PM<br /><br />The Unit below is an attempt to convert the pdfp command line program for use in Delphi. It seems to work, but I am not real fluent in C so I'm sure there will be some issues to be found with it.<br><br>I would welcome any suggestions on improving it.<br><br>There is only one function to call, (Printpdf). Pass in the filename, printer name and the three other parameters as described in the pdfp program<br><br>&nbsp;&nbsp;&nbsp; -o orientation : set orientation<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1=portrait, 2=landscape<br><br>&nbsp;&nbsp;&nbsp; -d duplex : set duplex mode (if supported by printer)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1=none, 2=long side, 3=short side<br><br>&nbsp;&nbsp;&nbsp; -c copies : set number of copies to print<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; copies=1 to 99<br><br>I put in the code to look for Adobe 8 so it should work with it, but I have not tested at all with version 8, nor did I put in the additional commands that are in pdfp8.<br><br><br>----------------------------------------------------------------------------------------<br><br>unit pdfdde;<br><br>// Delphi conversion of pdfp command line program from<br>// http://www.esnips.com/web/PDFTools<br><br>interface<br><br>// FileName must contain complete path<br>function PrintPdf(Filename,PrinterName : string;Orientation,duplex,copies : integer): boolean;<br><br>implementation<br>uses windows,ShellAPI,sysutils,messages,ddeman,winspool,printers;<br><br>var<br>&nbsp; hWndAdobe : HWND;<br><br>function SetPrinterProperties(pPrinterName : pChar;pDevModeNew : PDEVMODE) : boolean;<br>var<br>&nbsp;&nbsp;&nbsp; hPrinter : THandle;<br>&nbsp;&nbsp;&nbsp; dwNeeded : DWORD;<br>&nbsp;&nbsp;&nbsp; pi2 : PPrinterInfo2;<br>&nbsp;&nbsp;&nbsp; pDevModeVar : PDEVMODE;<br>&nbsp;&nbsp;&nbsp; pDevModeVar2 : PDEVMODE;<br>&nbsp;&nbsp;&nbsp; pd : PRINTER_DEFAULTS;<br>&nbsp;&nbsp;&nbsp; bFlag : boolean;<br>&nbsp;&nbsp;&nbsp; lFlag : integer;<br>begin<br>&nbsp;&nbsp;&nbsp; // Open printer handle<br>&nbsp;&nbsp;&nbsp; ZeroMemory(@pd, sizeof(pd));<br>&nbsp;&nbsp;&nbsp; pd.DesiredAccess := PRINTER_ACCESS_USE; //PRINTER_ALL_ACCESS;<br>&nbsp;&nbsp;&nbsp; bFlag := OpenPrinter(pPrinterName, hPrinter, @pd);<br>&nbsp;&nbsp;&nbsp; if (bFlag = false) or (hPrinter = 0) then<br>&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp; exit;<br>&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; // The first GetPrinter tells you how big the buffer should be in<br>&nbsp;&nbsp;&nbsp; // order to hold all of PRINTER_INFO_2. Note that this should fail with<br>&nbsp;&nbsp;&nbsp; // ERROR_INSUFFICIENT_BUFFER.&nbsp; If GetPrinter fails for any other reason<br>&nbsp;&nbsp;&nbsp; // or dwNeeded isn't set for some reason, then there is a problem...<br>&nbsp;&nbsp;&nbsp; SetLastError(0);<br>&nbsp;&nbsp;&nbsp; bFlag := GetPrinter(hPrinter, 2, nil, 0, @dwNeeded);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((bFlag) or (GetLastError() &lt;&gt; ERROR_INSUFFICIENT_BUFFER) or (dwNeeded = 0)) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; // Allocate enough space for PRINTER_INFO_2...<br>&nbsp; GetMem(pi2, dwNeeded);<br>&nbsp;&nbsp;&nbsp; if (pi2 = nil) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp; exit;<br>&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; // The second GetPrinter fills in all the current settings, so all you<br>&nbsp;&nbsp;&nbsp; // need to do is modify what you're interested in...<br>&nbsp;&nbsp;&nbsp; bFlag := GetPrinter(hPrinter, 2, pi2, dwNeeded, @dwNeeded);<br>&nbsp;&nbsp;&nbsp; if (bFlag = false) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; freemem(pi2);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp; exit;<br>&nbsp; end;<br><br><br>&nbsp;&nbsp;&nbsp; // If GetPrinter didn't fill in the DEVMODE, try to get it by calling<br>&nbsp;&nbsp;&nbsp; // DocumentProperties...<br>&nbsp;&nbsp;&nbsp; if (pi2.pDevMode = nil) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; dwNeeded := DocumentProperties(0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPrinter,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Handle to our printer. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pPrinterName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Name of the printer. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevModevar^,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Asking for size, so */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevModeVar2^,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* these are not used. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Zero returns buffer size. */<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (dwNeeded &lt;= 0) then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FreeMem(pi2);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; GetMem(pDevModeVar,dwneeded);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lFlag := DocumentProperties(0, hPrinter,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pPrinterName,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pDevModeVar^, pDevModeVar2^,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DM_OUT_BUFFER);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (lFlag &lt;&gt; IDOK) or (pDevModeVar = nil) then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FreeMem(pDevModeVar);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FreeMem(pi2);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode := pDevModeVar;<br>&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; if (pDevModeNew.dmFields and DM_COPIES) &lt;&gt; 0 then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(pi2.pDevMode.dmCopies &lt;&gt; pDevModeNew.dmCopies) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Specify exactly what we are attempting to change...<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmFields := pi2.pDevMode.dmFields or DM_COPIES;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmCopies := pDevModeNew.dmCopies;<br>&nbsp;&nbsp;&nbsp; end;<br><br><br>&nbsp;&nbsp;&nbsp; if (pDevModeNew.dmFields and DM_ORIENTATION &lt;&gt; 0) then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(pi2.pDevMode.dmOrientation &lt;&gt; pDevModeNew.dmOrientation) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Specify exactly what we are attempting to change...<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmFields := pi2.pDevMode.dmFields or DM_ORIENTATION;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmOrientation := pDevModeNew.dmOrientation;<br>&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; if (pDevModeNew.dmFields and DM_DUPLEX) &lt;&gt; 0 then<br>&nbsp;&nbsp;&nbsp; if(pi2.pDevMode.dmDuplex &lt;&gt; pDevModeNew.dmDuplex) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Specify exactly what we are attempting to change...<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmFields := pi2.pDevMode.dmFields or DM_DUPLEX;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmDuplex := pDevModeNew.dmDuplex;<br>&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; if (pDevModeNew.dmFields and DM_SCALE) &lt;&gt; 0 then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(pi2.pDevMode.dmScale &lt;&gt; pDevModeNew.dmScale) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Specify exactly what we are attempting to change...<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmFields := pi2.pDevMode.dmFields or DM_SCALE;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //pi2.pDevMode.dmNup = DMNUP_SYSTEM;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pi2.pDevMode.dmDisplayFlags := 1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pi2.pDevMode.dmScale := pDevModeNew.dmScale;<br>&nbsp;&nbsp;&nbsp; end;<br><br><br>&nbsp;&nbsp;&nbsp; // Do not attempt to set security descriptor...<br>&nbsp;&nbsp;&nbsp; pi2.pSecurityDescriptor := Nil;<br><br>&nbsp;&nbsp;&nbsp; // Make sure the driver-dependent part of devmode is updated...<br>&nbsp;&nbsp;&nbsp; lFlag := DocumentProperties(0, hPrinter,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; pPrinterName,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; pi2.pDevMode^, pi2.pDevMode^,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; DM_IN_BUFFER or DM_OUT_BUFFER);<br><br>&nbsp;&nbsp;&nbsp; if (lFlag &lt;&gt; IDOK) then<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FreeMem(pi2);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result := FALSE;<br>&nbsp;&nbsp;&nbsp; exit;<br>&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; // Update printer information...<br>&nbsp;&nbsp;&nbsp; bFlag := WinSpool.SetPrinter(hPrinter, 2, pi2, 0);<br><br>&nbsp;&nbsp;&nbsp; // Note that this is triggered on network printers, although the values<br>&nbsp;&nbsp;&nbsp; // get set, so we will ignore this for now<br>//*&nbsp;&nbsp;&nbsp; if (!bFlag)<br>//&nbsp;&nbsp;&nbsp; // The driver doesn't support, or it is unable to make the change...<br>//&nbsp;&nbsp;&nbsp; {<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GlobalFree(pi2);<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (pDevMode)<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GlobalFree(pDevMode);<br>//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return FALSE;<br>//&nbsp;&nbsp;&nbsp; }<br>//*/<br>&nbsp;&nbsp;&nbsp; // Tell other apps that there was a change...<br>&nbsp;&nbsp;&nbsp; SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; LPARAM(PChar(pPrinterName)),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; SMTO_NORMAL, 1000, PDWORD(nil)^);<br><br>&nbsp;&nbsp;&nbsp; // Clean up...<br>&nbsp;&nbsp;&nbsp; if (pi2 &lt;&gt; nil) then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; freemem(pi2);<br>&nbsp;&nbsp;&nbsp; if (hPrinter &lt;&gt; 0) then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br><br>&nbsp;&nbsp;&nbsp; result := TRUE;<br>end;<br><br>function GetPrinterDevMode(pDevice : PChar) :&nbsp; PDEVMODE;<br><br>var<br>&nbsp;&nbsp; hPrinter : THandle;<br>&nbsp;&nbsp; pDevModeVar : PDEVMODE;<br>&nbsp;&nbsp; pDevModeVar2 : PDEVMODE;<br>&nbsp;&nbsp; dwNeeded : DWORD;<br>&nbsp;&nbsp; dwRet : DWORD;<br>begin<br>&nbsp;&nbsp; //* Start by opening the printer */<br>&nbsp;&nbsp; if not OpenPrinter(pDevice, hPrinter, nil) then<br>&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result := nil;<br>&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp; // *<br>&nbsp;&nbsp; // * Step 1:<br>&nbsp;&nbsp; // * Allocate a buffer of the correct size.<br>&nbsp;&nbsp; // *<br>&nbsp;&nbsp; dwNeeded := DocumentProperties(0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPrinter,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Handle to our printer. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevice,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Name of the printer. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevModevar^,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Asking for size, so */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevModeVar^,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* these are not used. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Zero returns buffer size. */<br><br>&nbsp;&nbsp; GetMem(pDevModeVar, dwNeeded);<br><br>&nbsp;&nbsp; // *<br>&nbsp;&nbsp; // * Step 2:<br>&nbsp;&nbsp; // * Get the default DevMode for the printer<br>&nbsp;&nbsp; // *<br>&nbsp;&nbsp; dwRet := DocumentProperties(0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPrinter,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevice,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevModeVar^,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* The address of the buffer to fill. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevModeVar2^,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* Not using the input buffer. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM_OUT_BUFFER); //* Have the output buffer filled. */<br>&nbsp;&nbsp; if (dwRet &lt;&gt; IDOK) then<br>&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //* If failure, cleanup and return failure. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freemem(pDevModeVar);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result := nil;<br>&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp; //* Finished with the printer */<br>&nbsp;&nbsp; ClosePrinter(hPrinter);<br><br>&nbsp;&nbsp; //* Return the DevMode structure. */<br>&nbsp;&nbsp; result := pDevModeVar;<br>end;<br><br>function GetExeName(FileName,FilePath : string; var PdfExeName,Msg : string; var RetCode : integer): Boolean;<br>var<br>&nbsp; FileNameArray : array &#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; DefaultPathArray : array &#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; ResultArray : array &#091;0..MAX_PATH -1&#093; of char;<br><br>begin<br>&nbsp; strpcopy(FileNameArray,FileName);<br>&nbsp; strpcopy(DefaultPathArray,FilePath);<br>&nbsp; RetCode := FindExecutable(FileNameArray,DefaultPathArray,ResultArray);<br>&nbsp; PdfExeName := ResultArray;<br><br>Result := false;<br>&nbsp; case RetCode of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_NOASSOC : msg := 'File Association Not Found';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_FNF : msg := 'File Not Found';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_PNF : msg :=&nbsp; 'path not found ';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_ACCESSDENIED : msg := 'access denied';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_OOM : msg := 'out of memory ';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_DLLNOTFOUND : msg := 'dll not found';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_SHARE : msg := 'sharing error';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_ASSOCINCOMPLETE : msg := 'association incomplete';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_DDETIMEOUT : msg := 'DDE Timeout';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_DDEFAIL : msg := 'DDE Failure';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SE_ERR_DDEBUSY : msg := 'DDE Busy';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //I guess it worked<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg := 'Retcode ' + inttostr(RetCode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp; end;<br>end;<br><br>procedure HideAdobe;<br>begin<br>&nbsp;&nbsp;&nbsp; ShowWindow (hWndAdobe, SW_RESTORE);<br>&nbsp;&nbsp;&nbsp; MoveWindow (hWndAdobe, -100, -100, 0, 0, TRUE);<br>&nbsp;&nbsp;&nbsp; ShowWindow (hWndAdobe, SW_RESTORE);<br>&nbsp; ShowWindow (hWndAdobe, SW_HIDE);<br>end;<br><br>function IsAdobeRunning : boolean;<br>begin<br><br>&nbsp; hWndAdobe := FindWindow('AdobeAcrobat', nil);<br><br>&nbsp; if hWndAdobe &gt; 0 then<br>&nbsp;&nbsp;&nbsp; Result := true<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hWndAdobe := FindWindow('AcrobatSDIWindow', nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if hWndAdobe &gt; 0 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>end;<br><br>function PrintPdf(Filename,PrinterName : string;Orientation,duplex,copies : integer): boolean;<br>var<br>&nbsp; PrinterDevice : array&#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; PrinterDriver : array&#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; PrinterPort : array&#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; CommandBuff : array&#091;0..2047&#093; of char;<br>&nbsp; FilePathName : array&#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; FileNameArray : array &#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; DefaultPathArray : array &#091;0..MAX_PATH -1&#093; of char;<br>&nbsp; CommandStr : string;<br>&nbsp; hPrinter: THandle;<br>&nbsp; DeviceMode: THandle;<br>&nbsp; dwNeeded : DWORD;<br>&nbsp; ppi2 : PPrinterInfo2;<br>&nbsp; Foundit : boolean;<br>&nbsp; RetCode : integer;<br>&nbsp; msg : string;<br>&nbsp; FileNameStr : string;<br>&nbsp; FilePathStr : string;<br>&nbsp; DdeConv : TDdeClientConv;<br>&nbsp; WasRunning : boolean;<br>&nbsp; pDevMode1 : PDeviceMode;<br>&nbsp; pDevMode2 : PDeviceMode;<br><br>begin<br><br>if (copies &lt; 1) or (copies &gt; 10) then copies := 1;<br><br>result := false;<br>FileNameStr := extractfilename(Filename);<br>FilePathStr := extractfilepath(Filename);<br>strpcopy(FileNameArray,FileNameStr);<br>strpcopy(DefaultPathArray,FilePathStr);<br>strpcopy(FilePathName,Filename);<br><br>Foundit := GetExeName(Filename,FilePathStr,FileNameStr,msg,RetCode);<br>if not Foundit then<br>begin<br>&nbsp;//log errors here<br>&nbsp;exit; //bail out - result = false<br>end;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Make sure printer name is valid<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strPcopy(PrinterDevice,PrinterName);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if not OpenPrinter(PrinterDevice, hPrinter, nil) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // If not valid, log the problem &amp; get default printer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printer.GetPrinter(PrinterDevice,PrinterDriver,PrinterPort,DeviceMode);<br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //log errors here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not OpenPrinter(PrinterDevice, hPrinter, nil) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //log errors here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; //bail out - result = false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Find out how much space is needed for printer info<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GetPrinter(hPrinter, 2, nil, 0, @dwNeeded);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (dwNeeded = 0) then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //log errors here<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit; //bail out - result = false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //// Allocate enough space for PRINTER_INFO_2...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMem(ppi2, dwNeeded);<br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // The second GetPrinter() will fill in all the current information<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if GetPrinter(hPrinter, 2, ppi2, dwNeeded, @dwNeeded)then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcopy(PrinterPort,ppi2.pPortName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcopy(PrinterDriver,ppi2.pDriverName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freemem(ppi2);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ClosePrinter(hPrinter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp; // Get default printer settings<br>&nbsp;&nbsp;&nbsp;&nbsp; pDevMode1 := GetPrinterDevMode(PrinterDevice);<br>&nbsp; pDevMode2 := GetPrinterDevMode(PrinterDevice);<br><br>&nbsp;&nbsp; pDevMode2.dmDuplex := duplex;<br>&nbsp;&nbsp; pDevMode2.dmFields := pDevMode2.dmFields or DM_DUPLEX;<br>&nbsp;&nbsp; pDevMode1.dmFields := pDevMode1.dmFields or DM_DUPLEX;<br><br>&nbsp;&nbsp; if orientation = 2 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevMode2.dmOrientation := DMORIENT_LANDSCAPE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDevMode2.dmOrientation := DMORIENT_PORTRAIT;<br>&nbsp;&nbsp; pDevMode2.dmFields := pDevMode2.dmFields or DM_ORIENTATION;<br>&nbsp;&nbsp; pDevMode1.dmFields := pDevMode1.dmFields or DM_ORIENTATION;<br><br>&nbsp;&nbsp; pDevMode2.dmCopies := copies;<br>&nbsp;&nbsp; pDevMode2.dmFields := pDevMode2.dmFields or DM_COPIES;<br>&nbsp;&nbsp; pDevMode1.dmFields := pDevMode1.dmFields or DM_COPIES;<br><br>&nbsp; SetPrinterProperties(PrinterDevice,pDevMode2);<br><br>WasRunning := true;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if not IsAdobeRunning then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WasRunning:=FALSE;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShellExecute(0,'open',FileNameArray,nil,nil,SW_HIDE);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sleep(3000);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HideAdobe();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if not IsAdobeRunning then<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sleep(3000);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HideAdobe();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv := TDdeClientConv.Create(nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv.SetLink('acroview','control');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv.OpenLink;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //CommandStr := '&#091;FilePrintSilent("' + FilePathName + '")&#093;';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CommandStr := '&#091;FilePrintTo("' + FilePathName +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '","' +&nbsp; PrinterDevice +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '","' +&nbsp; PrinterDriver +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '","' +&nbsp; PrinterPort +'")&#093;';<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strpcopy(CommandBuff,CommandStr);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv.ExecuteMacro(CommandBuff,false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Log error here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv.CloseLink;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv.Free;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DdeConv := nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br><br>//TODO? make sure we are finished spooling first<br><br>&nbsp;&nbsp;&nbsp; if not WasRunning then<br>&nbsp; begin<br>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if IsAdobeRunning then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Sleep(1000);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Ask Acrobat/Reader to close<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PostMessage (hWndAdobe, WM_CLOSE, 0, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>&nbsp; end;<br><br>&nbsp; SetPrinterProperties(PrinterDevice,pDevMode1);<br><br>result := true;<br>end;<br><br><br><br>end.<br><br>]]>
   </description>
   <pubDate>Wed, 20 Dec 2006 18:02:49 +0000</pubDate>
   <guid isPermaLink="true">http://www.quickpdf.org/forum/delphi-dde-to-acrobat_topic585_post2636.html#2636</guid>
  </item> 
 </channel>
</rss>