2010-02-26 23 views
5

यहां स्थिति है। मेरे पास स्वचालित रूप से जेनरेट किए गए पीडीएफ फॉर्म फ़ील्ड नामों वाला एक पीडीएफ है। समस्या यह है कि ये नाम बहुत उपयोगकर्ता के अनुकूल नहीं हैं। वे कुछ इस तरह दिखते हैं: शीर्षतम सुबॉफ [0]। पेज 1 [0] .bsbsite_Address [0]क्या पीडीएफ फॉर्म फ़ील्ड नामों को संशोधित करना संभव है?

मैं उन्हें बदलने में सक्षम होना चाहता हूं ताकि वे वेबसाइट एड्रेस की तरह कुछ हो। मेरे पास एबीसीपीडीएफ तक पहुंच है और मुझे iTextSharp के साथ अनुभव है, लेकिन मैंने ऐसा करने के लिए इन एपीआई का उपयोग करने का प्रयास किया है (फॉर्म फ़ील्ड एक्सेस करें और नाम बदलने का प्रयास करें), लेकिन ऐसा लगता है कि यह संभव नहीं है।

क्या किसी के पास किसी प्रकार के एपीआई (अधिमानतः ओपन सोर्स) के माध्यम से ऐसा करने का कोई अनुभव है। कोड भी नेट है।

उत्तर

7

अच्छी खबर: आप iTextSharp में फ़ील्ड नाम बदल सकते हैं।

हालांकि आप वास्तव में पीडीएफ संपादित नहीं कर सकते हैं। आप किसी मौजूदा पीडीएफ में पढ़ेंगे, मेमोरी में अपने फील्ड नाम अपडेट करें और फिर अपना संशोधित पीडीएफ लिखें। फ़ील्ड नाम बदलने के लिए AcroFields.RenameField विधि को कॉल करें।

PdfReader reader = new PdfReader(PDF_PATH); 
using (FileStream fs = new FileStream("Test Out.pdf", FileMode.Create)) { 
    PdfStamper stamper = new PdfStamper(reader, fs); 
    AcroFields fields = stamper.AcroFields; 
    fields.RenameField("oldFieldName", "newFieldName"); 
    stamper.Close(); 
} 

अब बुरी खबर:

यहाँ एक टुकड़ा है वहाँ वे वर्ण जो आप का नाम बदला क्षेत्रों में उपयोग कर सकते हैं में सीमाओं दिखाई देते हैं।

मैंने आपके उदाहरण फ़ील्ड नाम के साथ उपरोक्त स्निपेट का परीक्षण किया और यह काम नहीं किया। हालांकि अवधि को हटा दें और यह काम करता है। मुझे यकीन नहीं है कि कोई कामकाज है लेकिन यह आपके लिए एक समस्या हो सकती है,

0

हां, फॉर्म फ़ील्ड का नाम बदलना संभव है। मुझे सोर्स कोड एपीआई के साथ कोई अनुभव नहीं है जो आपकी मदद करेगा, लेकिन मेरी कंपनियां PDF SDK can help आप ऐसा करते हैं, और थोड़ी सी खोज से यह प्रतीत होता है कि iText will indeed let you rename form fields

6

एक एक्रोफॉर्म फ़ील्ड का पूरा नाम स्पष्ट रूप से किसी फ़ील्ड के भीतर संग्रहीत नहीं है। यह वास्तव में खेतों के पदानुक्रम से लिया गया है, बाईं ओर दिखाई देने वाले पूर्वजों की एक डॉट सीमित सूची के साथ।

बस 'टॉपस्टेस्टफॉर्म [0] से फ़ील्ड का नाम बदलना। पेज 1 [0]। वेबसाइट पर' एड्रेस्रेस 'एड्रेस [0]' को सही परिणाम देने की संभावना नहीं है।

आप पीडीएफ संदर्भ की धारा 8.6.2 'फील्ड शब्दकोश' मिल जाएगा एक शब्दकोश, द्वारा परिभाषित किया जाता है कैसे क्षेत्र नामकरण काम करता है ;-)

