1

Android 印刷フレームワークを使用して PDF ファイルを印刷するための次のコードがあります。

ここに私の PrintDocumentAdapter クラスがあります:

@TargetApi(Build.VERSION_CODES.KITKAT)
public class PrintPDFAdapter extends PrintDocumentAdapter {
    private File pdfFile;
    private String fileName;

    public PrintPDFAdapter(File pdfFile, String fileName) {
        this.pdfFile = pdfFile;
        this.fileName = fileName;
    }


    @Override
    public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) {
        if (cancellationSignal.isCanceled()) {
            callback.onLayoutCancelled();
            return;
        }

        PrintDocumentInfo pdi = new PrintDocumentInfo.Builder(fileName).setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT).build();

        callback.onLayoutFinished(pdi, true);
    }

    @Override
    public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) {
        InputStream input = null;
        OutputStream output = null;

        try {

            input = new FileInputStream(pdfFile);
            output = new FileOutputStream(destination.getFileDescriptor());

            byte[] buf = new byte[1024];
            int bytesRead;

                while ((bytesRead = input.read(buf)) > 0) {
                output.write(buf, 0, bytesRead);
            }

            callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES});

        } catch (FileNotFoundException ee){
            //Catch exception
        } catch (Exception e) {
            //Catch exception
        } finally {
            try {
                input.close();
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

PrintManager 印刷コマンドを呼び出すメソッドは次のとおりです。

@TargetApi(Build.VERSION_CODES.KITKAT)
private void doPDFPrint(File pdfFile, String filename) {
    PrintManager printManager = (PrintManager) this.getSystemService(Context.PRINT_SERVICE);
    String jobName = this.getString(R.string.app_name) + " Report";
    PrintPDFAdapter pda = new PrintPDFAdapter(pdfFile, filename);
    PrintAttributes attrib = new PrintAttributes.Builder().
            setMediaSize(PrintAttributes.MediaSize.NA_LETTER.asLandscape()).
            setMinMargins(PrintAttributes.Margins.NO_MARGINS).
            build();
    printManager.print(jobName, pda, attrib);
}

印刷しようとしている PDF は横向きです。印刷用に送信すると、PDF ファイルが何らかの理由で横に回転し、クリッピングされます。知りたいのですが、これを回避するためにできることはありますか?

更新: テスト印刷を行ったところ、実際に正しく印刷されました。ただし、プレビューでは横に回転しています。

4

1 に答える 1

0

私の場合は、独自の変換を使用しているためであり、変換を提供するときに、ネイティブ レンダラーは PDF ページの属性で指定されたページの回転を適用しません。現在、Android API を介してこの属性を取得する方法がないため、iText を使用しました。

private PdfReader _iTextReader;

...

_iTextReader = new PdfReader(file.getAbsolutePath());

...

// iText uses 1-indexed pages
PdfDictionary iTextPage = _iTextReader.getPageN(pageNumber + 1);
PdfNumber rotate = iTextPage.getAsNumber(PdfName.ROTATE);
if (rotate != null && rotate.intValue() % 360 != 0) {
   // getPageSize returns media box
   float mediaBoxWidth = _iTextReader.getPageSize(pageNumber + 1).getWidth();
   float mediaBoxHeight = _iTextReader.getPageSize(pageNumber + 1).getHeight();
   float iTextCenterX = mediaBoxWidth / 2;
   float iTextCenterY = mediaBoxHeight / 2;
   Util.Log("Applying " + rotate.intValue() + " degree rotation per PDF page attributes.");
   pdfMatrix.postRotate(rotate.intValue(), iTextCenterX, iTextCenterY);
   /*
    * Transform it back to the top-left corner.
    * For the life of me, I do not know why these translations are right. But I've
    * test both portrait->landscape and landscape->portrait on all rotation angles.
    */
   if (rotate.intValue() == 90) {
      pdfMatrix.postTranslate(iTextCenterX - iTextCenterY, iTextCenterX - iTextCenterY);
   } else if (rotate.intValue() == 270) {
      pdfMatrix.postTranslate(3 * iTextCenterY - 3 * iTextCenterX, iTextCenterX - iTextCenterY);
   }
}

ネイティブ PDF レンダラーのソース コードへのリンクは次のとおりです: https://github.com/android/platform_frameworks_base/blob/master/core/jni/android/graphics/pdf/PdfRenderer.cpp

于 2017-01-02T04:04:04.750 に答える