반응형

asp.net2.0을 사용하고 있다면 부족한 기능에 좌절하는 경우가 종종있다.

특히 그래프 기능인데 2.0에서 사용할 수 있는 그래프가 많지 않다. OpenFlashChart를 사용했다가

일부 기능에 문제가 있어서 대체가능한 그래프를 찾느라 아주 애먹은 적이 있는데 우연히 Zed를 찾아서 

활용할 수 있었다.


ZedGraphTest.zip


첨부한 파일은 ZedGraph의 간단한 활용 소스이다. \bin폴더안에 ZedGraph.dll파일이 포함되어 있으니 이를 활용하면 된다.

셈플소스를 보면 간단하게나마 구조를 파악할 수 있으니 활용해보자.

반응형

MS Office Interop를 이용해서 개발한 Windows Service가 정상적으로 작동하지 않을 때..

환경 : Microsoft Office 2010, Visual Studio 2010, Windows 7, Windows 2008 Server
개요 : MS Office 2010 Interop (14version)을 이용해서 Powerpoint, Word, Excel 파일을
PDF로 변환하는 Windows Service Program을 개발하여 포팅하였으나 Program이 정상적으로 구동되지 않았다.
증상
1. 변환 프로그램을 개발하는 Visual Studio 2010에서 Test Program인 Console Application으로 작동을 시켜보면 정상적으로 Program이 기동되었다.
2. 1의 테스트를 확인하고 Windows Service로 배포하는 프로젝트를 생성하여 정상적으로 Windows Service에등록이 된 것을 확인하고, 구동을 시켜보니 정상적으로 작동하지 않았다.
3. Program에서 작동하는 로그을 확인해 보니, 
"개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라는 메세지와
"'C:\temp\document\7.xlsx' 파일을 사용할 수 없습니다. 원인은 다음과 같습니다
해당 파일 이름이나 경로가 없습니다. 다른 프로그램에서 파일을 사용하고 있습니다.저장하려고 하는 통합 문서 이름이 현재 열려 있는 통합 문서의 이름과 같습니다."라는 메세지가 표시되었다.
4. Excel -> PDF, PPT -> PDF, Word -> PDF 모듈이 작동하지 않았다.
원인 분석
Windows 7, Vista, Windows Server 2008에서 Windows Service는 Session0라고 불리는 session (or something)에서 구동이 된다. Session0는 Desktop에서 구동되는 프로그램에 접근이 불가능한 영역(Desktop-less wasteland)인데 개발된 Windows Service는 Desktop Session에서 구동되는(Desktop-ed session) Office Program인 관계로 Windows Service가 정상적으로 작동되지 않았던 것이다.
(참고 URL : http://stackoverflow.com/questions/241190/vista-office-interop-not-working)
처리 방안
1. 첫 번째 처리 내용 : System Profile을 위한 desktop folder를 생성한다.
이 방법은 msdn에서 확인한 방법으로서 H.Ogawa가 제시한 방법이다
http://social.msdn.microsoft.com/Forums/en/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91

아래의 경로에서 볼 수 있듯이 systemprofile이라는 폴더에 Desktop이라는 폴더를 만들고 해당 폴더 권한에 Everyone을 추가하고 모든 권한을 주면 된다.

c:\Windows\SysWOW64\config\systemprofile\Desktop, or
c:\Windows\System32\config\systemprofile\Desktop

개발된 Windows Service 프로그램이 64bit로 빌드하였으면 SysWOW64에 Desktop을 등록하고 그렇지 않으면 System32에 등록하면 된다.

=> 처리 후 테스트 결과 : Excel, Word는 모두 정상적으로 작동을 하였으나 Powerpoint는 여전히 동작하지 않았다. 그래서 아래의 처리 방식을 추가로 처리하였다.

2. 두 번째 처리 내용 : 1의 방법에도 여전히 Powerpoint가 구동되지 않았다.
Powerpoint가 구동되기 위해서는 User Profile 정보가 필요한데 Windows Service로 구동을 하다 보니 충분한 User Profile 정보를 가져올 수 없어서 에러가 발생했던 것이다. (참고 URL : http://stackoverflow.com/questions/729609/powerpoint-interop-fails-in-a-windows-service-but-works-fine-in-a-windows-form-a)

이에 대한 처리를 위해서, Windows Service에 등록되어 있는 Program의 속성 창에서 "로그온(Logon)" Tab을 클릭하여 "서비스와 데스크톱 상호 작용 허용"을 선택하면 Powerpoint도 이상 없이 구동된다.


3. 추가 사항 : 1과 2의 방식을 통해서 Windows Service가 정상적으로 구동이 되었더니 다음과 같은 화면이 자꾸 표시되는 현상이 발생을 하였다.


Windows Service가 구동되는 Session0에서 Word, Powerpoint등의 프로그램이 메세지를 발생시켜서 위의 화면이 표시되는 것으로 추측이 되었다.

위의 메세지를 발생시키는 것은 다른 Windows Service에 의한 것으로서 Service 이름은 "Interactive Services Detection"이다. 해당 서비스는 "대화형 서비스에 대한 사용자 입력의 사용자 알림을 사용할 수 있도록 하는 서비스"로서 해당 서비스를 사용하지 않도록 Service 설정을 하면(사용안함으로 설정)된다.



출처 : http://kevinlovesu.blogspot.kr/2012/08/ms-office-interop-windows-service.html#comment-form








반응형

먼저 사양...

사양출처 : http://www.nowntv.com/news/read.php?num=48483


보시다 시피 아톰듀얼코어의 조악한 하드웨어의 제품입니다.

기존에 홈서버로 사용한던 HP t5730이 어머니께서 전원을 예고없이 뽑아버리는 사태로 인하여 운명하시는 바람에

대체할 pc를 알아보던 중에 우연히 발견했습니다.


키보드 일체형의 특이한 컨셉의 pc로 2,3주간 사용했습니다.




외형은 보시는 바와 같습니다. 뭐... 키보드가 일체형이라는 특이함을 제외하면 그냥 평이합니다.


윈도우7을 설치해서 사용하고 있는데 성능평가는 보시는 바와 같습니다.

네, 성능은 아톰을 사용한 만큼이고 그이상을 기대하기는 어려운 수준이죠. 그저 복잡한 기능을 사용치 않고 간단한 용도로

사용하기에 적합합니다. 간단한 웹서핑 동영상 재생 등등이 가능합니다.

당연히 고성능은 고사하고 중간정도의 최신게임을 진행하는데도 무리가 있죠.


구입가격은 25만원정도였습니다.


장점 : 1. 공간을 적게 차지한다.

         2. 상대적으로 저전력

         3. 무선랜이 탑재되어 있다.


단점 : 1. 성능이 낮다.(게임,동영상 재생에 어려움이 많다)

         2. 넷북정도의 성능인데다 베터리가 없어서 데스크탑으로만 사용가능하다.

         3. 모니터는 별도 ^^


이정도가 되겠네요.

처음부터 특성을 알고 구입했기 때문에 단점들은 저에게 그다지 문제가 되지 않습니다.

전반적으로 노트북과 데스크탑의 중간형태의 제품인 것 같네요.


홈서버로 사용하는 pc다 보니 직접 붙어서 사용하기 보다는 파일공유 토렌트용도로 사용하다보니 저에게는

충분하고 만족스러웠습니다.

반응형


function IE_Ver()

{

    if(navigator.appName.match(/Explorer/i))

    {

        return navigator.appVersion.match(/MSIE \d+.\d+/)[0].split(" ")[1];

    }

    else return 0;

}


function getInternetExplorerVersion() {

var rv = -1;

if (navigator.appName == 'Microsoft Internet Explorer') {

var ua = navigator.userAgent;

var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");

if (re.exec(ua) != null)

rv = parseFloat(RegExp.$1);

}

return rv;


위 두가지가 있다. 비슷비슷한놈이다.

위의 놈은 익스버전을 6.0,7.0과같은 형태로 반환하고 익스가 아닌브라우저는 0로 반환한다.

아랫놈은 익스버전을 6,7,8과 같은 형태로 반환하고 익스가 아닌 브라우저는 -1로 반환한다.

반응형


        string _xml = "";

        _xml += "<response>";

        _xml += "    <data>false</data>";

        _xml += "</response>";


        MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(_xml));

        XmlDocument xmldoc = new XmlDocument();

        try

        {

            xmldoc.Load(ms);

        }

        catch

        {

            ms.Close();

        }

        XmlElement root = xmldoc.DocumentElement;

        if (root.Name == "response")

        {

            XmlNodeList nodes = root.ChildNodes;

            nodes[0].InnerText;

        }


        ms.Close();

        ms.Dispose();


출처,참조 : http://ldaehyeon.tistory.com/5

---------------------------------------------------------------

xml형태로 작성된 String을 Xml객체로 전환하는 방법이다.

asp.net에서 jsp쪽으로 Return을 요구하는 질의를 날렸는데 xml형태로 되돌아온다.

여기에서 필요한 값은 <data></data>이기 때문에 string형태로 데이터를 가공하려하면 답이 없다.

차라리 XmlDocument로 변환해서 필요한 값만 읽어오는게 더 빠르다.

반응형

진짜 간단한건데 이렇게 기억이 나지 않을때가 있다.


document.getElementById('RadioID').checked;

다른 예제를 찾아보면 class나 name으로 지정하는 방법은 많지만 id로 지정하는 방법은 유독나와있지 않은 데다가

jQuery로는 더 찾기 힘들다. 귀찮아서 그냥 자바스크립트로 처리한 경우다.

반응형

버전 3.4.1 다운로드

FileDownloader3.4.1.zip
1.24MB

 

 

문제해결(2024.06.22)

MS에 요청하여 해당 문제를 해결했습니다.

 

문제알림(2024.06.22)

윈도우디펜더에서 Trojan:Win32/Bearfoos.A!ml 으로 차단하는 현상을 발견했습니다.

해결방안을 찾아보겠습니다.

코드가 기존과 크게 변한게 없는데 차단이 뜨니 당황스럽습니다.

 

버그수정 3.4.1(2024.06.20)

 

첨부파일이 999개만 다운로드 돼던 버그를 해결했습니다.

 

(과거내용 더읽기)

개선-버전3.4(2023.07.23)

티스토리 다운로드 불가 현상 해결 했습니다. 

향후 티스토리에서 추가 차단할 수 있습니다.

 

※ 오류 안내 (2023.07.20)

2023-07-20 현재 티스토리에서 프로그램을 사용시 "자동 리디렉션을 너무 많이 시도했습니다."라는 에러가 나옵니다.

2023-07-23~2023-07-24일간 원인 분석 예정입니다.

 

개선-버전3.3(2022.11.07)

1. 티스토리 파일 다운로드 방식 변경에 대응

※ 3.3버전만 변경된 방식에 대응, 2.12버전은 대응 없음

 

개선-버전3.2(2022.07.03)

 

1. 사이트 주소 더블클릭 시 클립보드의 주소 붙여넣기 기능 추가

2. 완료 후 폴더열기 옵션 추가

3. 화면상단의 블로그 주소, 언어설정기능을 화면 중간으로 이동

개선-버전3.1(2022.07.01)

1. 기본 저장경로를 "D:/Down"에서 사용자 Download폴더로 변경했습니다.

2. 티스토리에서 파일을 불러올때 일부 파일명의 첫번째 이름이 생략되는 버그를 수정했습니다.

3. 다운로드 에러서 메세지 창이 나오던 것을 없앴습니다.

     - 다운로드 에러는 결과에 나옵니다.

 

프로그램개선-버전3(2022.05.03)

기능을 추가한 버전3를 만들었습니다.

기능개선사항은 

1. 자잘한 버그를 수정했습니다.

    - 파일 저장 시 쓸데없는 공백문자가 생기는 버그

    - 불러오기 실행 시 불필요한 불명확 파일까지 가져오던 내용 수정

2. 디자인을 변경했습니다.

3. 선택기능 버튼을 하나로 통합했습니다.

     - 전체선택, 전체취소, 영역선택, 영역취소 => 전체선택

4. 일괄다운로드 속도 개선

     - 기존 파일을 순차적으로 하나씩 하나씩 다운 받음 => 동시에 여러파일을 다운받음

5. 광고를 넣었습니다.

6. 한/영 전환기능을 넣었습니다. (그냥 재미삼아 해봤습니다.)

속도 관련해서 비교 해보니 200개의 파일을 다운받았을때 속도를 비교해 보니 두배가까이 납니다.

기존프로그램은 4분24초 걸리던 것이 개선된 버전은 2분16초 정도로 속도가 확연히 빨라진 것을 알 수 있습니다.

다운로드 파일은 광고가 불편할 수도 있으니 버전2.12와 버전3을 둘다 남겨 놓았습니다. 

취향대로 사용하시면 되겠습니다.

 

 

개선-V2.12(2020.05.28)

 

 

첨부한 사진처럼 첨부파일이 특정 태그로 묶여 있으면 다운로드가 안될 수 있어서 해결했다.

추후 티스토리가 태그를 바꾸면 이프로그램도 추가 변경이 필요하다.

기존내용

기존내용

 

2020.05.28 v2.12로 변경

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

설명추가(2020.03.04)

 

중요한 설명이 누락돼있어서 추가(2020.03.04)

이프로그램은 티스토리나 일반홈페이지에 사용가능하지만 네이버블로그를 비롯한 다운로드를 자바스크립트로 처리하는 사이트/블로그는 지원하지 않습니다.

티스토리 블로그첨부파일도 일부지원하지 않는경우가 있는데 <a><a/>태그 중간에 다른 태그들이 포함되있으면 처리가 안됩니다.

네이버블로그 첨부파일 다운로드 프로그램은 유사한 프로그램을 제작하신 분이 계시므로 [https://k66google.tistory.com/571(링크)] 해당 프로그램을 

이용하시면 됩니다.

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

버그개선-V2.11(2020.02.04)

 

몇가지 버그가 보여서 개선했다.

 

1. 다운로드 완료 후 일부 파일을 다시 다운받을때 나오는 에러메세지 수정

2. 다운로드 완료 후 일부 파일을 다시 다운받을때 퍼센트 표시 에러 수정

3. 텍스트 입력창에서 엔터키를 입력할 경우 다음텍스트 입력창으로 이동

    파일필터링 입력창에서 엔터키 입력 시 [불러오기]실행

4. 하단의 블로그 주소 클릭시 이게시글로 연결(향후 업데이트를 위해)

 

2020.02.04에 v2.11로 변경

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

프로그램개선-V2.1(2020.01.15)

 

 

 

프로그램을 조금 개선했다.

부족한 프로그램이지만 어쨌거나 찾아주시는 분들도 있고...

프로그램의 불편함이 분명히 있었을 탠데 아무런 피드백없고해서 늘그랬듯이 내편한 대로 개선했다.

2.0에서 크게 변한 것은 없고 자잘한 버그와 몇가지 편리 기능을 추가했다.

바뀐점은 다음과 같다

 

1. 화면에 결과값이 나오도록 변경했다. 다운로드 받고 성공할 경우 결과항목에 표기가 되고  최종 다운로드후에 성공한 항목들은

   선택이 풀리고 실패한 항목만 선택이 그대로 남아서 실패한 항목만 다시 다운로드 받을 수 있도록했다.

2. 버튼 배치를 살짝 바꿧다. 화면캡쳐 스샷이 남아 있으니 비교하면 된다.

3. 다운받을폴더를 저장하도록했다. 내문서 폴더에 setting.conf파일을 생성해서 마지막 작업한 경로를 저장한다.

   프로그램을 다시실행하면 저장한 경로를 불러오도록했다. 만약 setting.conf파일이 없을경우 d:/Down폴더로 설정된다.

4. 프로그램상단에 버전이 표시되도록했다.

5. 프로그램 제작자의 블로그 주소를 프로그램에 추가했다. 클릭하면 이블로그로 연결된다.

 

2020.01.15에 v2.1로 변경

------------------------------------------------------------------------------------------------------------------------------------------------------------------
 

프로그램개선-V2.0(2014.03.12)

 

 

시간이 조금 생긴 김에 과거에 만들었던 분할 파일 다운로더를 크게 개선했다.

아예 새로만들었으니까...

과거버전은 블로그에서 받을 수 있는 파일형태(7zip,Rar,Alzip)를 지정하거나 받을 파일이 몇개인지 지정해야했었다.

이것을 그런것과는 상관없이 다운로드 받을 수 있도록 변경했다. 몇개인지 지정할 필요도 없다.

단지 블로그혹은 홈페이지 주소만 적어주면 된다.

 

물론 이프로그램은 <a></a>태그를 이용한 방식이라서 다운로드가 불명확할 수 있다.

그러니까 실제로는 다운로드 받을 파일이 아니라 다른사이트링크등을 싸그리 파일명으로 인식할 수 있다는 이야기이다.

그래서 파일필터링이라는 택스트박스를 만들어 뒀다. 분할압축된 파일들은 대부분 동일한 형태의 이름을 가지고있다.

첨부된 사진에는 프린세스 퀘스트 R이라는 게임이며 프린세스 퀘스트 R.7z.001~프린세스 퀘스트 R.7z.100

의형태로 분할되어 블로그에 업로드 돼있다. (사이트 경로는 혹시나 해서 모자이크 처리했다.)

 

그래서 반복되는 분할 파일명들의 일부를 적어주면 된다. 다시말해 위예저의 경우 프린세스 퀘스트 R.7z.까지는 모든분할

파일의 이름이 동일하므로 프린세스 퀘스트 R.7z.까지 적어주면 분할 파일을 블로그에서 인식하는데 도움이 된다는

이야기이다. (물론 프린세스 퀘스트 R.까지만 적어도 된다.)

 

그리고 받을 파일들의 목록을 하단에 표시하도록 했다. 사용자가 원하는 목록을 선택할 수 있으며

전체선택/취소를 클릭해서 선택 여부를 일괄로 변경할 수 있다.

참고로 다운로드 버튼을 클릭해야 파일을 다운로드 하는데 목록에 선택되 있는 파일만 다운로드 받는다.

전체를 선택/취소 하거나 몇가지만 선택하여 선택적으로 다운 받을 수도 있다. 영역선택/해제 버튼이

사용자가 선택한 목록을 반전 하게 하는 버튼이니 이용해주면 된다.

 

사용법을 다시 정리하면 다음과 같다.

 

1)사이트또는 블로그 주소를 사이트 경로에 적는다.

2)다운로드 받을 경로를 등록하거나 [폴더변경]버튼을 클릭하여 경로를 변경한다.(D:/Down폴더가 있다면 그냥둬도 돼지만)

3)다운로드 받을 파일명의 일부를 파일필터링에 적는다.(꼭 적을 필요는 없다. 그러나 안적으면 다운받기 쉽지 않을 것이다.)