मूल रूप से, प्रत्येक क्षेत्र एक AcroForm में का एक अच्छा विवरण उपलब्ध कराती है जो किसी फ़ील्ड के नाम से संबंधित कुछ वैकल्पिक प्रविष्टियां हो सकती हैं।

  • कुंजी '/ टी' आंशिक नाम निर्दिष्ट करता है। आपके प्रश्न में, 'topmostSubform [0]', 'पेज 1 [0]', और वेबसाइट_एड्रेस [0], सभी आंशिक नामों का प्रतिनिधित्व करते हैं।

  • कुंजी '/ टीयू' फ़ील्ड के लिए एक वैकल्पिक 'उपयोगकर्ता के अनुकूल' नाम निर्दिष्ट करता है, जिसे उपयोगकर्ता इंटरफ़ेस में फ़ील्ड की पहचान करने के लिए वास्तविक फ़ील्ड नाम के स्थान पर उपयोग किया जा सकता है।

प्रश्न में फ़ील्ड का नाम बदलने के बजाय, एक/टीयू प्रविष्टि जोड़ने के बारे में सोचें!

नीचे दिया गया उदाहरण एबीसीपीडीएफ का उपयोग एक्रोफॉर्म में सभी क्षेत्रों के माध्यम से फिर से करने के लिए करता है और इसके आंशिक नाम के आधार पर एक वैकल्पिक नाम डालता है।

VBScript:

Set theDoc = CreateObject("ABCpdf7.Doc") 
theDoc.Read "myForm.pdf" 

Dim theFieldIDs, theList 
theFieldIDs = theDoc.GetInfo(theDoc.Root, "Field IDs") 
theList = Split(theFieldIDs, ",") 

For Each fieldID In theList 
    thePartialName = theDoc.GetInfo(fieldID, "/T:text") 
    theDoc.SetInfo fieldID, "/TU:text", thePartialName 
Next 

theDoc.Save "output.pdf" 
theDoc.Clear 

"/TU:text""/T:text" को परिवर्तित करने से एक क्षेत्र के आंशिक नाम सेट हो जाएगा।

सी # और वीबीएनईटी में लिखे गए उदाहरणों में इस्तेमाल किए गए उदाहरण यहां पाए जा सकते हैं: Doc.GetInfo, Doc.SetInfoObject Paths पर भी दस्तावेज़ देखें।

5

मुझे कल समस्या थी और मंच और दूसरों में जवाब देने के बाद, लेकिन कोई रास्ता नहीं बनाया। मेरा कोड इस तरह दिखता था।

// Open up the file and read the fields on it. 
var pdfReader = new PdfReader(PATH_TO_PDF); 
var fs = new FileStream(pdfFilename, FileMode.Create, FileAccess.ReadWrite) 
var stamper = new PdfStamper(pdfReader, fs); 
var pdfFields = stamper.AcroFields; 

//I thought this next line of code I commented out will do it 
//pdfFields.RenameField("currentFieldName", "newFieldName"); 

// It did for some fields, but returned false for others. 
// Then I looked at the AcroFields.RenameField method in itextSharp source and noticed some restrictions. You may want to do the same. 
// So I replaced that line pdfFields.RenameField(currentFieldName, newFieldName); with these 5 lines 

AcroFields.Item item = pdfFields.Fields[currentFieldName]; 
PdfString ss = new PdfString(newFieldName, PdfObject.TEXT_UNICODE); 
item.WriteToAll(PdfName.T, ss, AcroFields.Item.WRITE_VALUE | AcroFields.Item.WRITE_MERGED); 
item.MarkUsed(pdfFields, AcroFields.Item.WRITE_VALUE); 
pdfFields.Fields[newFieldName] = item; 

और वह

3

