Android 앱에서 PDF를 만드는 방법은 무엇입니까? [닫은]


147

Android 애플리케이션에서 PDF 파일을 작성하는 방법이 있습니까?


6
Android의 이미징 모델이 Qt의 영감을 얻은 것이 좋지 않습니까? Qt는 PDF 또는 SVG 생성이 화면에 그리는 데 사용하는 것과 동일한 코드를 리디렉션하는 것만 큼 간단 할 수 있다는 것을 확립했습니다. 패턴에 대해서는 QPaintDevice에서 QPrinter, QSvgGenerator 및 QWidget의 파생을보십시오.
Calaf

1
iOS에서 동일합니다. PDF 생성 기능이 내장되어 있습니다.
Fabian Zeindl

2
Kit Kat에는 PDF 생성 기능이 있다고 생각하지만 이전 버전과 호환되는지 모르겠습니다. 아래에 옵션을 게시했으며 다음 사이트에는 상업용에서 무료까지 다양한 옵션이 나와 있습니다. stefan.fenz.at/creating-pdfs-on-android-an-evaluation
IcedDante

5
이것이 "비 주제"로 폐쇄되었다는 것은 우스운 일입니다.
Joe Coder

2
이 게시물이 왜 닫혔습니까? Stackoverflow는 그 범위에서 너무 까다 롭습니다. 이 질문에는 175,000 개의 견해가 있습니다.이 사이트는 코딩 리소스로서이 사이트에서 이와 같은 매우 일반적인 것들을 허용해야하며, 규칙을 수정해야합니다. 나는 다시 열기 위해 깃발을 썼다. 다른 사람들도 투표하기를 바란다.
Albert Renshaw

답변:


155

누구나 Android 기기에서 PDF를 생성하려면 다음과 같이하십시오.


54
iText의 유일한 문제는 GPLv3 라이센스이거나 상용 라이센스를 구입해야한다는 것입니다.
Tony Maro

5
이전 버전의 iText에는 java.awt.Color와 같은 일부 누락 된 종속성이 있습니다. dalvik은 지원하지 않습니다
k-deux

3
@ kape123 유머 감각 :-)
AZ_

10
CommonsWare 일반 패배자 답변 ...
moonlightcheese

2
상용 라이센스 비용은 Android 기기 당 약 USD 0.50 (0,42 EUR)입니다. (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
마지막으로 iOS의 일부인 Android의 일부입니다.
lalitm

5
@ Chris623 "KitKat"을 의미한다고 생각합니다 ... :)
안드로이드 개발자

7
@lalitm 그것은 ios가 아닙니다. iOS에서 생성 된 PDF에는 문서로 작성된 선택 가능한 텍스트가 있습니다. 그러나 안드로이드에서는 이미지입니다.
Kantesh

2
@WillThomson 당신의 GitHub 링크가 이것 또는 다른 것으로되어 있었습니까 ?
jk7

3
정말 감사합니다-유용한 링크는 여기 github.com/IanDarwin/Android-Cookbook-Examples/blob/master/…
Kibi

27

복잡한 기능으로 PDF를 작성하는 요령은 원하는 XML 레이아웃으로 더미 활동을하는 것입니다. 그런 다음이 더미 활동을 열고 프로그래밍 방식 으로 스크린 샷 을 찍고이 라이브러리를 사용하여 해당 이미지를 pdf로 변환 할 수 있습니다 . 물론 두 페이지 이상 스크롤 할 수없는 것과 같은 제한이 있지만 제한된 응용 프로그램의 경우 빠르고 쉽습니다. 이것이 누군가를 돕기를 바랍니다!


2
그것은 적어도 1up 가치가 있었다.
Rahul Rastogi 2016 년

나를 위해 일했다. 간단한 구현이었습니다.
TharakaNirmana

그것은 멋진 해결책입니다
Kumar Saurabh

이 의견은 올바른 방향으로 나를 가리 킵니다. 그러나 : 1. 스크린 샷을 찍기 위해 활동을 시작할 필요는 없습니다! 런타임에 xml 레이아웃을 팽창시키고 여기에 제안 된 것과 같이 비트 맵으로 변환 할 수 있습니다 . 즉, 레이아웃이 다른 여러 페이지를 생성 할 수 있습니다. 스크롤은 말한대로 지원되지 않지만 선형 레이아웃과 같은 목록을 구현할 수 있습니다.
r.pedrosa

11

안드로이드에서 영어가 아닌 문자로 임의의 HTML을 PDF로 변환하는 문제에 대한 완전한 해결책을 찾는 것은 쉽지 않습니다. 러시아어 유니 코드 문자로 테스트합니다.

우리는 세 개의 라이브러리를 사용합니다 :

(1) Jsoup HTML에서 XHTML 로의 변환을위한 (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 라이브러리를 사용하여 러시아어 문자를 PDF로 표시하는 것입니다. 이를 위해 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에 CSS 규칙을 적용 할 수 있습니까?
Phuong

6

조금 늦었고 아직 직접 테스트하지는 않았지만 BSD 라이센스 가 적용 되는 다른 라이브러리 는 Android PDF Writer 입니다.

업데이트 라이브러리를 직접 시도했습니다. 간단한 pdf 생성 (텍스트, 선, 사각형, 비트 맵, 글꼴을 추가하는 방법을 제공)과 함께 작동합니다. 유일한 문제는 생성 된 PDF가 메모리의 문자열에 저장되어 큰 문서에서 메모리 문제가 발생할 수 있다는 것입니다.


누구나 "itext"가 할 수없는 Android PDF Writer의 기능을 말해 줄 수 있습니까?
M. Usman Khan

1
유지되지 않습니다 !! 마지막 업데이트 : 2015-12-14
Mahdi Alkhatib

2

PDFJet 은 기본적인 PDF 생성 작업을 처리 할 수있는 오픈 소스 버전의 라이브러리를 제공합니다. 순수한 Java 기반 솔루션이며 Android와 호환되는 것으로 명시되어 있습니다. 너무 비싸지 않은 일부 추가 기능이 포함 된 상용 버전이 있습니다.


4
더 이상 오픈 소스가 없습니다
Joshy Francis

0

늦었지만 요청과 관련이 있고 희망적으로 도움이됩니다. 외부 서비스를 사용하는 경우 (CommonsWare의 답변에서 제안한대로) Docmosis 에는 처리량 이 많은 클라우드 서비스로 처리를 오프로드하는 데 도움이되는 클라우드 서비스가 있습니다. 이러한 접근 방식은 일부 상황에서 이상적이지만 물론 네트워크 연결에 의존합니다.


0

U는 또한 PoDoFo 라이브러리를 사용할 수 있습니다 . 주요 목표는 그것이 LGPL에 의해 출판되는 것입니다. C ++로 작성되었으므로 NDK를 사용하여 크로스 컴파일하고 C 측 및 Java 랩퍼를 작성해야합니다. 일부 타사 라이브러리는 OpenCV 프로젝트 에서 사용할 수 있습니다 . 또한 OpenCV 프로젝트에서 U는 android.toolchain.cmake파일 생성을 도와줍니다 Makefile.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.