จะสร้าง PDF ในแอพ Android ได้อย่างไร? [ปิด]


147

มีวิธีการสร้างไฟล์ PDF จากแอปพลิเคชัน Android หรือไม่


6
มันจะไม่ดีถ้าโมเดลการถ่ายภาพของ Android ใช้แรงบันดาลใจจาก Qt หรือไม่? Qt ยอมรับว่าการสร้าง PDF หรือ SVG นั้นง่ายเหมือนการเปลี่ยนเส้นทางรหัสเดียวกันที่ใช้ในการวาดบนหน้าจอ ดูที่มาของ QPrinter, QSvgGenerator และ QWidget จาก QPaintDevice สำหรับรูปแบบ
Calaf

1
เหมือนกันใน iOS การสร้าง PDF นั้นมีมาให้แล้ว
Fabian Zeindl

2
ฉันเชื่อว่า Kit Kat มีคุณสมบัติในการสร้าง PDF แต่ฉันไม่รู้ว่าสิ่งนี้สามารถทำงานร่วมกันได้หรือไม่ ฉันได้โพสต์ตัวเลือกด้านล่างและเว็บไซต์ต่อไปนี้จะแสดงตัวเลือกมากมายตั้งแต่โฆษณาไปจนถึงฟรี: stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
ไร้สาระที่นี่ถูกปิดในฐานะ "นอกหัวข้อ"
โจ Coder

2
ทำไมโพสต์นี้ถูกปิด? Stackoverflow เป็นวิธีที่พิถีพิถันเกินไปเกี่ยวกับขอบเขต; คำถามนี้มีจำนวนการดู 175,000 ครั้งเนื่องจากทรัพยากรการเข้ารหัสเว็บไซต์นี้ควรอนุญาตสิ่งที่พบบ่อยมากเช่นนี้กฎต้องแก้ไขเราอ่านทางไกลเกินไปในเนื้อหาที่แท้จริงของสิ่งที่เป็น "นอกหัวข้อ" มากกว่าหัวใจของกฎ ฉันตั้งค่าสถานะเพื่อเปิดใหม่หวังว่าคนอื่นจะลงคะแนนเช่นกัน
Albert Renshaw

คำตอบ:


155

หากใครต้องการสร้าง PDF บนอุปกรณ์ Android นี่คือวิธีการ:


54
ปัญหาเดียวกับ iText คือมันเป็นใบอนุญาต GPLv3 มิฉะนั้นคุณจะต้องซื้อใบอนุญาตเชิงพาณิชย์
Tony Maro

5
และรุ่นก่อนหน้าของ iText มีการอ้างอิงที่ขาดหายไปบางอย่างเช่น java.awt.Color ช Dalvik ไม่สนับสนุน
k-Deux

3
@ kape123 อารมณ์ขันที่ดี :-)
AZ_

10
คำตอบผู้แพ้ทั่วไปของ CommonsWare ... pwned
moonlightcheese

2
ใบอนุญาต commcercial มีค่าใช้จ่ายประมาณ USD 0.50 (0,42 EUR) ต่ออุปกรณ์ Android (11-2013)
Chris623

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 เป็นส่วนหนึ่งของ iOS
lalitm

5
@ Chris623 ฉันคิดว่าคุณหมายถึง "KitKat" ... :)
นักพัฒนา Android

7
@lalitm มันไม่ได้เป็นอย่างที่มันเป็นใน iOS Pdf ที่สร้างขึ้นใน iOS มีข้อความที่สามารถเลือกเขียนได้ใน doc แต่ใน Android มันเป็นภาพ
Kantesh

2
@WillThomson ลิงก์ GitHub ของคุณควรจะเป็นลิงก์นี้หรืออย่างอื่นหรือไม่
jk7

3
ขอบคุณมาก - ลิงค์ที่มีประโยชน์อยู่ที่นี่github.com/IanDarwin/Android-Cookbook-Examples/blob/master/ …
Kibi

27

เคล็ดลับในการสร้าง PDF ด้วยคุณสมบัติที่ซับซ้อนคือการทำกิจกรรมจำลองด้วยเค้าโครง xml ที่ต้องการ จากนั้นคุณสามารถเปิดกิจกรรมจำลองนี้ถ่ายภาพหน้าจอโดยทางโปรแกรมและแปลงภาพนั้นเป็น pdf โดยใช้ห้องสมุดนี้ แน่นอนว่ามีข้อ จำกัด เช่นไม่สามารถเลื่อนได้ไม่เกินหนึ่งหน้า แต่สำหรับแอปพลิเคชั่นที่ จำกัด นี่เป็นวิธีที่ง่ายและรวดเร็ว หวังว่านี่จะช่วยใครซักคน!