4)다운받을 파일목록을 확인한다.

5)다운로드 버튼을 클릭해서 파일을 다운로드받는다.

 

 

 

 

 

 

 

몇년전에 심심해서 만든 프로그램이었는데 기능을 한번 개선해보자고 하던 것을 오늘에서야 하게됐다.

나혼자 쓸생각으로 만든거라서 크게 신경쓰지 않고 만들었는데 적은 수이기는 하지만 그래도 가끔씩 사용해주시는 분들이

있으니 이참에 버전업 해보았다.

 

2014.03.12에 v2.0으로 변경

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

프로최초공개-V1.0(2012.12.09)

 

이하는 첫버전에 대한 내용이다.(과거에 첨부됐던 실행파일은 완성도가 너무 빈약하여 삭제함)

가끔 고전게임을 포스팅하는 블로그에 방문하는데 고용량게임파일을 분할 압추하여 업로드한 파일을 일일이 다운로드 받기가 

무척 귀찮아서 한번 만들어 봤다.

 

다운받을 폴더는 말그대로 파일을 다운받을 폴더를 지정하는 것이고

다운받을 사이트 주소는 다운받을 파일이 존재하는 블로그의 정확한 주소를 입력한다.http://blog.co.kr이런식으로 입력

하는게 아니고 http://blog.co.kr/001 이런식으로 해당 게시물을 확인할 수 있는 정확한 주소를 입력한다.

다운받을 파일 갯수는 블로그에 올라와있는 분할 파일의 갯수를 입력한다. 보통 분할파일이 순번으로 지정돼있으니

파일이 몇개나 존재하는지 파악하는지 어렵지 않을 것이다.

다운받을 파일명(분할명은빼고)는 분할파일은 동일한 이름으로 순번을 매기게 되는데 예를 들어 aaa.7zip.001, aaa.7zip.002

이런식으로 돼있다. 여기에서 반복되는 숫자를 제외한 앞부분의 이름을 넣어주면 된다. 다시말해서 aaa.7zip.까지만 입력

하면된다.

다운받을  파일 타입은 블로그에 올라와있는 파일의 종류를 선택하는 것으로 7zip파일과 Rar파일을 지원한다.

첫버전이라서 복잡한 기능을 지원하지는 않고 7zip의 경우는 99개의 파일까지만 지원한다. (내가 다운받을 파일이 100개가

넘는 경우가 없었기 때문이다.) Rar의 경우는 업로드 된 파일을 모두 다운받을 수 있다. 100개이던 200개이던 문제없다.

(Alzip도 되도록 반영해야하는데 귀찮아서...)

Alzip은 아직 안된다. Alzip은 분할압축 규칙이 조금 달라서 아직 안만들었다.(내가 다운받고 싶은 파일중에는 Alzip포맷이

없어서 ㅎㅎㅎ)

 

