Active Topics Memberlist Search Help | |
Register Login |
Programming | |
EXP Systems Forum : PDF reDirect : Programming |
Topic: PDF File Name Name | |
Author | Message |
Gene
Newbie Joined: 26 Dec 07 Location: United States Posts: 4 |
Topic: PDF File Name Name Posted: 26 Dec 07 at 10:17AM |
I purchased the pro version a couple of days ago. I am creating PDF files from MS Access reports and everything seems to work fine with the exception the name of the PDF file that is created. Even though I would change the file name property to the file name that I wanted it would create the PDF with the name of the report so I changed everything to work that way and just renamed the file at the end of the code.
This worked well with several reports and then for no reason that I can understand it named the PDF the name of a report that I had run prior to that report (like it had stored the name somewhere). Has anyone seen anything similar to this and have a fix?
Thanks,
|
|
IP Logged | |
Michel_K17
Moderator Group Forum Administrator Joined: 25 Jan 03 Posts: 1673 |
Posted: 26 Dec 07 at 11:13AM |
I'll take a look to see if I can duplicate the problems and fix them. Thanks for letting me know. It'll probably be late today before I have an update.
Cheers! |
|
Michel Korwin-Szymanowski
EXP Systems LLC |
|
IP Logged | |
Michel_K17
Moderator Group Forum Administrator Joined: 25 Jan 03 Posts: 1673 |
Posted: 27 Dec 07 at 12:21AM |
Hi,
I think I figured outwhat is going on: are you trying to create multiple PDF reports very quickly (ie in quick succession)?If so, then it is possible that the next print job sets the printer name of the previous job before the current print job has completed. In the module, there is a line that reads: TempBool = CheckFileCreated(MyOutputPath & "\" & MyOutputFilename) If you do create multiple reports, please make sure that this line is not commented out to ensure that each print job is done sequentially. In fact, if you load the print queue very quickly, you could have multiple files waiting to be printed, and the filename data associated with each one will be lost. To test my theory, I tried to print 20 reports in quick succession using the following code, and turning off the post creation editing or opening the PDFs in the Reader: For i = 1 To 20 MyOutputFilename = Replace$(Application.CurrentProject.name & "_" & Format$(i, "00"), ".mdb", ".pdf") Convert2PDF MyReportName, MyBatchPrinter, MyOutputPath, MyOutputFilename DoEvents Next i This is what I got for the results:
Cheers! P.S. An alternative if print performance is critical to you would be to setup multiple batch printers, and make sure that only one file is printed to each before a new one is added. You may indeed get performance gains if you have a multi-processor CPU core, but it could allow to have 4 print jobs to get processed concurrently. I am guessing that the Windows Printer spool does provide a multi-threaded environment that would be necessary for that to work though, so this suggestion is untested and may not work. |
|
Michel Korwin-Szymanowski
EXP Systems LLC |
|
IP Logged | |
Gene
Newbie Joined: 26 Dec 07 Location: United States Posts: 4 |
Posted: 27 Dec 07 at 1:04PM |
I appreciate the time you've spent on this. I was having a problem which I corrected with an extra Sleep before the rtn =
Sleep (2000)
' Changed to Path with MyReport rtn = oPDF.Utility_Open_PDF(MyOutputPath & "\" & MyReport & ".pdf", "") TempBool = CheckFileCreated(MyOutputPath & "\" & MyReport & ".pdf") I've run about 20 of the same report one after another and they all seemed to print correctly. I appear to only be having this problem with one report (I've tested it on about 6). Another similar report with a similar name creates the file name as the report name (as I expect) and then I rename it. I could probably work around this but I could possible be running a lot of reports off of this and I don't want to spend a lot of time testing each one. I have several clients that may be interest in me modifying their programs to incorporate the pdf's. I'm attaching a lot of information just in case it does you any good.
I run a similar report called "arrptClientSummary" and it runs correctly every time
Line Calling Function FName = Convert2PDF2("ARrptClientSummaryNew", "BatchPDF", Path, FName, True) Name of File that is created (ARrptGenLtr1.pdf"). I have not run a report with this name today - This is a report that I ran previously.
Get an error number = 0 and DLL error number = 0 because file is not found because it's naming it the wrong thing
Parameter Input Values
? MyReport ARrptClientSummaryNew ? MyBatchPrinter BatchPDF ? MyOutputPath N:\MyDocs\Campbell\TempEMailFiles ? MyOutputFileName Summary_State Auto Insurance_12270700.pdf ? OpenDoc True Mostly your code with a couple of changes - I took out most comments to make it shorter
Public Function Convert2PDF2(ByRef MyReport As String, ByRef MyBatchPrinter As String, ByRef MyOutputPath As String, ByRef MyOutputFilename As String, OpenDoc As Boolean) As String
' Declare variables Dim rtn As Long Dim TempBool As Boolean Dim oDefaultPrinter As Printer Dim DefaultPrinter As String Dim oPDF As New PDF_reDirect_Pro_Tool
On Error Resume Next If Right(MyOutputPath, 1) = "\" Then MyOutputPath = Left(MyOutputPath, Len(MyOutputPath) - 1) End If ' Create the target folder if it's missing If Dir$(MyOutputPath, vbDirectory) = "" Then MkDir (MyOutputPath) ' Changed to Path with MyReport If Dir$(MyOutputPath & "\" & MyReport & ".pdf") Then Kill (MyOutputPath & "\" & MyReport & ".pdf") If Dir$(MyOutputPath & "\" & MyOutputFilename) Then Kill (MyOutputPath & "\" & MyOutputFilename) With oPDF If Not .Batch_Printer_Is_Installed(MyBatchPrinter) Then TempBool = .Batch_Printer_Install(MyBatchPrinter) If Not TempBool Then GoTo Error_Occured End If TempBool = .Batch_Printer_Load_Settings(MyBatchPrinter) If Not TempBool Then GoTo Error_Occured .Settings_Output_Path = MyOutputPath ' Path where to save output PDF to ' Changed to MyReport name .Settings_Output_FileName = MyReport & ".pdf" ' Changed to Report Name .Settings_Overwrite = OW_NO_WARN ' OW_NO_WARN,OW_WARN,OW_SAVEAS_DIALOG,OW_NEW_SEQ_NUMBER,OW_APPEND,OW_PREPEND .Settings_Trailer_Digits = 3 ' Format of trailing digits (3 = 3 zeros = "000") .Settings_Number_Start = 1 ' Default sequence start number .Settings_Show_Progress = True ' Show Progress Bar? .Settings_Picture_Quality = QUALITY_GOOD ' QUALITY_HIGH, QUALITY_VERY_GOOD, QUALITY_GOOD, QUALITY_LOW .Settings_Rotation = ROTATE_AUTO ' ROTATE_AUTO, ROTATE_90CW, ROTATE_180, ROTATE_90CCW .Settings_Fast_Web_View = False ' Only works on unencrypted & unlocked PDF. (Also called "linearize") .Settings_Add_Links = False ' Run through all of the text, page-by-page, and create hyperlinks when found ' changed this .Settings_Stamps = "" .Settings_FileType = 0 ' 0 = PDF, 1 = Encrypted PDF (ie user is asked for password to open the PDF) .Settings_Encrypt_Password = "Password" ' Encryption Password .Settings_Locked = False ' Set to "True" to Lock the PDF and apply the restrictions .Settings_Lock_Do_Not_Allow_Printing = True ' Set to "False" to allow printing .Settings_Lock_Do_Not_Allow_Copy_and_Paste = True ' Set to "False" to allow Copy-and-Paste .Settings_Lock_Do_Not_Allow_Making_Changes = True ' Set to "False" to allow Making Changes .Settings_Lock_Do_Not_Allow_Adding_Notes = True ' Set to "False" to allow Adding Notes .Settings_Master_Password = "Master" ' Master Password used for locking a PDF. TempBool = oPDF.Batch_Printer_Save_Settings(MyBatchPrinter) ' Skip changing settings if an error occured If Not TempBool Then GoTo Error_Occured ' 2002 works here so changed to 10 If Val(Application.Version) >= 10 Then Set oDefaultPrinter = Application.Printer Application.Printer = Application.Printers(MyBatchPrinter) Else DefaultPrinter = GetDefaultPrinter() Err.Clear If Not SetDefaultPrinter(MyBatchPrinter & ",PDF reDirect Pro v2,PDF_REDIRECT_PORT:") Then oPDF.LastErrorNumber = Err.Number oPDF.ErrorLastDLL = Err.LastDllError oPDF.LastErrorDescription = "Could not set the Batch Printer as the output printer." GoTo Error_Occured End If End If DoCmd.OpenReport MyReport, acViewPreview ' Generate a Preview First DoCmd.OpenReport MyReport, acViewNormal ' Print the Report DoCmd.Close acReport, MyReport If Val(Application.Version) >= 10 Then If Not oDefaultPrinter Is Nothing Then Application.Printer = oDefaultPrinter Else SetDefaultPrinter DefaultPrinter End If ' Changed to Path with MyReport TempBool = CheckFileCreated(MyOutputPath & "\" & MyReport & ".pdf") If Not TempBool Then GoTo Error_Occured ' added this - needed the extra time for the file to be recognized Sleep (2000) ' Changed to Path with MyReport rtn = oPDF.Utility_Open_PDF(MyOutputPath & "\" & MyReport & ".pdf", "") TempBool = CheckFileCreated(MyOutputPath & "\" & MyReport & ".pdf") If rtn = 0 Then GoTo Error_Occured ' Change to new file name
TempBool = oPDF.Utility_Close_PDF(MyOutputPath & "\" & MyOutputFilename) If Not TempBool Then GoTo Error_Occured If Dir$(MyOutputPath & "\" & MyReport & ".pdf") Then Kill (MyOutputPath & "\" & MyReport & ".pdf") TempBool = CheckFileCreated(MyOutputPath & "\" & MyOutputFilename) If Not TempBool Then GoTo Error_Occured ' added a parameter to open if I want If OpenDoc Then ShellExecute 0, "Open", MyOutputPath & "\" & MyOutputFilename, "", "", 3 End If ' made it a function to return the name of the file Convert2PDF2 = MyOutputPath & "\" & MyOutputFilename If Not TempBool Then Error_Occured: MsgBox "An Error Occured: " & .LastErrorDescription & vbCrLf & _ "Error Number =" & Str$(.LastErrorNumber) & vbCrLf & _ "DLL Error Number =" & Str$(.ErrorLastDLL), _ vbExclamation, "Batch_PDF_Control" Convert2PDF2 = "" End If End With ' Release the object Set oPDF = Nothing End Function
|
|
IP Logged | |
Michel_K17
Moderator Group Forum Administrator Joined: 25 Jan 03 Posts: 1673 |
Posted: 28 Dec 07 at 1:55AM |
Hi,
Wow... You definitely should not have to do the extra kind of work-around that you are doing to get the filename that you are doing. A couple of comments, about this section your code: ' Changed to Path with MyReport TempBool = CheckFileCreated(MyOutputPath & "\" & MyReport & ".pdf") If Not TempBool Then GoTo Error_Occured ' added this - needed the extra time for the file to be recognized Sleep (2000) ' Changed to Path with MyReport rtn = oPDF.Utility_Open_PDF(MyOutputPath & "\" & MyReport & ".pdf", "") TempBool = CheckFileCreated(MyOutputPath & "\" & MyReport & ".pdf") If rtn = 0 Then GoTo Error_Occured ' Change to new file name TempBool = oPDF.Utility_Close_PDF(MyOutputPath & "\" & MyOutputFilename) If Not TempBool Then GoTo Error_Occured If Dir$(MyOutputPath & "\" & MyReport & ".pdf") Then Kill (MyOutputPath & "\" & MyReport & ".pdf") Instead of opening the PDF and closing it to a new name, you could simply use the Visual Basic "Name" function which would be easier and faster. That is: Name Old_Path_and_Name As New_Path_and_Name. (Note, I use the Open/Close functions to do special processing such as adding a stamp. What you did is not wrong, and should work fine, but probably uses more code than necessary) You also have what looks like a redundant CheckFileCreated in between the Open- Close. I am not sure what you are doing there, but you already checked for that file just prior to the sleep command. And finally, the sleep command should not be necessary, but if it works, then so be it. 2 seconds is a long time. The function CheckFileCreated already uses the Sleep in a loop until the PDF file becomes available, so I am (like you) confused on why it would be required. I hope that helps. |
|
Michel Korwin-Szymanowski
EXP Systems LLC |
|
IP Logged | |
Gene
Newbie Joined: 26 Dec 07 Location: United States Posts: 4 |
Posted: 02 Jan 08 at 7:36PM |
Thanks for your reply again but I'm not really getting anywhere. Your program is just what I need and I've purchased several and I've had a client purchase several but I don't want to spend hours trying to figure out a way around the problems I'm having. Maybe it's just on my machine. When I first used the control the .Settings_Output_FileName did not appear to work correctly because the pdf file created was the same name as the report. So after allowing for that problem and assuming that the pdf file would always be named the same name as the report I had the following problem. While running a report called "ARrptClientSummaryNew" and assigning the Filename property "ARrptClientSummaryNew.pdf" I had it name the file "ARrptGenLtr1.pdf" which was a report that I first tested the program with (it does it every time). I've searched the registry to try and find out if it could be picking up the name from there but I don't think so. I also deleted the temp batch printer and let it be recreated but it didn't do any good. So I'm left with testing on another computer, reinstalling the control, etc.
If you've never had a problem with the program naming the file something other then the name you've assigned to the Filename property then I guess I have nothing to go on. If you don't have any additional ideas let me know and I'll try to work it out.
There's only one thing that I can add that may be important. In my report "ARrptGenLtr1" I use and ActiveX Memo Control. I've got no idea if this may conflict with something.
Thanks for any help you can give me.
|
|
IP Logged | |
Michel_K17
Moderator Group Forum Administrator Joined: 25 Jan 03 Posts: 1673 |
Posted: 02 Jan 08 at 11:52PM |
Hi,
I can see how this would be frustrating indeed. Here are some additional details on how it works: The filename is not saved in the registry. It is saved in a preferences file for the batch printer which is located in the folder here: C:\Documents and Settings\UserName\Application Data\PDF reDirect\Batch_Printers Note: substitute your login name for where it says "UserName". Inside, you will find a settings file for your Batch printer (for example: BatchPDF.ini). The batch printer loads the settings from that ini file everytime it runs, and reacts accordingly. For example, a typical file might look like this: "BatchPDF" "X:\Products\PDF_Redirect_Pro\Code\ActiveX_PDFR_Pro_Component\v22006\PDF" "MS_Access_Sample_VBA_Code" #TRUE# 0 3 1 "-P0-Q2-C0-R0-L0-E0-B0-S0-H0" 0 "123219189353202219342237237241233262505742559217" #FALSE# "0*0*0*0*0*0*0*0" "622012393910567701111699745737738723736893557" #FALSE# "CONFIDENTIAL.pdf, DRAFT - Text.txt" #FALSE# "" 0 "" "" "" "" "" "" The first line is the name of the batch printer (for cross-check ing purposes), the second line is the path where the PDF needs to be saved to. The third line is the filename (without extension). The rest are the various settings you might have selected for this printer. So, a way to check to see if the filename was properly written to would be to read the third line of data, and compare it to what you saved in your code. This, for example, would prove that there is a bug in my code. However, there is very little magic here. Here is the code inside the ActiveX control that saves the filename: Public Function Batch_Printer_Save_Settings(ByRef sPrinter As String, Optional ByRef Path_Override As String) As Boolean On Error Resume Next ' Reset Errors Reset_Errors ' Refuse to work if not in "Professional" Mode If Not Prefs.Pro_Mode Then ' Set an error LastErrorDescription = "You need to have PDF reDirect Professional activated to use this tool." ErrorLastDLL = 1906 ' ERROR_INVALID_PRINTER_STATE = 1906 Exit Function End If ' Filename cannot be empty If Len(Settings_Output_FileName) = 0 Then LastErrorNumber = FILENAME_IS_EMPTY LastErrorDescription = "The Batch PDF Output Filename is empty" Exit Function End If ' FileName cannot be more than 200 characters (to leave room for zeros at end) If Len(Settings_Output_FileName) > 200 Then LastErrorNumber = FILENAME_IS_GREATER_THAN_200_CHARACTERS LastErrorDescription = "The Batch PDF Output Filename contains more than 200 characters." Exit Function End If ' Do not accept quotes in Filename Settings_Output_FileName = Replace$(Settings_Output_FileName, Chr$(34), "'") ' Remove trailing extensions (if there) If Len(Settings_Output_FileName) > 5 Then If Mid$(Settings_Output_FileName, Len(Settings_Output_FileName) - 3, 1) = "." Then Settings_Output_FileName = Left$(Settings_Output_FileName, Len(Settings_Output_FileName) - 4) End If End If ' Path cannot be more than 255 characters If Len(Settings_Output_Path) > 255 Then LastErrorNumber = PATH_IS_GREATER_THAN_255_CHARACTERS LastErrorDescription = "The Batch PDF Output Path contains more than 200 characters." Exit Function End If ' Path must be greater than two characters ("C:") If Len(Settings_Output_Path) = 0 Then LastErrorNumber = PATH_IS_EMPTY LastErrorDescription = "Path is empty." Exit Function End If ' Make sure Path has no trailing "\" If Right$(Settings_Output_Path, 1) = "\" Then Settings_Output_Path = Left$(Settings_Output_Path, Len(Settings_Output_Path) - 1) ' Make sure Path is valid rtn = PathIsDirectory(Settings_Output_Path) If rtn = 0 Then ' Not a valid Path LastErrorNumber = PATH_IS_NOT_VALID LastErrorDescription = "Following Path is not valid:" & vbCrLf & Settings_Output_Path Exit Function End If ' Make sure Override Path to settings ini file is valid If Len(Path_Override) > 0 Then ' Make sure trailing slash is there Path_Override = AddPathSlash(Path_Override) ' Let's be nice, and create the Batch Printers folder if not given If Path_Override = "C:\Program Files\PDF reDirect\" Then Path_Override = Path_Override & BATCH_PATH If Len(Dir(Path_Override, vbDirectory)) = 0 Then MkDir Path_Override End If ' Now check that the folder exist rtn = PathIsDirectory(Path_Override) If rtn = 0 Then ' Not a valid Path LastErrorNumber = PATH_IS_NOT_VALID LastErrorDescription = "Following Path is not valid:" & vbCrLf & Path_Override Exit Function End If End If ' Update the batch printer with the new settings '----------------------------------------------- ' v2.2.6 - User can now override the output path in case in needs to go to the Program Folder ' for System and Network processes that cannot resolve their AppData Path. If Len(Path_Override) = 0 Then ' Normal ops: use AppData path Open MyPaths.AppData & BATCH_PATH & sPrinter & ".ini" For Output As #1 Else ' Use path override (create folders as necessary) Open Path_Override & sPrinter & ".ini" For Output As #1 End If Write #1, Settings_PrinterName ' Name of the Batch Printer Write #1, Settings_Output_Path ' Path to Output PDF to Write #1, Settings_Output_FileName ' Filename of the PDF ... etc. As you can see, apart from the basic sanity checks, there is nothing particularly unusual. Here is the printer's code that does the reverse: it loads the settings as follows: Public Function LoadBatchSettings() As Boolean On Error GoTo Error_Handler ' Assume we will fail LoadBatchSettings = False ' Update each printer with the new settings (if they have changed) '----------------------------------------------------------------- With BatchSettings Open MyPaths.AppData & "Batch_Printers\" & .Printer & ".ini" For Input As #1 Input #1, .Printer ' Name of the Batch Printer Input #1, .Path ' Path to Output PDF to Input #1, .FileName ' Filename of the PDF etc... If you want to see what the printer code read for the filename, you can start PDF reDirect Pro, go into the Preferences, and select (check) the General button >> Generate Log Files. Then, close PDF reDirect Pro. Finally run your code a few times until the problem occurs. When the problem occurs, stop and check the following: C:\Documents and Settings\UserName\Application Data\PDF reDirect\Bug_Reports If you see anything that does not look right, then send me the log file, and I will take a look. Beyond that, the only thing I can offer is to troubleshoot your project myself. If your data is not confidential, you can send me your .mdb file to me, and I can take a look. Please make sure that the entire file is less than 5MB otherwise my ISP will block it, and zip it as well. There is no doubt that the problem could be in my code, despite being very careful, I have made, unfortunately, a few errors in the past. Most of these tend to be in the "beta" series, but not always. Therefore, I am most interested in making sure that my code is not to blame. One limit though is that my research will need to be limited to finding bugs in PDF reDirect (ie I will not be able to exhaustively review all of your code and fix any errors: I would rather continue working on PDF reDirect v3). Another thing we can do is to use a remote control program such as www.logmein.com so that I can see the problem on your computer first hand. If anything, I can do a bit of troubleshooting and make sure that my code is working OK (or not). Please let me know if this is something that you are interested in pursuing. Cheers! |
|
Michel Korwin-Szymanowski
EXP Systems LLC |
|
IP Logged | |
Gene
Newbie Joined: 26 Dec 07 Location: United States Posts: 4 |
Posted: 03 Jan 08 at 10:01AM |
Thanks for all your time on this. It appears the problem is on my end (which I assumed). I had PDF995 installed and had found some code for making PDFs with it and had been testing it prior to using your product. There was obviously some kind of comflict with the printer port. Also, the report that I was having all of the trouble with had actually, somehow, had the default printer changed to PDF995. So if anyone else has the same problem your first question might be what other PDF drivers they have installed. The rest of this information could be useful to me in the future.
Thanks again.
|
|
IP Logged | |
Michel_K17
Moderator Group Forum Administrator Joined: 25 Jan 03 Posts: 1673 |
Posted: 04 Jan 08 at 12:43AM |
That's good news! Thanks for the update: I am glad that you found the cause of all of your misery.
|
|
Michel Korwin-Szymanowski
EXP Systems LLC |
|
IP Logged | |
Forum Jump |
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |