2019年7月24日 星期三

[PDF] Itextsharp PDF翻轉成直式


遇到一份PDF有橫有直

並且合併過程中發現橫的PDF會被切掉

因此要判斷是否為橫的PDF 並轉直在合併

public void Rotate(PdfReader reader, string outMergeFile)
{
    int pageCount = reader.NumberOfPages;
    Document document = new Document();
 
    //MemoryStream outputStream = new MemoryStream();//要把PDF寫到哪個串流
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create));
    document.Open();
    iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
    iTextSharp.text.pdf.PdfImportedPage page;
    int rotation;
    int i = 0;
    while (i < pageCount)
    {
        i++;
        var pageSize = reader.GetPageSizeWithRotation(i);
 
        // Pull in the page from the reader
        page = writer.GetImportedPage(reader, i);
        var pageWidth = pageSize.Width;
        var pageHeight = pageSize.Height;
        // 判斷是否為橫的PDF,並轉置
        if (pageWidth > pageHeight)
        {
            var newPageSize = new Rectangle(pageSize.Height, pageSize.Width, 90);
            writer.DirectContent.AddTemplate(page, 0, -1f, 1f, 0, 0, newPageSize.Height);
        }
        else
        {
            writer.DirectContent.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
        }
    }
    document.Close();
}

[Linq] grouy by + dictinoary

每次想分類然後針對分類做事情

總是忘記...

這裡記錄一下

var g =
    model.GroupBy(o => o.id)
   .ToDictionary(o => o.Key, o => o.ToList());

2019年7月23日 星期二

[C#] 16進位數字組成的字串轉換為Byte[]

將拿到的16進位pdf資料,轉為byte,以利後續處理~

//16進位數字組成的字串轉換為Byte[]
public static byte[] StringToByteArray(string hex)
{
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}


//反向
public static string ByteToHex(this byte[] Bytedata)
{
    return BitConverter.ToString(Bytedata).Replace("-", "");
}

2019年7月12日 星期五

[PDF] 新增頁碼、取得PDF頁數 (itextsharp)


PDF加入頁碼有查到兩種方式

一種是繼承PdfPageEventHelper,然後再override OnEndPage 加入頁碼

另一種則是類似用加入浮水印方式用PdfStamper來加入頁碼

個人採用後者,主要用在已經產生好的PDF上


public static void AddPageNumber(string fileIn, string fileOut)
{
    byte[] bytes = File.ReadAllBytes(fileIn);
    Font blackFont = FontFactory.GetFont("Arial", 10, Font.NORMAL, BaseColor.BLACK);
    using (MemoryStream stream = new MemoryStream())
    {
        PdfReader reader = new PdfReader(bytes);
        using (PdfStamper stamper = new PdfStamper(reader, stream))
        {
            int pages = reader.NumberOfPages;
            for (int i = 1; i <= pages; i++)
            {
                ColumnText.ShowTextAligned(stamper.GetUnderContent(i), Element.ALIGN_RIGHT, new Phrase(i.ToString(), blackFont), 568f, 15f, 0);
            }
        }
        bytes = stream.ToArray();
    }
    File.WriteAllBytes(fileOut, bytes);
}


最後附上查詢頁碼Code

//查詢PDF頁碼
string ppath = rootpath + "XXX.pdf";
PdfReader pdfReader = new PdfReader(ppath);
int numberOfPages = pdfReader.NumberOfPages;
Console.WriteLine(numberOfPages);
Console.ReadLine();

2019年7月10日 星期三

[pdf] 合併多筆PDF


itextsharp 合併多筆pdf

參考

2019年7月8日 星期一

[HTML] canvas手寫板範例

連結 

直接把內容html下載下來, 用瀏覽器開啟即可

簡單來說,就是分兩頁畫布, 可以手寫清除這樣

儲存是沒有功能的,因為沒有實際接API


2019年7月4日 星期四

[HTML] 多個Canvas合併為一個Canvas

多個canvas合併為一個

要先建立一個新的canvas 來畫出要合併的三個canvas

//三張圖合併一張圖
var canvas1 = document.querySelectorAll('Canvas')[0];
var canvas2 = document.querySelectorAll('Canvas')[1];
var canvas3 = document.querySelectorAll('Canvas')[2];
var canvas = document.getElementById("finalCanvas");
canvas.height = canvas1.clientHeight + canvas2.height + canvas3.height;
canvas.width = canvas1.width;
var domContext = canvas.getContext('2d');

domContext.drawImage(canvas3, 0, canvas1.height + canvas2.height);
domContext.drawImage(canvas2, 0, canvas1.height );
domContext.drawImage(canvas1, 0, 0);
 
var dataURL = canvas.toDataURL();   //get base64 img

2019年7月3日 星期三

[JS] 新頁面關閉束後回傳值給舊頁面 (window opener)

遇到一個狀況是原本頁面新開一個頁面

新頁面處理完後關掉並回傳一些內容給原本頁面

先在原本頁面 :

//新開視窗
newwindow = window.open("/newpage");
//新視窗關閉事件
newwindow.onbeforeunload = function () {
    var val = document.getElementById('textfield').value
    
}

然後在新頁面加上

window.opener.document.getElementById('textfield').value ='test';
window.close();

如此在新頁面結束時,就會把值'test' 傳回原先頁面的textfield欄位囉


ps.如果遇到要在平板上使用可以參考以下
https://stackoverflow.com/questions/32639654/window-opener-with-a-custom-function-does-not-work-in-safari/32640630#32640630