JonF Posted August 31, 2011 Share Posted August 31, 2011 There's several topics and UDFs I've found that create PDF files, but I don't see anything that changes the properties of an existing PDF. I've tried PDFTK and neither update_info or update_info_utf8 change the properties as displayed in Acrobat. We want to file a whole bunch of PDFs of journal articles as references, with the Title property set to the title of the paper, the Author property set to the author(s) names, the Subject property set to the journal reference in an extremely fixed format, and the Keywords set to the complete citation ready for copying and pasting. For example: Title: Tests for skewness, kurtosis, and normality for time series dataAuthor: Bai J, Ng SSubject: J Bus Econ Stat. 2005 Jan;23(1):49-60Keywords: Bai J, Ng S. Tests for skewness, kurtosis, and normality for time series data. J Bus Econ Stat. 2005 Jan;23(1):49-60. Then we name the file with the authors, a hyphen, and the title: Bai J, Ng S-Tests for skewness, kurtosis, and normality for time series data.pdf Collecting this information is a pain, and often one wants to scroll through the article while entering this info into a dialog box. Obviously an AutoIT program can create the keywords field and the filename from the other properties, and there may be opportunities to help out putting the rest of the information together. Any way to write these properties to a PDF, or do I have to open Acrobat and the Properties dialog and punch the values in? (I do have full Acrobat). Link to comment Share on other sites More sharing options...
ReFran Posted August 31, 2011 Share Posted August 31, 2011 Mmmh, I shortly tested it with PdfTk. It can dump out the data, but it seems the update works only for userdefined, not general, meta data / InfoKeys. However Adobe (full Version can do - have a look at the Acro-JS help file), mbtPdfAsm can do - you may also download the GUI = BeCyPdfAsm for quick testing - and also BeCyPdfMetaEdit can do it. With all you can work with batch jobs. Urls you can find with search here or in the Intranet. I'm just a little bit in hurry. HTH, Reinhard Link to comment Share on other sites More sharing options...
taietel Posted August 31, 2011 Share Posted August 31, 2011 IF your pdf has not outlines (those have /Title also), here's a fast hack, no error checking:expandcollapse popup#include <Array.au3>;just for display the arrays _Test() Func _Test() Local $sFile = @ScriptDir & "\PDFReference13.pdf" Local $aOldData = _PDF_GetProperties($sFile) _ArrayDisplay($aOldData) Local $aNewData[6][2] = [["Title", "New Title"],["Producer", "New Producer"],["Author", "New Author"],["Creator", "New Creator"],["Subject", "New Subject"],["Keywords", "New keywords"]] Local $sNewFile = _PDF_SetProperties($sFile, $aOldData, $aNewData) Local $aCheck = _PDF_GetProperties($sNewFile) _ArrayDisplay($aCheck) EndFunc ;==>_Test Func _PDF_GetProperties($sFile) Local $a_Prop[6][2] = [["Title", ""],["Producer", ""],["Author", ""],["Creator", ""],["Subject", ""],["Keywords", ""]] Local $hFile = FileOpen($sFile) Local $sTxt = FileRead($hFile) FileClose($hFile) Local $title = StringRegExp($sTxt, "(?i)(/Title) {0,1}\((.*?)\)", 1) If @error = 1 Then $a_Prop[0][1] = "no match" Else $a_Prop[0][1] = $title[1] EndIf Local $producer = StringRegExp($sTxt, "(?i)(/Producer) {0,1}\((.*?)\)", 1) If @error = 1 Then $a_Prop[1][1] = "no match" Else $a_Prop[1][1] = $producer[1] EndIf Local $author = StringRegExp($sTxt, "(?i)(/Author) {0,1}\((.*?)\)", 1) If @error = 1 Then $a_Prop[2][1] = "no match" Else $a_Prop[2][1] = $author[1] EndIf Local $creator = StringRegExp($sTxt, "(?i)(/Creator) {0,1}\((.*?)\)", 1) If @error = 1 Then $a_Prop[3][1] = "no match" Else $a_Prop[3][1] = $creator[1] EndIf Local $subject = StringRegExp($sTxt, "(?i)(/Subject) {0,1}\((.*?)\)", 1) If @error = 1 Then $a_Prop[4][1] = "no match" Else $a_Prop[4][1] = $subject[1] EndIf Local $keywords = StringRegExp($sTxt, "(?i)(/Keywords) {0,1}\((.*?)\)", 1) If @error = 1 Then $a_Prop[5][1] = "no match" Else $a_Prop[5][1] = $keywords[1] EndIf Return $a_Prop EndFunc ;==>_PDF_GetProperties Func _PDF_SetProperties($sFile, $aOld, $aNew) Local $hFile = FileOpen($sFile) Local $sTxt = FileRead($hFile) FileClose($hFile) For $i = 0 To UBound($aOld) - 1 If $aOld[$i][1] <> "no match" Or $aOld[$i][1] <> "" Then $sTxt = StringRegExpReplace($sTxt, "(?i)(/" & $aOld[$i][0] & ") {0,1}\((.*?)\)", "/" & $aOld[$i][0] & " (" & $aNew[$i][1] &") ", 1) EndIf Next Local $sFileName = StringRegExpReplace($sFile, ".*\\(.*).{4}", "$1") Local $sNewFile = StringReplace($sFile, $sFileName, $sFileName & "_mod.pdf") Local $hNew = FileOpen($sNewFile, 18) FileWrite($hNew, $sTxt) FileClose($hNew) Return $sNewFile EndFunc ;==>_PDF_SetProperties It will create a new pdf with the name original_mod.pdf and with the new properties.I suck at RegExp, but this script is tested on several pdf's, WITHOUT outlines (in this case the Title property is altered, the rest is ok). If you use parentheses within a field, e.g. John (Cheese) Doe, the right replacement is John \(Cheese\) Doe. Things you should know first...In the beginning there was only ONE! And zero... Progs: Create PDF(TXT2PDF,IMG2PDF) 3D Bar Graph DeskGadget Menu INI Photo Mosaic 3D Text Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now