हो सकता है कि आप इस पर विचार कर सकते काम किया है:

  • पंछी एक मालिकाना सॉफ्टवेयर वातावरण में, मुक्त नहीं है (2.1.7 यह/s पिछले 'नि: शुल्क 'संस्करण)।
  • एबीसीपीडीएफ भी मुफ्त नहीं है।

मैं कहना है कि हम AbcPDF लाइसेंस है है, और हम अपने जावा परियोजनाओं में धूआँ 2.1.7 का उपयोग करें ... इसलिए मैं कह सकता हूँ मैं पिछले जवाब से सहमत हैं, लेकिन, यह आप उपयोग नहीं कर सकते/एक हस्ताक्षर क्षेत्र के लिए

उदाहरण:: इस उत्पादों को खरीदने के लिए, आप (एक सादे txt फ़ाइल के रूप में) शुद्ध पीडीएफ कोड में नाम बदलने के लिए कोशिश कर सकते हैं, पीडीएफ विनिर्देश निम्नलिखित

35 0 obj 
<< 
/AP << 
/N 37 0 R 
>> 
/DA (/TimesRoman 0 Tf 0 g) 
/F 4 
/FT /Sig 
/P 29 0 R 
/Rect [ 86 426 266 501 ] 
/Subtype /Widget 
/T (FIELD_MODIF) 
/Type /Annot 
/V 36 0 R 
>> 
endobj 

कहाँ "FIELD_MODIF" यह है वह जगह जहां नया नाम रखा गया है।

+0

यह एक बार काम किया है, लेकिन फिर मैं चेक जोड़ा बक्से, रेडियो बटन, और एक ड्रॉप डाउन सूची यह देखने के लिए कि क्या यह उन लोगों के लिए काम करेगा। पीडीएफ को सहेजने और नोटपैड ++ में कच्चे पाठ को देखने के बाद, अब मैं कच्चे पाठ में किसी फ़ील्ड नाम की पहचान नहीं कर सका। कुछ भी नहीं मिलेगा। हालांकि एक अच्छा विचार था ... इस मुद्दे ने मुझे सचमुच, वर्षों के लिए परेशान किया है। – jason

0

यहाँ एक जावा उदाहरण के लिए, "एक्शन में पंछी"

इस पुस्तक के लिए उनके उदाहरण स्रोत कोड से लिया है और मुझे यह एक ही मुद्दे के साथ बेहद मदद की है पुस्तक में मिलता है। part2.chapter06.ConcatenateForms2

public static void main(String[] args) 
    throws IOException, DocumentException { 
    // Create a PdfCopyFields object 
    PdfCopyFields copy 
     = new PdfCopyFields(new FileOutputStream(RESULT)); 
    // add a document 
    PdfReader reader1 = new PdfReader(renameFieldsIn(DATASHEET, 1)); 
    copy.addDocument(reader1); 
    // add a document 
    PdfReader reader2 = new PdfReader(renameFieldsIn(DATASHEET, 2)); 
    copy.addDocument(reader2); 
    // Close the PdfCopyFields object 
    copy.close(); 
    reader1.close(); 
    reader2.close(); 
} 


private static byte[] renameFieldsIn(String datasheet, int i) 
    throws IOException, DocumentException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    // Create the stamper 
    PdfStamper stamper = new PdfStamper(new PdfReader(datasheet), baos); 
    // Get the fields 
    AcroFields form = stamper.getAcroFields(); 
    // Loop over the fields 
    Set<String> keys = new HashSet<String>(form.getFields().keySet()); 
    for (String key : keys) { 
     // rename the fields 
     form.renameField(key, String.format("%s_%d", key, i)); 
    } 
    // close the stamper 
    stamper.close(); 
    return baos.toByteArray(); 
} 
2

यद्यपि आप जावास्क्रिप्ट आप नए क्षेत्रों को जोड़ने और मौजूदा क्षेत्रों को हटा सकते हैं का उपयोग कर खेतों नाम नहीं बदल सकते। आप दस्तावेजों के बीच काट और पेस्ट भी कर सकते हैं। तो ...

एक। नाम बदलने स्क्रिप्ट, उदा .:

