Hoe maak je PDF’s in een Android-app?

Is er een manier om PDF-bestanden te maken vanuit een Android-applicatie?


Antwoord 1, autoriteit 100%

Als iemand pdf’s op een Android-apparaat wil genereren, gaat u als volgt te werk:


Antwoord 2, autoriteit 69%

Als u ontwikkelt voor apparaten met API-niveau 19 of hoger, kunt u het ingebouwde PrintedPdfDocument gebruiken: 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();

Antwoord 3, autoriteit 20%

Een truc om een ​​PDF met complexe functies te maken, is om een ​​dummy-activiteit te maken met de gewenste xml-lay-out. Je kunt dan deze dummy-activiteit openen, een programmatische screenshot makenen converteer die afbeelding naar pdf met behulp van deze bibliotheek. Natuurlijk zijn er beperkingen zoals het niet kunnen scrollen, niet meer dan één pagina, maar voor een beperkte toepassing is dit snel en eenvoudig. Ik hoop dat dit iemand helpt!


Antwoord 4, autoriteit 7%

Het is niet eenvoudig om een ​​volledige oplossing te vinden voor het probleem van het omzetten van een willekeurige HTML naar PDF met niet-Engelse letters in Android. Ik test het op Russische Unicode-letters.

We gebruiken drie bibliotheken:

(1) Jsoup(jsoup-1.7.3.jar) voor een conversie van HTML naar 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;
    } 

Het moeilijke probleem is om Russische letters in PDF weer te geven met behulp van de iTextPDF XMLWorker-bibliotheek. Hiervoor moeten we onze eigen implementatie van de FontProvider-interface maken:

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

Hier gebruiken we het standaard Android-lettertype Droid Sans, dat zich in de systeemmap bevindt:

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

Antwoord 5, autoriteit 4%

Een beetje laat en ik heb het zelf nog niet getest, maar een andere bibliotheek die onder de BSD-licentie valt is Android PDF Writer.

UpdateIk heb de bibliotheek zelf geprobeerd. Werkt goed met eenvoudige pdf-generaties (het biedt methoden voor het toevoegen van tekst, lijnen, rechthoeken, bitmaps, lettertypen). Het enige probleem is dat de gegenereerde PDF wordt opgeslagen in een String in het geheugen, dit kan geheugenproblemen veroorzaken in grote documenten.


Antwoord 6

PDFJetbiedt een open-sourceversie van hun bibliotheek die elke eenvoudige PDF zou moeten kunnen verwerken generatie taak. Het is een puur op Java gebaseerde oplossing en er wordt gezegd dat het compatibel is met Android. Er is een commerciële versie met enkele extra functies die niet al te duur lijken.


Antwoord 7

Laat, maar relevant om te vragen en hopelijk nuttig. Als u een externe service gebruikt (zoals gesuggereerd in het antwoord van CommonsWare), heeft Docmosiseen cloudservice die kan helpen – offloading verwerking naar een cloudservice die de zware verwerking doet. Die aanpak is in sommige omstandigheden ideaal, maar is natuurlijk afhankelijk van een internetverbinding.


Antwoord 8

U kunt ook de PoDoFo-bibliotheek gebruiken. Het belangrijkste doel is dat het onder LGPL wordt gepubliceerd. Omdat het in C++ is geschreven, moet je het cross-compileren met NDK en C-side en Java-wrapper schrijven. Sommige bibliotheken van derden kunnen worden gebruikt vanuit het OpenCV-project. Ook in OpenCV-project kunt U het bestand android.toolchain.cmakevinden, dat u zal helpen bij het genereren van Makefile.

Other episodes