มีวิธีการสร้างไฟล์ PDF จากแอปพลิเคชัน Android หรือไม่
มีวิธีการสร้างไฟล์ PDF จากแอปพลิเคชัน Android หรือไม่
คำตอบ:
หากใครต้องการสร้าง PDF บนอุปกรณ์ Android นี่คือวิธีการ:
หากคุณกำลังพัฒนาอุปกรณ์ที่มีระดับ 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();
เคล็ดลับในการสร้าง PDF ด้วยคุณสมบัติที่ซับซ้อนคือการทำกิจกรรมจำลองด้วยเค้าโครง xml ที่ต้องการ จากนั้นคุณสามารถเปิดกิจกรรมจำลองนี้ถ่ายภาพหน้าจอโดยทางโปรแกรมและแปลงภาพนั้นเป็น pdf โดยใช้ห้องสมุดนี้ แน่นอนว่ามีข้อ จำกัด เช่นไม่สามารถเลื่อนได้ไม่เกินหนึ่งหน้า แต่สำหรับแอปพลิเคชั่นที่ จำกัด นี่เป็นวิธีที่ง่ายและรวดเร็ว หวังว่านี่จะช่วยใครซักคน!
การหาวิธีการแก้ปัญหาการแปลง 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";
บิตปลายและผมยังไม่ได้ทดสอบมันยังตัวเอง แต่ห้องสมุดที่อยู่ภายใต้อีกใบอนุญาต BSDเป็นAndroid Writer
อัปเดตฉันได้ลองห้องสมุดด้วยตัวเองแล้ว ทำงานได้ดีกับรุ่น PDF ที่เรียบง่าย (มีวิธีการเพิ่มข้อความ, เส้น, สี่เหลี่ยม, บิตแมป, แบบอักษร) ปัญหาเดียวคือ PDF ที่สร้างขึ้นจะถูกเก็บไว้ใน String ในหน่วยความจำซึ่งอาจทำให้เกิดปัญหาหน่วยความจำในเอกสารขนาดใหญ่
PDFJetเสนอไลบรารี่รุ่นโอเพนซอร์ซที่ควรจะสามารถจัดการกับงานสร้าง PDF ขั้นพื้นฐานได้ มันเป็นโซลูชั่นที่ใช้ Java ล้วนๆและได้รับการกล่าวถึงว่าเข้ากันได้กับ Android มีรุ่นเชิงพาณิชย์ที่มีคุณสมบัติเพิ่มเติมบางอย่างที่ดูเหมือนจะไม่แพงเกินไป
ล่าช้า แต่เกี่ยวข้องกับการร้องขอและหวังว่าจะเป็นประโยชน์ หากใช้บริการภายนอก (ตามที่แนะนำในการตอบกลับโดย CommonsWare) Docmosisมีบริการคลาวด์ที่อาจช่วยลดการประมวลผลไปยังบริการคลาวด์ที่ใช้การประมวลผลจำนวนมาก วิธีการนี้เหมาะในบางสถานการณ์ แต่แน่นอนต้องอาศัยการเชื่อมต่อเน็ต
คุณสามารถใช้ไลบรารีPoDoFoได้เช่นกัน เป้าหมายหลักคือมันเผยแพร่ภายใต้ LGPL เนื่องจากมันถูกเขียนใน C ++ คุณควรทำการคอมไพล์โดยใช้ NDK และเขียน C-side และ Java wrapper บางไลบรารีของบุคคลที่สามสามารถใช้งานได้จากโครงการOpenCV นอกจากนี้ในโครงการ OpenCV U สามารถค้นหาไฟล์ซึ่งจะช่วยให้คุณกับการสร้างandroid.toolchain.cmake
Makefile