एंड्रॉइड ऐप में पीडीएफ कैसे बनाएं? [बन्द है]


147

क्या Android एप्लिकेशन से PDF फ़ाइलें बनाने का कोई तरीका है?


6
अगर एंड्रॉइड के इमेजिंग मॉडल ने क्यूटी से कुछ प्रेरणा ली तो यह अच्छा नहीं होगा? Qt ने स्थापित किया कि पीडीएफ या एसवीजी उत्पन्न करना उतना ही सरल हो सकता है जितना कि एक ही कोड को स्क्रीन पर आरेखित करने के लिए उपयोग किया जाता है। पैटर्न के लिए QPaintDevice से QPrinter, QSvgGenerator, और QWidget की व्युत्पत्ति को देखें।
कैलाफ

1
आईओएस में भी। पीडीएफ पीढ़ी अंतर्निहित है।
फेबियन ज़ेन्डल

2
मेरा मानना ​​है कि किट कैट में पीडीएफ जेनरेट करने की सुविधा है, लेकिन मुझे नहीं पता कि यह बैकवर्ड संगत है या नहीं। मैंने नीचे एक विकल्प पोस्ट किया है और निम्नलिखित साइट में वाणिज्यिक से लेकर मुफ्त में कई विकल्प सूचीबद्ध हैं: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
हास्यास्पद है कि यह "ऑफ-टॉपिक" के रूप में बंद था।
जो कोडर

2
इस पोस्ट को बंद क्यों किया गया? Stackoverflow वैसे भी अपने दायरे के बारे में picky है; इस सवाल के 175,000 विचार हैं, एक कोडिंग संसाधन के रूप में इस साइट को इस तरह की हाइपर-कॉमन चीजों की अनुमति देनी चाहिए, नियमों में संशोधन की आवश्यकता है, हम नियम के दिल के बजाय "ऑफ-टॉपिक" के शाब्दिक पाठ में बहुत दूर तक पढ़ते हैं। मैंने इसे दोबारा खोलने के लिए हरी झंडी दिखाई, आशा है कि अन्य लोग भी मतदान करेंगे।
अल्बर्ट रेनशॉ

जवाबों:


155

अगर कोई भी Android डिवाइस पर PDF जेनरेट करना चाहता है, तो यह कैसे करना है:


54
केवल iText के साथ समस्या यह है कि यह एक GPLv3 लाइसेंस है, अन्यथा आपको एक वाणिज्यिक लाइसेंस खरीदना होगा।
टोनी मारो

5
और iText के पहले के संस्करणों में java.awt.Color wich dalvik जैसी कुछ गुम निर्भरताएँ नहीं हैं
k-deux

3
@ kape123 अच्छा सेंस ऑफ ह्यूमर :-)
AZ_

10
CommonsWare जेनेरिक हारवादी जवाब ... चबाया।
चांदनीशेख

2
कमोडोरियल लाइसेंस की लागत एंड्रॉइड डिवाइस के प्रति USD 0.50 (0,42 EUR) है। (११-२०१३)
क्रिस ६२३

104

यदि आप API स्तर 19 या उससे अधिक वाले उपकरणों के लिए विकसित कर रहे हैं, तो आप PrintedPdfDocument में निर्मित का उपयोग कर सकते हैं: http://developer.android.com/reference/android/print/pdf/PrintedPdfDocument.html

// open a new document
PrintedPdfDocument document = new PrintedPdfDocument(context,
     printAttributes);

// start a page
Page page = document.startPage(0);

// draw something on the page
View content = getContentView();
content.draw(page.getCanvas());

// finish the page
document.finishPage(page);
. . .
// add more pages
. . .
// write the document content
document.writeTo(getOutputStream());

//close the document
document.close();

2
अंत में आईओएस के अपने हिस्से के रूप में Android का अपना हिस्सा।
लालित्यम

5
@ क्रिस 623 मुझे लगता है कि आपका मतलब "किटकैट" था ... :)
एंड्रॉइड डेवलपर

7
@ ललितम यह वैसा नहीं है जैसा कि ios में है। IOS में उत्पन्न Pdf में डॉक में लिखे गए चयन योग्य पाठ हैं। लेकिन Android में इसकी एक छवि है।
कांतेश

2
@WillThomson क्या आपका GitHub लिंक यह एक या कुछ और होना चाहिए था ?
jk7

3
बहुत बहुत धन्यवाद - उपयोगी लिंक यहाँ है github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Kibi

27

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


2
यह कम से कम 1up का हकदार था।
राहुल रस्तोगी

मेरे लिए काम किया। एक साधारण कार्यान्वयन था।
थरकनिरामन

एक अच्छा काम है
कुमार सौरभ

यह टिप्पणी मुझे सही दिशा में ले जाती है। हालाँकि: 1. आपको स्क्रीन शॉट लेने के लिए गतिविधि शुरू करने की आवश्यकता नहीं है! आप रनटाइम पर सिर्फ एक xml लेआउट को फुला सकते हैं और इसे यहां सुझाए गए बिटमैप में बदल सकते हैं ; कहा जा रहा है कि, आप विभिन्न लेआउट के साथ कई पेज बना सकते हैं। कहा जा रहा है कि स्क्रॉल समर्थित नहीं है, लेकिन आप उदाहरण के लिए, एक रैखिक लेआउट का उपयोग करके एक सूची लागू कर सकते हैं।
r.pedrosa

11

एंड्रॉइड में गैर-अंग्रेजी अक्षरों के साथ पीडीएफ के लिए एक मनमाने ढंग से HTML के रूपांतरण की समस्या का पूर्ण समाधान खोजना आसान नहीं है। मैं इसे रूसी यूनिकोड पत्रों के लिए परीक्षण करता हूं।