복잡하게 만든건 아니고 다운로드를 시작하면 아마 프로그램이 랙이 걸린게 아닐까 싶을지도 모른다. 그냥 다운로드를

걸어놓고 그냥 진행되니까... 그래도 걱정하지 마시라 계속 다운로드 진행하고있는 것이고 다운로드가 완료되면

완료됐다고 메세지가 나온다.

 

.Net FrameWork 4.0으로 만들었다.(그러니까 닷넷프레임 워크가 반드시 설치돼있어야 한다는 말이다.)

 

하룻밤만에 만든 첫버전이라 버그가 많을 수 있다. 나중에 덜귀찮으면 지속 업데이트 해야지~

 

 

반응형

예를 들어 string val =  "abc,def,hij"라는 문자열을 ","로 구분해서 배열로 변경하려한다면

string[] tmp = val.Split(','); 이렇게 하면 된다. 그런데 배열 구분자가 1바이트가 아니라면?


다시 예를 들어본다면 string val =  "abc<br/>def<br/>hij" 이런형태의 문자열에서 "<br/>"을 split하려고 하면

불가능하다. 이를 split해주는 방법은 아래와같다.

string[] _tmp = System.Text.RegularExpressions.Regex.Split(val, "<br/>");


그러나... ↑ 요고로 해결이 안될경우도 있다. ㅡ,.ㅡ;;;

