⑴ 福昕閱讀器怎麼把多張照片轉為pdf
1、安裝福昕PDF閱讀器,安裝時把福昕PDF虛擬列印機勾選上。系統出現福昕PDF虛擬列印。
2、選中要製作PDF文件的圖片。
3、在上步驟游兄選中的圖片中圖標上右擊,彈出快捷菜單。選擇「列印」。彈出「列印圖片對話框」。
4、在彈出「列印圖片對話框」中列印機選擇「Foxit Reader PDF Printer」也就是早鋒福昕PDF虛擬列印機。
5、單擊「列印圖片對話框」中的「列印」神睜襲。
6、在彈出對話框,選擇要保存的目錄,然後單擊」保存「。開始把圖片列印成Pdf格式。
7、打開剛製作的PDF文件,可以看到前面選的5張圖片已經合成1個PDF文件。
⑵ 製作安卓PDF閱讀器:三、實現文本選擇
我為什麼要開啟這個系列,努力試著從源頭開始,用 PDFium 製作一款閱讀器?有人喜歡問這個做了有什麼用,這個是唯一的嗎?
當然不是唯一的,底層技術更不是我的。不過我認為在維護者的推動下,PDFium 越來越完善,功能越來越多,不 真正 拿來做些什麼實在是可惜了。另一個重要原因則是,其他APP要麼臃腫或者簡陋,要麼用著磕手、滑動卡頓、誤觸頻發,而且大多還不免費。( 更正,近年來倒是多了好多免費的PDF閱讀器 )
目標期望:
熱身運動:當檢測到單擊( GestureDetector )時,若點擊處存在超鏈接,則列印出超鏈接的對象。
頭文件:fpdf_doc.h
需要將屏幕坐標轉換為頁面坐標,然後再次在native層轉換為所謂的user space、page space。別問我那是啥我也不知道。不過在論壇提問後,有人替我指出了相關文檔所在,有時間去看看!
屏幕坐標:[event.getX(), event.getY()]
頁面坐標:先前提過將整本PDF當作一張超級大圖,subsampling-scale-imageview 有一系列的 viewToSource 坐標轉換方法。屏幕轉換得到 source 坐標後,減去點擊頁面的左上角坐標,就是頁面坐標。
原始頁面坐標需用 FPDF_DeviceToPage 再次轉換,才能傳給FPDFLink_GetLinkAtPoint,獲取坐標處的鏈接指針。
超鏈接對象統一返回字元串,可以是Uri地址,也可以是頁碼 @頁碼 。
熱身運動2:在單擊處獲取一個英文單詞或者漢語片語,需要用到安卓的 BreakIterator。
頭文件:fpdf_text.h
首先實現 nativeGetCharIndexAtCoord 方法,獲取單擊附近的文字索引,需進行同樣的坐標轉換。
若返回的文字index大於等於零,則此 index 指向該頁面全部文本當中的一個字元。全部文本用 FPDFText_GetText 獲取(實現 nativeGetText):
接下來就可以用 BreakIterator 分詞了:
與繪制PDF本身差不多,不過 bitmap 換成 rect 而已。用到的API依次是FPDFText_CountRects、FPDFText_GetRect。
直接將選框覆蓋繪制在前。若要繪制在後面的背景上,就需要三層透明視圖了,那麼載入鋪塊和縮略圖的時候就要用透明色清空 bitmap,頁面的白色背景等也需要另外繪制(Google PDF Viewer應該就是這樣,還給背景加了陰影)。這些較為復雜,到時候再說。
有個問題可能需要解決:同一行的選框,部分沒有合並。
都是小事兒,暫時不在這上面花時間。
之前做過類似的事情,將普通 TextView 自帶的文本選擇功能禁用了,然後用API自己做出一個來,包括單擊選詞,長按托選,放大鏡等等。所以相關的內容還是熟悉的。
繪制 Selection Handle 可以用 AppCompat 支持庫中的圖標資源:
控點的觸控操作也很簡單,在 Action_Down 中檢測落點是否在其中一個 handle 內。若是,則在 Action_Move 中一邊移動該 handle,一邊檢測新的字元索引,作為文本選擇的新邊界。
由於PDF的復雜性,頁面上的字元索引可能間雜排列,比如頭一段開頭是100,下一段開頭50,再下一段150。這就造成先前簡單的選擇系統「失效」了:
沒什麼解決方案,API 就這么點。而且,靜讀天下、Google PDF 查看器都是這樣的,唯有 ezpdfreader 沒有這個問題。
⑶ 製作安卓PDF閱讀器:七、實現多實例打開、文檔目錄樹
無論什麼平台,任何查看器都理應支持多實例模式。不僅僅要支持多實例模式,還要可以切換到單實例模式,而且在多實例下,在外部App重復打開同一文件,可跳轉至已有實例,而不會重復打開相同的多實例,這便是設計。
為此,需大量運用 static 全局變數。不必擔心內存泄漏,只要不崩潰,就可以在 onDestroy 中釋放引用。若是不慎崩潰,整個虛擬進程都被關閉了,又有什麼可擔心的呢?
從桌面打開主界面有兩種選擇:
主界面UI
底欄:【前進,後退,搜索,書簽大綱,宮格更多】
宮格更多 第二底欄(底欄之上)
宮格:【夜間模式,歷史記錄,書簽,設置,縮略圖模式,轉屏,朗讀,頁面跳轉,進度條,小縮略圖,左側小縮略圖,右側小筆記】
底欄:【退出程序,退離程序,返回】
尼瑪這些慢慢做,夠我做一年……
先從底欄做起吧,然後定製底欄,然後宮格及其變形動畫。
燃鵝時間有限,所以可能取消動畫,取消自定義,速戰速決……
優化 TellH / RecyclerTreeView :
其實 listview 也能達到類似的效果(見下方),不過既然有人(似乎是抖音安卓團隊)專門抽離出了libarary,就不必再造輪子了,改進就行。寥寥二三文件就不必新建庫模塊了,源碼拉直接拉進去,簡單又省事。
目錄對話框:viewpager,並排【書簽,目錄,注釋列表】
Dialog + viewpager + FragmentPagerAdapter + 以上三個Fragment
需注意 FragmentPagerAdapter 的構造參數。應當傳入 getChildFragmentManager() 而不是 getSupportFragmentManager(),否則因為這里是 Dialog 嵌套 Fragment,傳全局的FragmentManager會導致APP崩潰(No view found for id … for fragment … 異常)。
既然決定使用 Dialog 了,不妨直接上 DialogFragment。後者的配置更加靈活,既可以當做 Dialog 彈出對話框,又可以選擇將之當作普通的 Fragment ,直接載入進入主界面布局。
對話框界面設計分三層:
Toolbar【各種小按鈕】
viewpager【書簽,目錄,注釋列表】
TabLayout【書簽,目錄,注釋列表】
拉取PDF目錄,需要用到的API有:FPDFBookmark_GetFirstChild、FPDFBookmark_GetNextSibling、FPDFBookmark_GetTitle、FPDFBookmark_GetDest,沒有編輯功能。
其實 PDF 的書簽目錄除了頁碼外,還可以包含一些視圖參數,大概是縮放、頁面位置這些。既然PDFium不支持編輯書簽,那暫時就這樣。
記錄一下復用這個目錄樹對話窗口引發的recyclerview不響應notifydatasetchanged調用的bug。(解決fragment嵌套viewpager再嵌套recyclerview導致recyclerview無法正常更新的BUG。)
dismiss並復用後,點擊列表中的目錄,目錄不再展開,recyclerview不更新視圖。但是 滾動 一下recyclerview(即使條目很少無法真正滾動,向上劃一下也會有效果。),發現視圖更新了,這證明邏輯處理並無問題。那麼問題出在哪呢?
答案是 viewpager 的adapter不能被復用。關鍵在於這個adapter傳入了一個getChildFragmentManager()對象。而這玩意兒在對話框dismiss後就會立即失效。所以即使視圖是復用的,第二次的onCreateView也需要重新給viewpager設置adapter。