हम तीन पुस्तकालयों का उपयोग करते हैं:

(1) HTML से XHTML में रूपांतरण के लिए Jsoup (jsoup-1.7.3.jar):

(2) iTextPDF (itextpdf-5.5.0.jar),

(3) XMLWorker (xmlworker-5.5.1.jar)।

public boolean createPDF(String rawHTML, String fileName, ContextWrapper context){
    final String APPLICATION_PACKAGE_NAME = context.getBaseContext().getPackageName();
    File path = new File( Environment.getExternalStorageDirectory(), APPLICATION_PACKAGE_NAME );
    if ( !path.exists() ){ path.mkdir(); }
    File file = new File(path, fileName);

    try{

    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    document.open();

    // Подготавливаем HTML
    String htmlText = Jsoup.clean( rawHTML, Whitelist.relaxed() );
    InputStream inputStream = new ByteArrayInputStream( htmlText.getBytes() );

    // Печатаем документ PDF
    XMLWorkerHelper.getInstance().parseXHtml(writer, document,
        inputStream, null, Charset.defaultCharset(), new MyFont());

    document.close();
    return true;

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return false;
    } catch (DocumentException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } 

मुश्किल समस्या यह है कि iTextPDF XMLWorker लाइब्रेरी का उपयोग करके पीडीएफ में रूसी पत्र प्रदर्शित करना है। इसके लिए हमें FontProvider इंटरफ़ेस का अपना कार्यान्वयन बनाना चाहिए:

public class MyFont implements FontProvider{
    private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";
    private static final String FONT_ALIAS = "my_font";

    public MyFont(){ FontFactory.register(FONT_PATH, FONT_ALIAS); }

    @Override
    public Font getFont(String fontname, String encoding, boolean embedded,
        float size, int style, BaseColor color){

        return FontFactory.getFont(FONT_ALIAS, BaseFont.IDENTITY_H, 
            BaseFont.EMBEDDED, size, style, color);
    }

    @Override
    public boolean isRegistered(String name) { return name.equals( FONT_ALIAS ); }
}

यहां हम मानक Android फ़ॉन्ट Droid Sans का उपयोग करते हैं, जो सिस्टम फ़ोल्डर में स्थित है:

private static final String FONT_PATH = "/system/fonts/DroidSans.ttf";

1
अपने हिस्से के लिए धन्यवाद! मेरा एक प्रश्न है: क्या हम HTML में कोई सीएसएस नियम लागू कर सकते हैं?
फुओंग

6

थोड़ी देर हो चुकी है और मैंने अभी तक इसे स्वयं परीक्षण नहीं किया है, लेकिन एक अन्य पुस्तकालय जो बीएसडी लाइसेंस के तहत है, वह एंड्रॉइड पीडीएफ लेखक है

अद्यतन मैंने स्वयं पुस्तकालय का प्रयास किया है। सरल पीडीएफ पीढ़ियों के साथ ठीक काम करता है (यह पाठ, लाइनों, आयतों, बिटमैप, फोंट को जोड़ने के लिए तरीके प्रदान करता है)। एकमात्र समस्या यह है कि उत्पन्न पीडीएफ को मेमोरी में स्ट्रिंग में संग्रहीत किया जाता है, इससे बड़े दस्तावेज़ों में मेमोरी समस्या हो सकती है।


क्या कोई मुझे बता सकता है कि एंड्रॉइड पीडीएफ लेखक क्या नहीं कर सकता है, जो "इटक्स्ट" कर सकता है?
एम। उस्मान खान

1
बनाए नहीं रखा !! अंतिम अपडेट: २०१५-१२-१४
महदी अलखतीब

2

PDFJet अपनी लाइब्रेरी का एक ओपन-सोर्स संस्करण प्रदान करता है जो किसी भी मूल पीडीएफ पीढ़ी कार्य को संभालने में सक्षम होना चाहिए। यह शुद्ध रूप से जावा-आधारित समाधान है और इसे एंड्रॉइड के साथ संगत कहा जाता है। कुछ अतिरिक्त सुविधाओं के साथ एक व्यावसायिक संस्करण है जो बहुत महंगा नहीं लगता है।


4
कोई और अधिक खुला स्रोत
जोशी फ्रांसिस

0

देर से, लेकिन अनुरोध करने के लिए प्रासंगिक और उम्मीद है कि सहायक। यदि किसी बाहरी सेवा का उपयोग किया जाता है (जैसा कि कॉमन्सवेयर द्वारा उत्तर में सुझाया गया है) तो डोकमोसिस में एक क्लाउड सेवा होती है, जो प्रसंस्करण में मदद कर सकती है - प्रसंस्करण को क्लाउड सेवा में उतारना जो भारी प्रसंस्करण करता है। यह दृष्टिकोण कुछ परिस्थितियों में आदर्श है लेकिन निश्चित रूप से नेट-कनेक्ट होने पर निर्भर करता है।


0

यू भी PoDoFo लाइब्रेरी का उपयोग कर सकते हैं । मुख्य लक्ष्य यह है कि यह एलजीपीएल के तहत प्रकाशित हो। चूंकि यह सी ++ में लिखा गया है, इसलिए आपको इसे एनडीके का उपयोग करके क्रॉस-संकलित करना चाहिए और सी-साइड और जावा आवरण लिखना चाहिए। ओपनसीवी परियोजना से कुछ तृतीय-पक्ष पुस्तकालयों का उपयोग किया जा सकता है । OpenCV प्रोजेक्ट में भी U android.toolchain.cmakeफाइल मिल सकती है , जो आपको जनरेट करने में मदद करेगी Makefile

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.