그래서 확실한 방법은 아래와 같다.


public static string[] SplitByString(string inVal, string split)

    {

        int offset = 0;

        int index = 0;

        int[] offsets = new int[inVal.Length + 1];

        while (index < inVal.Length)

        {

            int indexOf = inVal.IndexOf(split, index);

            if (indexOf != -1)

            {

                offsets[offset++] = indexOf;

                index = (indexOf + split.Length);

            }

            else

            {

                index = inVal.Length;

            }

        }

        string[] final = new string[offset + 1];

        if (offset == 0)

        {

            final[0] = inVal;

        }

        else

        {

            offset--;

            final[0] = inVal.Substring(0, offsets[0]);

            for (int i = 0; i < offset; i++)

            {

                final[i + 1] = inVal.Substring(offsets[i] + split.Length, offsets[i + 1] - offsets[i] - split.Length);

            }

            final[offset + 1] = inVal.Substring(offsets[offset] + split.Length);

        }

        return final;

    }


어디서 퍼왔는데 출처까먹음 ㅠㅠ

반응형

프로젝트 진행중에 Excel데이터를 생성하는 내용이 있었다.

로컬테스트 할때는 문제가 없었으나 외부접근테스트를 하게되니 바로 아래와 같은 에러가 발생했다.


80070005 액세스가 거부되었습니다. (예외가 발생한 HRESULT: 0x80070005 (E_ACCESSDENIED)) 오류로 인해 CLSID가 {00024500-0000-0000-C000-000000000046}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.