2
มันสมควรได้รับอย่างน้อย 1up
ราหุล Rastogi

ทำงานให้ฉัน เป็นการใช้งานที่ง่าย
TharakaNirmana

นั่นเป็นวิธีแก้ปัญหาที่ยอดเยี่ยม
Kumar Saurabh

ความคิดเห็นนี้ชี้ให้ฉันในทิศทางที่ถูกต้อง อย่างไรก็ตาม: 1. คุณไม่จำเป็นต้องเริ่มกิจกรรมเพื่อถ่ายภาพหน้าจอ! คุณก็สามารถขยายรูปแบบ XML ในรันไทม์และแปลงเป็นบิตแมปเช่นแนะนำที่นี่ ; ดังที่ได้กล่าวไว้คุณสามารถสร้างหลาย ๆ หน้าพร้อมกับเลย์เอาต์ที่แตกต่างกัน ไม่รองรับการเลื่อนตามที่กล่าวไว้ แต่คุณสามารถใช้รายการโดยใช้ตัวอย่างเช่นโครงร่างเชิงเส้น
r.pedrosa

11

การหาวิธีการแก้ปัญหาการแปลง HTML เป็น PDF ด้วยตัวอักษรที่ไม่ใช่ภาษาอังกฤษใน Android นั้นไม่ใช่เรื่องง่าย ฉันทดสอบตัวอักษร Unicode ของรัสเซีย

เราใช้ห้องสมุดสามแห่ง:

(1) Jsoup (jsoup-1.7.3.jar) สำหรับการแปลงจาก HTML เป็น XHTML

(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;
    } 

ปัญหาที่ยากคือการแสดงตัวอักษรภาษารัสเซียในรูปแบบ PDF โดยใช้ห้องสมุด 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
ขอบคุณสำหรับการแบ่งปันของคุณ! ฉันมีคำถาม: เราสามารถใช้กฎ CSS กับ HTML ได้ไหม?
Phuong

6

บิตปลายและผมยังไม่ได้ทดสอบมันยังตัวเอง แต่ห้องสมุดที่อยู่ภายใต้อีกใบอนุญาต BSDเป็นAndroid Writer

อัปเดตฉันได้ลองห้องสมุดด้วยตัวเองแล้ว ทำงานได้ดีกับรุ่น PDF ที่เรียบง่าย (มีวิธีการเพิ่มข้อความ, เส้น, สี่เหลี่ยม, บิตแมป, แบบอักษร) ปัญหาเดียวคือ PDF ที่สร้างขึ้นจะถูกเก็บไว้ใน String ในหน่วยความจำซึ่งอาจทำให้เกิดปัญหาหน่วยความจำในเอกสารขนาดใหญ่


ใครช่วยบอกฉันได้ว่า Android PDF Writer ทำอะไรไม่ได้ "itext" ทำได้บ้าง?
M. Usman Khan

1
ไม่ได้รับการดูแล !! อัปเดตครั้งล่าสุด: 2015-12-14
Mahdi Alkhatib

2

PDFJetเสนอไลบรารี่รุ่นโอเพนซอร์ซที่ควรจะสามารถจัดการกับงานสร้าง PDF ขั้นพื้นฐานได้ มันเป็นโซลูชั่นที่ใช้ Java ล้วนๆและได้รับการกล่าวถึงว่าเข้ากันได้กับ Android มีรุ่นเชิงพาณิชย์ที่มีคุณสมบัติเพิ่มเติมบางอย่างที่ดูเหมือนจะไม่แพงเกินไป


4
ไม่มีโอเพ่นซอร์สอีกต่อไป
Joshy Francis

0

ล่าช้า แต่เกี่ยวข้องกับการร้องขอและหวังว่าจะเป็นประโยชน์ หากใช้บริการภายนอก (ตามที่แนะนำในการตอบกลับโดย CommonsWare) Docmosisมีบริการคลาวด์ที่อาจช่วยลดการประมวลผลไปยังบริการคลาวด์ที่ใช้การประมวลผลจำนวนมาก วิธีการนี้เหมาะในบางสถานการณ์ แต่แน่นอนต้องอาศัยการเชื่อมต่อเน็ต


0

คุณสามารถใช้ไลบรารีPoDoFoได้เช่นกัน เป้าหมายหลักคือมันเผยแพร่ภายใต้ LGPL เนื่องจากมันถูกเขียนใน C ++ คุณควรทำการคอมไพล์โดยใช้ NDK และเขียน C-side และ Java wrapper บางไลบรารีของบุคคลที่สามสามารถใช้งานได้จากโครงการOpenCV นอกจากนี้ในโครงการ OpenCV U สามารถค้นหาไฟล์ซึ่งจะช่วยให้คุณกับการสร้างandroid.toolchain.cmakeMakefile

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.