var doc = app.activeDocs[0]; 
    var fnames = new Array(); 
    for (var i = 0; i < doc.numFields - 1; i++) {  
     fnames[i] = doc.getNthFieldName(i); 
    } 
    for (var i = 0; i < doc.numFields - 1; i++){   
     var f = doc.getField(fnames[i] + ".0"); 
     var nfn = fnames[i].replace("1","2"); 
     var rb = doc.addField(nfn,"radiobutton",0,f.rect) 
     for (var j = 1; j < 9; j++){//Add the other 8 
      f = doc.getField(fnames[i] + "." + j); 
      doc.addField(nfn,"radiobutton",0,f.rect) 
     } 
     rb.setExportValues([1,2,3,4,5,6,7,8,9]); 
     rb.borderStyle = f.borderStyle; 
     rb.strokeColor = f.strokeColor; 
     rb.fillColor = f.fillColor; 
     doc.removeField(fnames[i]); 
     console.println(fnames[i] + " to " + nfn); 
    } 

नोट्स का विकास:
का नाम बदल रहा क्षेत्रों getNthFieldName के लिए खेतों का क्रम बदल सकता है, तो ये पहले मिलता है।
रेडियोबुटन्स का एक समूह एक फ़ील्ड (getField ("groupname") है, उसी समूह में getField ("groupname.n") का उपयोग करने के लिए, आपको इन्हें स्थिति आयताकार के लिए चाहिए। गुण जो सभी पर लागू होते हैं उन्हें enmase सेट किया जा सकता है।
addField मानकों हैं: फ़ील्ड नाम, फ़ील्ड प्रकार, पेज, स्थिति आयत)
उदाहरण में वहाँ प्रत्येक समूह

दो में 9 radiobuttons हैं। उन फ़ील्ड को काटें और पेस्ट करें जिन्हें आप रिक्त पीडीएफ में बदलना चाहते हैं (मैंने उपरोक्त एक पृष्ठ ग्रहण किया है)। स्क्रिप्ट चलाएं।कट और पेस्ट करें।

आप को बदलने के लिए app.activeDocs [0] app.activeDocs लिए [1] या "इस" अगर दोनों दस्तावेजों खुला रखते हुए जब स्क्रिप्ट

1

सबसे अच्छा तरीका चल क्षेत्रों स्टोर करने के लिए है के साथ "डॉक" की जगह की आवश्यकता हो सकती आयताकार और फिर इच्छित नाम और संग्रहीत रेक्ट स्थिति के साथ नए क्षेत्र बनाने के लिए, नए क्षेत्र पुराने क्षेत्र के रूप में एक ही स्थिति पर होगा, टा दा :) यहाँ कोड है:

Sub CreateNewField() 
Create = "var f = this.getField('" & oldFieldName & "'); var rect = f.rect; 
this.addField('" & newFieldName & "','text',0,rect);" 
FormFields.ExecuteThisJavascript Create 
DeleteField 'sub to delete old field 
End Sub 
+1

ओपीएस सवाल एपीआई के माध्यम से फ़ील्ड नामों के संपादन के बारे में था। यहां तक ​​कि यदि आपका उत्तर मान्य है, तो कोड का उदाहरण पोस्ट करना अच्छा होगा। –

+0

देर से उत्तर के लिए मैं क्षमा चाहता हूं। मैं फ़ील्ड के नाम को बदलने के लिए एक लंबा समय भी खोजता हूं, और अंत में मुझे एहसास हुआ कि उस क्षेत्र की स्थिति को रिकॉर्ड करना सबसे अच्छा है जिसे मैं पुनर्नामित करना चाहता हूं, और फिर इसे मिटा दें और वांछित नाम के साथ एक नया फ़ील्ड रखें एक ही स्थान पर। और मैंने जावा स्क्रिप्ट का उपयोग करके इसे एक्सेल वीबीए के माध्यम से हासिल किया। –

संबंधित मुद्दे

 संबंधित मुद्दे