해결법을 찾기 위해 하루종일 자료를 찾다가 우연히 해결법을 찾았다.

결론부터 말하자면 Web.Config에 <identity impersonate="true" userName="YourID" password="Password"/>

을 추가해 주면 된다.


웹관련 보안설정으로 DCOM구성ㅇ에 Excel권한이 어쩌고 저쩌고 하는 방법으로 해결하라는데 잘안된다.

보안설정에 as.pnet계정을 추가해줘야하는데 어찌된 영문인지 asp.net계정을 추가할 수가 없었다.


차선책을 찾다가 겨우 찾았다. 


출처는 : http://support.microsoft.com/?id=306158#2



반응형

itextsharp.dll


itextsharp.pdfa.dll


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;


public partial class _Default : System.Web.UI.Page
{
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
 

        }
    }
 
    protected void Button1_Click(object sender, System.EventArgs e)
    {
        String htmlText = "<font  " +
         " color=\"#0000FF\"><b><i>Title One</i></b></font><font   " +
         " color=\"black\"><br><br>Some text here<br><br><br><font   " +
         " color=\"#0000FF\"><b><i>Another title here   " +
         " </i></b></font><font   " +
         " color=\"black\"><br><br>Text1<br>Text2<br><OL><LI><DIV Style='color:green'>Pham Duy Hoa</DIV></LI><LI>how are u</LI></OL><br/>"+
         "<table border='1'><tr><td style='color:red;text-align:right;width:20%'>123456</td><td style='color:green;width:60%'>78910</td><td style='color:red;width:20%'>ASFAFA</td></tr><tr><td style='color:red;text-align:right'>123456</td><td style='color:green;width:60%'>78910</td><td style='color:red;width:20%'>DAFSDGAFW</td></tr></table><br/>"+
         "<div><ol><li>123456</li><li>123456</li><li>123456</li><li>123456</li></ol></div>";
 

 
        HTMLToPdf(htmlText, "PDFfile.pdf");
    }
 
    public void HTMLToPdf(string HTML, string FilePath)
    {
        Document document = new Document();
 
        PdfWriter.GetInstance(document, new FileStream(Request.PhysicalApplicationPath + "\\Chap0101.pdf", FileMode.Create));
        document.Open();
        Image pdfImage = Image.GetInstance(Server.MapPath("logo.png"));
 
        pdfImage.ScaleToFit(100, 50);
 
        pdfImage.Alignment = iTextSharp.text.Image.UNDERLYING; pdfImage.SetAbsolutePosition(180, 760);
 
        document.Add(pdfImage);
        iTextSharp.text.html.simpleparser.StyleSheet styles = new iTextSharp.text.html.simpleparser.StyleSheet();
        iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
        hw.Parse(new StringReader(HTML));
        document.Close();
        ShowPdf("Chap0101.pdf");
    }
    private void ShowPdf(string s)
    {
        Response.ClearContent();
        Response.ClearHeaders();
        Response.AddHeader("Content-Disposition", "inline;filename=" + s);
        Response.ContentType = "application/pdf";
        Response.WriteFile(s);
        Response.Flush();
        Response.Clear();
    }
}

출처 : http://www.codeproject.com/Questions/203481/HTML-convert-to-PDF-using-itextsharp

html 내용을 pdf로 변환해야하는 상황이 생겼다.

iTextSharp가 탁월한 해결법이 되었다.

첨부된 두 dll파일을 참조해서 예제를 실행하면 된다.

참고로 이소스가 필요했던 이유는 그래프와 html table셑을 하나의 결과물로 받아보기를 원하는 고객의 요구에 부응하기 

위해서 였다. mschart를 써서 그래프를 그린후 이미지파일로 저장하고 이를 다시 PDF문서에 그래프 + <table></table>구조로

파싱하는 구조다. 이거 알아내는데 하루가 꼬박 걸렸다.

+ Recent posts